背景
es虚拟机集群es-mini集群,一共有20个节点,目前需要缩容2台,两台节点分别为:192.168.0.20(data节点),192.168.0.3(master/data节点)。
本文有几个不同。我们es安装在es用户下,安装目录在/home/es/software,其中es设置了软连接,在elasticsearch下,配置文件单独存放在/home/es/software/configs/es-mini目录下。启动脚本是自己写的es-daemon.sh,所以stop和start和开源有所不同。
目录
背景
规划方案
1 批处理修改es相关配置(配置不在一一介绍了)
1.1 准备一个脚本
1.2 上传脚本changeSetting.sh 到每个节点tmp目录下
1.3 备份原来的配置文件elasticsearch.yml
1.4 执行脚本,修改配置
2 在kibana上依次排空data节点的数据,滚动重启es服务
2.1 排空前先检查是否存在close索引
2.2 排空数据,重启es服务
2.2.1 排空数据
2.2.2 检查索引数据迁移状态(RELOCATING表示正在迁移)
2.2.3 数据迁移完毕后,重启es服务
2.2.4 如果觉得迁移速度太慢,可以使用以下方法加快排空数据的速度
3 排空三个master节点,和新master节点192.168.0.4的数据,滚动重启master
3.1 排空数据
3.2 去掉192.168.0.3节点的master角色,重启
3.3 192.168.0.4节点修改为master角色,重启
3.4 重启最后两个master节点
3.4.1 先重启非active master节点
3.4.2 再重启active master节点
4 通过查看服务的启动时间,验证所有节点服务是否重启成功(主要找出是否有漏重启的节点)
5 最后停下线节点的服务
5.1 先排空192.168.0.3和192.168.0.20节点数据
5.2 停192.168.0.3和192.168.0.20节点的es服务,下线
6 将排空操作恢复原来的配置
7 验证缩容后节点服务是否正确
8 结束
规划方案
计划将192.168.0.4节点改为master,替换192.168.0.3。然后下线192.168.0.3和192.168.0.20节点。
es-mini集群角色清单列表
IP | 角色 | 缩容计划 | 缩容后角色 |
192.168.0.1 | master/data | master/data | |
192.168.0.2 | master/data | master/data | |
192.168.0.3 | master/data | 缩容下线节点 | 下线 |
192.168.0.4 | data | 用于替换192.168.0.3的master角色 | master/data |
192.168.0.5 | data | data | |
192.168.0.6 | data | data | |
192.168.0.7 | data | data | |
192.168.0.8 | data | data | |
192.168.0.9 | data | data | |
192.168.0.10 | data | data | |
192.168.0.11 | data | data | |
192.168.0.12 | data | data | |
192.168.0.13 | data | data | |
192.168.0.14 | data | data | |
192.168.0.15 | data | data | |
192.168.0.16 | data | data | |
192.168.0.17 | data | data | |
192.168.0.18 | data | data | |
192.168.0.19 | data | data | |
192.168.0.20 | data | 缩容下线节点 | 下线 |
注:因为生产环境都是在堡垒机执行的,所以下面的Linux命令都是批处理,执行命令仅供参考。再次需要准备一个文件ip20放在堡垒机,将集群所有ip列表放在ip20文件中。
1 批处理修改es相关配置(配置不在一一介绍了)
1.1 准备一个脚本
$ cat changeSetting.sh
#/bin/sh
config_name="/home/es/software/configs/es-mini"
p1='"192.168.0.1","192.168.0.2","192.168.0.3"'
p2='"192.168.0.1","192.168.0.2","192.168.0.4"'
cd ${config_name}; sed -i "s/gateway.expected_nodes: 20/gateway.expected_nodes: 18/g" elasticsearch.yml
cd ${config_name}; sed -i "s/gateway.expected_data_nodes: 20/gateway.expected_data_nodes: 18/g" elasticsearch.yml
cd ${config_name}; sed -i "s/gateway.recover_after_nodes: 18/gateway.recover_after_nodes: 16/g" elasticsearch.yml
cd ${config_name}; sed -i "s/gateway.recover_after_data_nodes: 18/gateway.recover_after_data_nodes: 16/g" elasticsearch.yml
cd ${config_name}; sed -i "s/${p1}/${p2}/g" elasticsearch.yml
cd ${config_name}; grep -E 'discovery.zen.ping.unicast.hosts|gateway.expected_nodes|gateway.expected_data_nodes|gateway.recover_after_nodes|gateway.recover_after_data_nodes' elasticsearch.yml
1.2 上传脚本changeSetting.sh 到每个节点tmp目录下
for i in `cat ip20`;do echo "#####$i#####";scp changeSetting.sh $i:/tmp;done
1.3 备份原来的配置文件elasticsearch.yml
for i in `cat ip20`;do echo "#####$i#####";ssh $i -C "su - es -c 'cd /home/es/software/configs/es-mini;cp elasticsearch.yml elasticsearch.yml_bak'";done
1.4 执行脚本,修改配置
for i in `cat ip20`;do echo "#####$i#####";ssh $i -C "sh /tmp/changeSetting.sh";done
2 在kibana上依次排空data节点的数据,滚动重启es服务
(192.168.0.4节点放在最后重启,因为需要和192.168.0.4节点切割交换master角色)
2.1 排空前先检查是否存在close索引
注:在实际生产操作中,close状态的索引是无法被迁移,所以在我们缩容完毕之后,这一类索引数据出现了丢失,无法恢复。建议大家缩容前都检查一下这一类索引,所有打开或者删除的需要在排空数据之前操作,不然会在缩容中出现数据丢失。
get /_cat/indices?v&s=store.size:asc
2.2 排空数据,重启es服务
此处只以192.168.0.5节点的操作为例,后面依次从192.168.0.6到192.168.0.20,重复这一步操作。(滚动重启是为了避免给业务造成影响,如果业务可以在一定时间段不使用也可以采用全停全启的操作。)
2.2.1 排空数据
PUT /_cluster/settings
{
"persistent" :{
"cluster.routing.allocation.exclude._ip" : "192.168.0.5"
},
"transient" :{
"cluster.routing.allocation.exclude._ip" : "192.168.0.5"
}
}
2.2.2 检查索引数据迁移状态(RELOCATING表示正在迁移)
get /_cat/shards?v&pretty&s=state:desc
2.2.3 数据迁移完毕后,重启es服务
ssh 192.168.0.5 -C 'su - es -c "cd /home/es/software/elasticsearch/bin;sh es-daemon.sh stop es-mini"'
ssh 192.168.0.5 -C 'su - es -c "cd /home/es/software/elasticsearch/bin;sh es-daemon.sh start es-mini"'
循环以上步骤,直至data节点重启完毕。
2.2.4 如果觉得迁移速度太慢,可以使用以下方法加快排空数据的速度
调整传输速度,线程数:
PUT /_cluster/settings //每秒传输速度,默认40Mb
{
"persistent" :{
"indices.recovery.max_bytes_per_sec" : "200mb"
},
"transient" :{
"indices.recovery.max_bytes_per_sec" : "200mb"
}
}
PUT /_cluster/settings //恢复线程数,默认是2
{
"persistent": {
"cluster.routing.allocation.node_concurrent_recoveries": "5"
},
"transient": {
"cluster.routing.allocation.node_concurrent_recoveries": "5"
}
}
PUT /_cluster/settings 恢复线程数,默认是4
{
"persistent": {
"cluster.routing.allocation.node_initial_primaries_recoveries": "5"
},
"transient": {
"cluster.routing.allocation.node_initial_primaries_recoveries": "5"
}
}
3 排空三个master节点,和新master节点192.168.0.4的数据,滚动重启master
3.1 排空数据
PUT /_cluster/settings
{
"persistent" :{
"cluster.routing.allocation.exclude._ip" : "192.168.0.1,192.168.0.2,192.168.0.3,192.168.0.4"
},
"transient" :{
"cluster.routing.allocation.exclude._ip" : "192.168.0.1,192.168.0.2,192.168.0.3,192.168.0.4"
}
}
3.2 去掉192.168.0.3节点的master角色,重启
ssh 192.168.0.3 -C 'cd /home/es/software/configs/es-mini;sed -i "s/node.master: true/node.master: false/g" elasticsearch.yml'
ssh 192.168.0.3 -C 'su - es -c "cd /home/es/software/elasticsearch/bin;sh es-daemon.sh stop es-mini"'
ssh 192.168.0.3 -C 'su - es -c "cd /home/es/software/elasticsearch/bin;sh es-daemon.sh start es-mini"'
3.3 192.168.0.4节点修改为master角色,重启
ssh 192.168.0.4 -C 'cd /home/es/software/configs/es-mini;sed -i "s/node.master: false/node.master: true/g" elasticsearch.yml'
ssh 192.168.0.4 -C 'su - es -c "cd /home/es/software/elasticsearch/bin;sh es-daemon.sh stop es-mini"'
ssh 192.168.0.4 -C 'su - es -c "cd /home/es/software/elasticsearch/bin;sh es-daemon.sh start es-mini"'
3.4 重启最后两个master节点
注意:192.168.0.1节点此时是active master节点,一定要通知业务在重启。(active master重启,集群需要重新选举active,大概过程是1分钟左右,选举的过程中集群不可用。对集群特别敏感的业务要特别注意。)
3.4.1 先重启非active master节点
ssh 192.168.0.2 -C 'su - es -c "cd /home/es/software/elasticsearch/bin;sh es-daemon.sh stop es-mini"'
ssh 192.168.0.2 -C 'su - es -c "cd /home/es/software/elasticsearch/bin;sh es-daemon.sh start es-mini"'
3.4.2 再重启active master节点
ssh 192.168.0.1 -C 'su - es -c "cd /home/es/software/elasticsearch/bin;sh es-daemon.sh stop es-mini"'
ssh 192.168.0.1 -C 'su - es -c "cd /home/es/software/elasticsearch/bin;sh es-daemon.sh start es-mini"'
4 通过查看服务的启动时间,验证所有节点服务是否重启成功(主要找出是否有漏重启的节点)
for i in `cat ip20`;do echo "#####$i#####";ssh $i -C "su - es -c 'jps|grep -v Jps'|awk '{print \$1}'|xargs ps -o lstart";done
5 最后停下线节点的服务
5.1 先排空192.168.0.3和192.168.0.20节点数据
PUT /_cluster/settings
{
"persistent" :{
"cluster.routing.allocation.exclude._ip" : "192.168.0.1,192.168.0.2,192.168.0.3,192.168.0.4"
},
"transient" :{
"cluster.routing.allocation.exclude._ip" : "192.168.0.1,192.168.0.2,192.168.0.3,192.168.0.4"
}
}
5.2 停192.168.0.3和192.168.0.20节点的es服务,下线
ssh 192.168.0.3 -C 'su - es -c "cd /home/es/software/elasticsearch/bin;sh es-daemon.sh stop es-mini"'
ssh 192.168.0.20 -C 'su - es -c "cd /home/es/software/elasticsearch/bin;sh es-daemon.sh stop es-mini"'
6 将排空操作恢复原来的配置
PUT /_cluster/settings
{
"persistent" :{
"cluster.routing.allocation.exclude._ip" : ""
},
"transient" :{
"cluster.routing.allocation.exclude._ip" : ""
}
}
验证是否执行成功
get /_cluster/settings?pretty
7 验证缩容后节点服务是否正确
curl http://192.168.0.1:9200/_cat/health?v
curl http://192.168.0.1:9200/_cat/nodes?v