在對(duì)集群進(jìn)行擴(kuò)容或者替換節(jié)點(diǎn)的時(shí)候,不可避免會(huì)有移動(dòng)分片的操作,可以使用如下的語句進(jìn)行操作,首先要關(guān)閉自動(dòng)reshard
cluster.routing.allocation.disable_allocation = false
然后可以使用move、cancel以及allocate進(jìn)行分片的移動(dòng)、取消分配以及重新分配沒有分配的shard到指定節(jié)點(diǎn)。
curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
"commands" : [ {
"move" :
{
"index" : "test", "shard" : 0,
"from_node" : "node1", "to_node" : "node2"
}
},
"cancel" :
{
"index" : "test", "shard" : 0, "node" : "node1"
}
},
{
"allocate" : {
"index" : "test", "shard" : 1, "node" : "node3"
}
}
]
}'
當(dāng)然,推薦使用kopf插件,對(duì)以上操作進(jìn)行可視化操作,更直觀容易。

但是以上方式,對(duì)于分片很少的情況下是適用的,如果需要轉(zhuǎn)移的節(jié)點(diǎn)很多就有些太過于麻煩了。
當(dāng)然ES默認(rèn)是開啟自動(dòng)reshard功能的,也就是說設(shè)置
cluster.routing.allocation.disable_allocation = true
ES會(huì)按照同node不能存相同shard、shard分片分配平均等因素進(jìn)行重新平衡。如果我們是進(jìn)行擴(kuò)容,那么把擴(kuò)容的節(jié)點(diǎn)加進(jìn)來,然后開啟自動(dòng)reshard功能,我們就可以坐等平衡結(jié)束了。
但是如果我們是想要替換掉部分節(jié)點(diǎn),那么如果按照以上操作,會(huì)將所有的節(jié)點(diǎn)在所有的節(jié)點(diǎn)上進(jìn)行平衡,那么我們要下掉的節(jié)點(diǎn)也會(huì)平均分布著分片數(shù)據(jù)。待平衡后,我們想要下掉某個(gè)節(jié)點(diǎn),還是需要轉(zhuǎn)移走這部分分片,而且原來的處理方式是手工的。。。很明顯,這種方式太原始,而且浪費(fèi)了之前平衡花費(fèi)的時(shí)間和流量。那么有沒有什么配置,讓ES平衡節(jié)點(diǎn)的時(shí)候不向上面分配分片,或者更進(jìn)一步直接將原有分片“趕出去”呢?
可以嘗試使用下面的命令
curl -XPUT 'localhost:9200/_cluster/settings' -d
'{
"transient": {
"cluster.routing.allocation.exclude._ip": "192.168.0.1,192.168.0.2"
}
}'
讓ES不再向這兩個(gè)ip的node進(jìn)行分片分配。這個(gè)配置還可以使用_name以及_host等??梢詤⒖脊俜轿臋n:
https://www.elastic.co/guide/en/elasticsearch/reference/current/allocation-filtering.html