ELK Stack基础教程(1)ElasticSearch基本概念与安装配置

Tanglu Other 2022-10-18 16319 0

一、ELK STACK介绍

ELK Stack是Elasticserach、Logstash、Kibana三种工具组合而成的一个技术栈。通过ELK可以安全可靠地获取任何来源、任何格式的数据,然后实时对海量日志数据进行搜索定位、过滤分析以及可视化。ELK STACK主要组件和作用如下:

Elasticsearch:简称ES,是一款基于Lucene的高扩展性分布式全文搜索引擎,是整个ELK STACK的核心。通过RESTful API(一种接口设计规范,让接口更易懂)将Lucene原本的复杂性做了隐藏。ES支持对数据进行分布式、实时分析,并且可以进行搜索补全、关键词高亮、自动纠错、分词搜索等功能。相比使用SQL语句在数据库中进行查询,ES通过倒排索引和分词功能快速对数据页进行定位,然后再用正排索引通过数据页进行查找,搜索速度更快,就算是TB、PB级别的数据也可以快速搜索。正排索引是通过主键ID关联文件内容后去找关键词。而倒排索引则是通过关键词找主键ID的反向操作。比如查看一本书里linux一词在哪些页面出现过,倒排索引就是直接拿着这个词和页面进行比对,而正排索引需要通过目录查找每一页然后再去扫描关键词

Logstash:实现数据采集和分析工作,但是现阶段通常使用它做数据分析和过滤工作,采集工作交由filebeat完成

Kibana:对数据进行聚合统计与图形化的展示


二、ElasticSearch名词解释

· 节点(node):站在用户的角度,ES并没有主从节点概念,对用户来说每个节点都可以响应请求。但是对于集群来说会通过一个主节点来管理每个节点的状态、决定分片(Shared)的分布方式以及周期性检查其他节点是否可用并进行修复。各节点是通过集群名称来判断是否属于同一节点

· 索引(index):存放ES数据的集合,类似MySQL中的库、Index里的Types相当于表、Documents则是表中的行,从ES6开始一个Index下只能包含一个Type,从ES 7.X开始Type的概念已经被删除了

· 分片(shared):Elasticsearch 7以前在创建索引时如果没有指定分片数量(number_of_shards),默认会分为5个分片和一个副本(number_of_replicas),这些分片会依据内部算法划分到不同的节点中去。从ES7以后默认分片数修改为了1个。分片可以带来并行执行的好处,能提高效率。文档数据是根据HASH算法存储到分片,由于算法中涉及到了分片的数量,所以分片创建好以后不可修改,否则HASH值就变了。每一个分片都是一个独立完整的索引,分布在不同的节点上。如果发现有分片没有被分配到节点上,可以看下是否磁盘没有空间。如果节点数>分片数并不能起到优化作用,所以在初期就要规划好分片数

· 副本(Replication):副本的存在是为了提高数据的安全性,副本数量通常设置为集群节点数-1,有了副本的存在就能保证不会因为某个节点的故障而丢失数据,当有节点发生故障时,会从副本中选取一个分片提升为主分片。在使用head或cerebro插件查看集群状态时,如果是虚线边框就代表是副本分片,实线边框是主分片


三、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堆栈参数配置,主要调整最大内存和最小内存的设置即可。通常设置为一样大小,具体的值可以设置为系统最大内存的一半或三分之二,但不要超过32G,并且预留一半内存给系统。为了保证性能,内存和数据量有一个建议比例,搜索类项目建议比例为1G内存:16G数据,日志类项目为1G: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

vi /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"]          #种子节点的地址,新节点加入集群时会与这些种子节点通信
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目录所有者修改为其他用户,并切换到该用户去执行。用浏览器打开能看到如下信息代表安装成功:

elk2.png

· 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

评论