ES集群实际使用中,如果按照官网文档操作,在单个节点操作过程中,会出现分片重新分配的情况。本文对官网的步骤参数进行了修正,使用了transient和persistent结合的方式,不会引发分片重新分配。
1. 关闭ES集群
1.1. 禁止分片自动分布
curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
"persistent" : {
"cluster.routing.allocation.enable" : "none"
},
"transient" : {
"cluster.routing.allocation.enable" : "none"
}
}
'
1.2. 执行同步刷新
curl -X POST "localhost:9200/_flush/synced"
1.3. 关闭各节点
发送TERM信号关闭进程
kill
2. 启动ES集群
2.1. 依次启动
nohup /opt/elasticsearch/bin/elasticsearch >> /dev/null 2>&1 &
2.2. 查看集群状态是否正常(green)
通过命令或者head界面查看。
命令:
curl -XGET "http://localhost:9200/_cat/health"
curl -XGET "http://localhost:9200/_cat/nodes"
2.3. 启用分片自动分布
curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
"persistent" : {
"cluster.routing.allocation.enable" : "none"
},
"transient" : {
"cluster.routing.allocation.enable" : "all"
}
}
'
2.4. 查看集群状态和分片情况
curl -XGET "http://localhost:9200/_cat/health"
curl -XGET "http://localhost:9200/_cat/recovery"
3. 错误操作
如果集群未设置persistent的自动分配分片参数,则不要只使用persistent来关闭自动分配分片,在整个集群重启之前,不生效,会导致在单个节点关闭的情况下,分片迁移到其他节点。要同时设置transient,保证既在单个节点关闭的情况下,分片不会重新分配,也能保证集群重启后,分片不会重新分配。
curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
"persistent" : {
"cluster.routing.allocation.enable" : "none"
}
}
'
可以看到,整个集群未关闭重启的情况下,某个节点的重启日志,cluster.routing.allocation.enable并未生效:
[2020-09-07T01:21:44,679][INFO ][o.e.c.s.ClusterSettings ] [es-node-3] updating [cluster.routing.allocation.enable] from [ALL] to [all]
[2020-09-07T01:21:44,679][INFO ][o.e.c.s.ClusterSettings ] [es-node-3] updating [cluster.routing.rebalance.enable] from [ALL] to [none]
整个集群重启后,这个persistence才生效。
[2020-09-07T01:35:30,610][INFO ][o.e.c.s.ClusterSettings ] [es-node-3] updating [cluster.routing.allocation.enable] from [ALL] to [none]
5. 滚动升级或者单个节点维护
使用transient方式关闭分片自动分配即可。
curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
"persistent" : {
},
"transient" : {
"cluster.routing.allocation.enable" : "none"
}
}
'
节点重启后,分片仍会处于unsigned状态,开启分片自动分配后,unsigned的分片就会立刻在被重启的节点上生效。