ELK Stack基础教程(1)ElasticSearch基本概念与安装配置
一、ELK诞生背景
ELK Stack是Elasticserach、Logstash、Kibana三种工具组合而成的一个技术栈。通过ELK STACK将所有离散的服务器日志统一收集到一个平台中,然后根据规则对日志内容进行提取和过滤,并支持图形化的展现,最终解决运维\开发人员需要在海量日志中进行快速定位或统计的痛点。
二、ELK STACK 组件介绍
1、Elasticsearch
基于Lucene的高扩展性分布式全文搜索引擎,简称ES,它是整个ELK STACK的核心。虽然ES可以做很多数据库能做到的事,但由于它没有严格的事务ACID特性,所以它并不是一个关系型数据库,适合于非严格ACID的事务场景。通ES过RESTful API(一种接口设计规范,让接口更易懂)将Lucene原本的复杂性做了隐藏。ES支持对数据进行分布式、实时分析,并且可以进行搜索补全、关键词高亮、自动纠错、分词搜索等功能。相比使用SQL语句在数据库中进行查询,ES通过倒排索引和分词功能快速对数据页进行定位,然后再用正排索引通过数据页进行查找,搜索速度更快,就算是TB、PB级别的数据也可以快速搜索。正排索引是通过主键ID关联文件内容后去找关键词。而倒排索引则是通过关键词找主键ID的反向操作。比如查看一本书里linux一词在哪些页面出现过,倒排索引就是直接拿着这个词和页面进行比对,而正排索引需要通过目录查找每一页然后再去扫描关键词。
2、Logstash
实现数据采集和分析工作,但是现阶段通常使用它做数据分析和过滤工作,采集工作交由filebeat完成
3、Kibana
对数据进行聚合统计与图形化的展示
4、ES常用术语释义
· 节点(node):对于ES客户端而言并没有主从节点的概念,每个节点都是可以响应请求的。但是对于集群来说会通过一个主节点来管理每个节点的状态、决定分片(Shared)的分布方式以及周期性检查其他节点是否可用并进行修复。各节点是通过集群名称来判断是否属于同一节点
· 索引(index):用于存放ES中的数据,类似MySQL库的概念。ES 索引中还存在Types(相当于表)和Documents(表中的每行数据都有一个Document ID),从ES6开始一个Index下只能包含一个Type,从ES 7.X开始Type的概念已经被删除了
· 分片(shared):存储到ES中的数据会依据HASH算法分到不同的节点分片中,通过并行执行提高查询性能。也正因为算法涉及分片数量,所以分片创建好以后不可修改,否则HASH值就变了。所以初期要做好规划。每一个分片都是一个独立完整的索引,分布在不同的节点上。从ES7开始,如果创建索引时没有指定分片数量(number_of_shards参数控制),默认为1个(ES7之前版本为5)。通常建议分片数量不要超过节点数量。如果发现有分片没有被分配到节点上,可以看下是否磁盘没有空间
· 副本(Replication):副本可以提高数据的安全性(就像MySQL的从库),有了副本可以保证不会因为某个节点的故障而丢失数据。副本的数量默认为1(number_of_replicas参数控制),代表有1份额外的数据(可以理解为1个从库)。副本不用设置太多,通常建议副本数量为节点数-1或者1份。在使用head或cerebro插件查看集群状态时,如果是虚线边框就代表是副本分片,实线边框是主分片
5、ES故障转移过程
当有节点发生故障时ES会将其他节点的副本分片提升为主分片,然后再按照当前主分片的分布情况创建副本分片到其他节点中,简单来说就是主分片和副本分片不会在同一个节点,否则副本就失去了意义。如果故障节点重新启动后会自动加入集群,然后集群会重新进行分片操作。
三、Elasticsearch依赖的系统配置
1、安装JDK 1.8
从ES7开始需要JDK 1.8的运行环境,关于JDK安装可以参考《【CentOS 7】安装部署JDK与Tomcat》一文
2、系统参数调优
#设置虚拟内存大小,这个是MMPFILE存储内存需要;禁用内存交换 echo "vm.max_map_count=262144" >> /etc/sysctl.conf echo "vm.swappiness=1" >> /etc/sysctl.conf sysctl -p #设置文件句柄数与线程限制,因为ES的索引会产生和调用大量文件数 echo "* soft nproc 131072" >> /etc/security/limits.conf echo "* hard nproc 131072" >> /etc/security/limits.conf echo "* soft nofile 131072" >> /etc/security/limits.conf echo "* hard nofile 131072" >> /etc/security/limits.conf #内存锁定交换 echo "* hard memlock unlimited" >> /etc/security/limits.conf echo "* soft memlock unlimited" >> /etc/security/limits.conf
四、Elasticsearch 6安装部署
1、下载ElasticSearch
通过官网 https://www.elastic.co/cn/downloads/past-releases#elasticsearch 可以选择指定版本的tar包进行下载
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.23.tar.gz
2、解压tar包后目录结构如下
· bin:启动脚本和常用工具脚本
· config:配置文件目录,该目录下除了有一个主配置文件elasticsearch.yml需要配置外,还有一个jvm.options文件用于JVM堆栈参数配置(调整最大、最小内存的设置即可)。建议给JVM分配的内存为系统最大内存的60-70%左右,但不要超过32G,如果服务器内存很充足,那么配置32G就可以了。为了保证性能,内存和数据量有一个建议比例,搜索类项目建议内存磁盘比例为1:16G,日志类项目为1:48-96G。假设存放1T数据,有3个节点,1个副本,那么每个节点存储的数据就是2T/3≈700G左右,然后预留100G空间,每个节点就需要存放800G数据,再按照这个比例就可以算出推荐内存了
-Xms1g #程序启动时占用内存的大小 -Xmx1g #程序启动后最大可占用内存的大小
· data:默认的数据存放目录
· logs:默认的日志存放目录
· jdk:可选用的jdk环境
· plugins:插件目录
3、修改ElasticSearch主配置文件elasticsearch.yml
vi /usr/local/elasticsearch-6.7.1/config/elasticsearch.yml cluster.name: test_es #集群名称,相同集群名称的节点会自动加入到该集群 node.name: node_4_1_9 #每个节点的名字,这里的4_1_9取的是IP后三段作为区分 path.data: /data/es/data #节点数据存储路径 path.logs: /data/es/logs #节点日志存储路径 node.master: true #配置节点是否能成为master。默认所有节点都是true,建议只一台配置true,其他为False node.data: true #配置该节点是否能存储数据,默认为true,推荐把主节点设置为false network.host: 10.4.1.9 #修改为节点IP,建议配置为内网地址,不建议配置0.0.0.0,避免有公网地址导致信息泄露 http.port: 9200 #ES端口 discovery.zen.ping.unicast.hosts: ["10.4.1.9", "10.4.1.27", "10.4.1.31"] #master节点列表。 discovery.zen.minimum_master_nodes:2 #配置主节点数量的最少值,少于该值的话ES集群不可用,为避免脑裂,通常配置为节点数量/2+1,比如使用了三台节点,那么配置应该为2 bootstrap.memory_lock: true #锁定物理内存,防止es使用SWAP导致IOPS变高,性能下降 #action.destructive_requires_name: true #删除索引时需要指定名称,禁止使用通配符操作
4、启动Elasticsearch
ElasticSearch默认工作在集群模式下,扩展性强,支持节点的自动发现。为了防止脑裂建立使用基数台服务器部署ES集群。在bin目录下有一个elasticsearch脚本,加上-d选项可以让服务在系统后台启动。服务启动后默认监听在9200端口,还有个9300端口用于集群间通信。如果需要重启ES的话可以使用jps显示 一下ES的PID,然后kill掉再启动,比直接用ps去查PID要方便一点。另外还有一个elasticsearch-plugin脚本用于插件管理
/usr/local/elasticsearch-6.7.1/bin/elasticsearch -d /usr/local/elasticsearch-6.7.1/bin/elasticsearch-plugin list #查看插件
五、Elasticsearch 7安装部署(ES 7默认开启了安全认证功能,在ES6中需要结合XPACK才能开启认证)
1、ES7单实例配置
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.6-linux-x86_64.tar.gz tar zxf elasticsearch-7.17.6-linux-x86_64.tar.gz cat /usr/local/elasticsearch-7.17.6//config/elasticsearch.yml cluster.name: mysql_slowlog_es #集群名称,相同集群名称的节点会自动加入到该集群 node.name: node_1_221 #每个节点的名字 path.data: /data/es/data #节点数据存储路径 path.logs: /data/es/logs #节点日志存储路径 bootstrap.memory_lock: true #锁定物理内存,防止es使用SWAP导致IOPS变高,性能下降 network.host: 172.20.1.221 #修改为节点IP,建议配置为内网地址,不建议配置0.0.0.0,避免有公网地址导致信息泄露 http.port: 9200 #ES端口 discovery.seed_hosts: ["172.20.1.221"] #节点加入集群时需要指定的种子节点地址,通常指定为节点的master地址 cluster.initial_master_nodes: ["172.20.1.221"] #集群初始化时引导节点,后续新增节点不依赖这个信息,可以注释 action.destructive_requires_name: false #删除索引时是否需要指定名称,如果开启的话则禁止使用通配符操作 #discovery.type: single-node #xpack.security.enabled: true
2、ES7加密集群配置(集群交互使用证书交互,用户访问使用用户认证)
#创建证书,一路回车即可 bin/elasticsearch-certutil ca #生成ca bin/elasticsearch-certutil cert --ca #生成证书后记得传输证书给每个节点 vi /usr/local/elasticsearch-7.6/config/elasticsearch.yml cluster.name: mysql_slowlog_es #集群名称,相同集群名称的节点会自动加入到该集群 node.name: node_1_221 #每个节点的名字 path.data: /data/es/data #节点数据存储路径 path.logs: /data/es/logs #节点日志存储路径 bootstrap.memory_lock: true #锁定物理内存,防止es使用SWAP导致IOPS变高,性能下降 network.host: 172.20.1.221 #修改为节点IP,建议配置为内网地址,不建议配置0.0.0.0,避免有公网地址导致信息泄露 http.port: 9200 #ES端口 discovery.seed_hosts: ["172.20.1.221","172.20.1.222"] #种子节点的地址,新节点加入集群时会与这些种子节点通信 cluster.initial_master_nodes: ["172.20.1.221","172.20.1.222"] #集群完成初始化时的引导节点 action.destructive_requires_name: false #删除索引时是否需要指定名称,如果开启的话则禁止使用通配符操作 node.master: true #配置节点是否能成为master。默认所有节点都是true,建议只一台配置true,其他为False node.data: true #配置该节点是否能存储数据,默认为true,推荐把主节点设置为false xpack.security.enabled: true #是否启用认证功能 xpack.monitoring.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.keystore.path: elastic-certificates.p12 #证书文件路径,注意修改证书属主为es相关用户 xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
3、启动服务
useradd elastic chown -R elastic. /usr/local/elasticsearch-7.17.6 chown -R elastic. /data/es su - elastic /usr/local/elasticsearch-7.17.6/bin/elasticsearch -d
4、配置ELK相关组件密码,启用认证功能后不管是单机还是集群都需要这个步骤
/usr/local/elasticsearch-7.17.6/bin//elasticsearch-setup-passwords interactive
5、请求ES服务验证
curl 10.4.1.10:9200/_cat/nodes?v
六、Elasticsearch常见错误解决(需要注销用户重新登录才会生效)
· don't run elasticsearch as root
解决办法:Elasticsearch是不允许使用root用户来运行的,所以需要把ElasticSearch目录所有者修改为其他用户,并切换到该用户去执行。用浏览器打开能看到如下信息代表安装成功:
· Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408, 0) failed; error='Cannot allocate memory' (errno=12):
解决办法:内存不足,升级内存
· Exception in thread "main" java.nio.file.AccessDeniedException
解决办法:运行Elasticsearch程序的用户权限不够,把Elasticsearch目录权限修改下即可
· max virtual memory areas vm.max_map_count [65530] is too low
解决办法:修改/etc/sysctl.conf,增加一行vm.max_map_count= 262144,然后执行sysctl -p生效
· max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
解决办法:修改/etc/security/limits.conf,做以下配置
* soft nproc 65536 * hard nproc 65536 * soft nofile 65536 * hard nofile 65536
· memory locking requested for elasticsearch process but memory is not locked
解决办法:修改/etc/security/limits.conf,做以下配置
* soft memlock unlimited * hard memlock unlimited
· max number of threads [3812] for user [elkuser] is too low, increase to at least [4096]
解决办法:修改/etc/security/limits.d/20-nproc.conf,做以下配置
* soft nproc 4096 * hard nproc 4096
评论