1. 准备3台虚拟机
192.168.152.128 、192.168.152.129、192.168.152.130
2. 在3台虚拟机里面都java环境
安装java环境(java环境必须是1.8版本以上的)
yum -y install java-1.8.0-openjdk
验证java安装成功
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
[root@master ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.2.0.tar.gz
[root@master ~]# tar zxvf elasticsearch-7.2.0.tar.gz
[root@master ~]# mv elasticsearch-7.2.0 /usr/local/elasticsearch
[root@master ~]# cd /usr/local/elasticsearch/config
# 备份elasticsearch默认配置文件,以防修改出错
[root@master ~]# cp elasticsearch.yml elasticsearch.yml.bak
# 修改配置文件
[root@master ~]# cat /usr/local/elasticsearch/config/elasticsearch.yml | grep -v "^$" |grep -v "^#"
# 集群名
cluster.name: situ_elk
# 节点名称
node.name: node-1
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
# 存储数据地址
path.data: /usr/local/elasticsearch/data
# 存储日志地址
path.logs: /usr/local/elasticseshanarch/logs
# 当内存不足时,是否使用交换分区空间(暂时没开,需要打开交换分区)
#bootstrap.memory_lock: true
# IP访问限制可以限定具体的IP访问服务器,这有一定的安全过滤作用
network.host: 192.168.152.128
http.port: 9200
# 集群地址IP,主节点会去发现129,130的机器
discovery.zen.ping.unicast.hosts: [ "192.168.152.129:9300","192.168.152.130:9300" ]
# 规定初始主节点
cluster.initial_master_nodes: ["192.168.3.128"]
#如果启用了集群模式,那么以下参数至关重要。
#主要是为了方式脑裂现象的发生,且必须有一半以上的节点处于可用状态,否则将导致服务崩溃。
#该数值建议的计算公式为:(master_eligible_nodes / 2) + 1
#discovery.zen.minimum_master_nodes: 2 #集群节点个数(未指定)
# x-pack认证模块
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
说明:记得修改安装了ES的3台虚拟机(三个节点)的相同配置,要不然节点之间无法建立连接工作,也会报错。
选举ES主节点的逻辑:
选举的大概逻辑,它会根据分片的数据的前后新鲜程度来作为选举的一个重要逻辑。(日志、数据、时间都会作为集群master全局的重要指标)
因为考虑到数据一致性问题,当然是用最新的数据节点作为master,然后进行新数据的复制和刷新其他node。
4. 准备启动服务
# 添加elk用户,elasticsearch必须使用普通用户运行
[root@master ~]# useradd elk
[root@master ~]# chown -R elk:elk /usr/local/elasticsearch
# 当消耗完交换分区这么大空间后才会产生oom
[root@master ~]# vim /etc/sysctl.conf
vm.max_map_count = 655360
[root@master ~]# sysctl -p /etc/sysctl.conf
# 系统的打开文件数:
[root@master ~]# vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
[root@master ~]# su - elk
[elasticsearch@master ~]# cd /usr/local/elasticsearch
[elasticsearch@master ~]# nohup bin/elasticsearch &
# 1. 要是提示,报一些没有启动的目录,直接创建即可。
# 2. 但是想写入日志和数据必须是普通用户有写入权限logs,data。
# 第一次启动需要一些时间,因为需要做一些初始化动作,如果没启动成功请查系elasticsearch的相关日志解决。注意上面只是前台启动调试,在后台需要加&,需要重新启动。
[root@master ~]# netstat -ntplu
tcp6 0 0 :::9200 :::* LISTEN 30856/java
tcp6 0 0 :::9300 :::* LISTEN 30856/java
[root@master ~]# curl 192.168.10.155:9200
{
"name" : "node-1",
"cluster_name" : "my-es-cluster",
"cluster_uuid" : "Zg7Pz7RESVK6ggPKH-NJZA",
"version" : {
"number" : "7.2.0",
"build_hash" : "780f8c4",
"build_date" : "2017-04-28T17:43:27.229Z",
"build_snapshot" : false,
"lucene_version" : "6.5.0"
},
"tagline" : "You Know, for Search"
}
定时删除ELK30天前的日志
#!/bin/bash
DATE=`date -d "30 days ago" +%Y.%m.%d`
curl -XGET -s -u elastic:situ1234 'http://127.0.0.1:9200/_cat/indices?v' |grep $DATE | awk -F '[ ]+' '{print $3}' >/tmp/elk.log
for elk in `cat /tmp/elk.log`
do
curl -XDELETE -u elastic:situ1234 "http://127.0.0.1:9200/$elk"
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 参数来过滤出感兴趣的结果: