1. 准备3台虚拟机

192.168.152.128 、192.168.152.129、192.168.152.130

2. 在3台虚拟机里面都java环境

安装java环境(java环境必须是1.8版本以上的)

  1. yum -y install java-1.8.0-openjdk

验证java安装成功

  1. java -version

java version “1.8.0_131” Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

3. 在3台虚拟机里面都安装好elasticsearch

  1. [root@master ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.2.0.tar.gz
  2. [root@master ~]# tar zxvf elasticsearch-7.2.0.tar.gz
  3. [root@master ~]# mv elasticsearch-7.2.0 /usr/local/elasticsearch
  4. [root@master ~]# cd /usr/local/elasticsearch/config
  5. # 备份elasticsearch默认配置文件,以防修改出错
  6. [root@master ~]# cp elasticsearch.yml elasticsearch.yml.bak
  7. # 修改配置文件
  8. [root@master ~]# cat /usr/local/elasticsearch/config/elasticsearch.yml | grep -v "^$" |grep -v "^#"
  9. # 集群名
  10. cluster.name: situ_elk
  11. # 节点名称
  12. node.name: node-1
  13. http.cors.enabled: true
  14. http.cors.allow-origin: "*"
  15. http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
  16. # 存储数据地址
  17. path.data: /usr/local/elasticsearch/data
  18. # 存储日志地址
  19. path.logs: /usr/local/elasticseshanarch/logs
  20. # 当内存不足时,是否使用交换分区空间(暂时没开,需要打开交换分区)
  21. #bootstrap.memory_lock: true
  22. # IP访问限制可以限定具体的IP访问服务器,这有一定的安全过滤作用
  23. network.host: 192.168.152.128
  24. http.port: 9200
  25. # 集群地址IP,主节点会去发现129,130的机器
  26. discovery.zen.ping.unicast.hosts: [ "192.168.152.129:9300","192.168.152.130:9300" ]
  27. # 规定初始主节点
  28. cluster.initial_master_nodes: ["192.168.3.128"]
  29. #如果启用了集群模式,那么以下参数至关重要。
  30. #主要是为了方式脑裂现象的发生,且必须有一半以上的节点处于可用状态,否则将导致服务崩溃。
  31. #该数值建议的计算公式为:(master_eligible_nodes / 2) + 1
  32. #discovery.zen.minimum_master_nodes: 2 #集群节点个数(未指定)
  33. # x-pack认证模块
  34. xpack.security.enabled: true
  35. xpack.security.transport.ssl.enabled: true
  36. xpack.security.transport.ssl.verification_mode: certificate
  37. xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
  38. xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

说明:记得修改安装了ES的3台虚拟机(三个节点)的相同配置,要不然节点之间无法建立连接工作,也会报错。

选举ES主节点的逻辑:
选举的大概逻辑,它会根据分片的数据的前后新鲜程度来作为选举的一个重要逻辑。(日志、数据、时间都会作为集群master全局的重要指标)
因为考虑到数据一致性问题,当然是用最新的数据节点作为master,然后进行新数据的复制和刷新其他node。

4. 准备启动服务

  1. # 添加elk用户,elasticsearch必须使用普通用户运行
  2. [root@master ~]# useradd elk
  3. [root@master ~]# chown -R elk:elk /usr/local/elasticsearch
  4. # 当消耗完交换分区这么大空间后才会产生oom
  5. [root@master ~]# vim /etc/sysctl.conf
  6. vm.max_map_count = 655360
  7. [root@master ~]# sysctl -p /etc/sysctl.conf
  8. # 系统的打开文件数:
  9. [root@master ~]# vim /etc/security/limits.conf
  10. * soft nofile 65536
  11. * hard nofile 65536
  12. * soft nproc 65536
  13. * hard nproc 65536
  14. [root@master ~]# su - elk
  15. [elasticsearch@master ~]# cd /usr/local/elasticsearch
  16. [elasticsearch@master ~]# nohup bin/elasticsearch &
  17. # 1. 要是提示,报一些没有启动的目录,直接创建即可。
  18. # 2. 但是想写入日志和数据必须是普通用户有写入权限logs,data。
  19. # 第一次启动需要一些时间,因为需要做一些初始化动作,如果没启动成功请查系elasticsearch的相关日志解决。注意上面只是前台启动调试,在后台需要加&,需要重新启动。
  20. [root@master ~]# netstat -ntplu
  21. tcp6 0 0 :::9200 :::* LISTEN 30856/java
  22. tcp6 0 0 :::9300 :::* LISTEN 30856/java
  23. [root@master ~]# curl 192.168.10.155:9200
  24. {
  25. "name" : "node-1",
  26. "cluster_name" : "my-es-cluster",
  27. "cluster_uuid" : "Zg7Pz7RESVK6ggPKH-NJZA",
  28. "version" : {
  29. "number" : "7.2.0",
  30. "build_hash" : "780f8c4",
  31. "build_date" : "2017-04-28T17:43:27.229Z",
  32. "build_snapshot" : false,
  33. "lucene_version" : "6.5.0"
  34. },
  35. "tagline" : "You Know, for Search"
  36. }

定时删除ELK30天前的日志

  1. #!/bin/bash
  2. DATE=`date -d "30 days ago" +%Y.%m.%d`
  3. curl -XGET -s -u elastic:situ1234 'http://127.0.0.1:9200/_cat/indices?v' |grep $DATE | awk -F '[ ]+' '{print $3}' >/tmp/elk.log
  4. for elk in `cat /tmp/elk.log`
  5. do
  6. curl -XDELETE -u elastic:situ1234 "http://127.0.0.1:9200/$elk"
  7. done

1、集群状态同步

cluster state是全局性信息, 包含了整个群集中所有分片的元信息(规则,位置, 大小等信息), 并保持每个每节的信息同步。
cluster state是由ES的master节点维护的(只有主节点能够改变集群状态), 当它收到data节点的状态更新变化后, 就把这些信息依次广播到其他节点。目前我们一个集群的cluster state在60M左右,当集群状态改变的时候,主节点是否会广播整体的cluster state呢?同步集群状态的时候,ES会做些额外的处理:

  • 只有变化的cluster state信息才会被广播
  • 在cluster state传递之前或做些压缩

具体的过程如下所示:
1、主节点处理一个改变的集群状态,并将改变的状态publish给所有的其他节点。
2、其他节点收到主节点publish的message,向主节点确认收到信息(acknowledge。 it),但不将改变同步到本地的集群状态(not applay it)
3、如果主节点在配置的时间(discovery.zen.commit_timeout 默认30s)没有收到指定个数节点(discovery.zen.minimum_master_nodes)的确认信息,那么该改变的状态就会被rejected。
4、如果主节点在指定的时间内收到了指定个数节点的确认信息,则会提交(commit)该状态的改变,并向其他的节点发送该改变。
5、其他的节点收到信息后,则应用该改变到本地的集群状态中,应用后向主节点发送应用成功信息。
6、主节点等待所有节点的发送的应用成功消息,直到超时(discovery.zen.publish_timeout 默认30s)。

2、节点加入与离开

2.1、节点加入

当一个新节点加入的时候,它通过discovery.zen.ping.unicast.hosts配置的节点获取集群状态,然后找到master节点,并向其发送一个join request(discovery.zen.join_timeout)。主节点接收到reqest后,同步集群状态到新节点。

2.2、非主节点节点离开

当一个节点出现3次ping不通的情况时(ping_interval 默认为1s;ping_timeout 默认为30s),主节点会认为该节点已宕机,将该节点踢出集群。

2.3、主节点离开

当主节点发生故障时,集群中的其他节点将会ping当前的master eligible 节点,并从中选出一个新的主节点。
节点可以通过设置node.master为false来阻止自己变为一个主节点。
通过配置discovery.zen.minimum_master_nodes防止集群出现split brain。该配置通过检查集群中master eligible的个数来判断是否选举出一个主节点。其个数最好设置为(number_master eligible/2)+1,防止当主节点出问题时,一个集群分裂为两个集群。
具有最小编号的active master eligible node将会被选举为master节点

3、分片副本同步

elasticsearch 使用 Allocation IDs 的概念,这是区分不同分片的唯一标识(UUIDS)。
Allocation IDs存储在 shard 级元信息中,每个 shard 都有自己的Allocation ID,同时集群级元信息中记录了一个被认为是最新shard 的Allocation ID集合,这个集合称为 in-sync allocation IDs。
如果由于网络或者其他原因,主副shard没有同步,那么副本的shard会将被从in-sync allocation IDs踢出。
举个例子:
个小型集群:一个主节点,两个数据节点。为了保持简单的例子,我们创建只有1个主分片和1个副分片的索引,最初,一个数据节点拥有主分片,另一个数据节点拥有副分片。我们使用 cluster state api 来查阅集群状态中的 in-sync 分片信息,并使用 “filter_path” query 参数来过滤出感兴趣的结果: