在對集群進行擴容或者替換節(jié)點的時候穴肘,不可避免會有移動分片的操作,可以使用如下的語句進行操作,首先要關(guān)閉自動reshard
cluster.routing.allocation.disable_allocation = false
然后可以使用move秆吵、cancel以及allocate進行分片的移動虎囚、取消分配以及重新分配沒有分配的shard到指定節(jié)點角塑。
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插件淘讥,對以上操作進行可視化操作圃伶,更直觀容易。
但是以上方式蒲列,對于分片很少的情況下是適用的窒朋,如果需要轉(zhuǎn)移的節(jié)點很多就有些太過于麻煩了。
當(dāng)然ES默認(rèn)是開啟自動reshard功能的蝗岖,也就是說設(shè)置
cluster.routing.allocation.disable_allocation = true
ES會按照同node不能存相同shard侥猩、shard分片分配平均等因素進行重新平衡。如果我們是進行擴容抵赢,那么把擴容的節(jié)點加進來欺劳,然后開啟自動reshard功能,我們就可以坐等平衡結(jié)束了铅鲤。
但是如果我們是想要替換掉部分節(jié)點划提,那么如果按照以上操作,會將所有的節(jié)點在所有的節(jié)點上進行平衡邢享,那么我們要下掉的節(jié)點也會平均分布著分片數(shù)據(jù)鹏往。待平衡后,我們想要下掉某個節(jié)點骇塘,還是需要轉(zhuǎn)移走這部分分片伊履,而且原來的處理方式是手工的。款违。唐瀑。很明顯,這種方式太原始奠货,而且浪費了之前平衡花費的時間和流量介褥。那么有沒有什么配置,讓ES平衡節(jié)點的時候不向上面分配分片,或者更進一步直接將原有分片“趕出去”呢柔滔?
可以嘗試使用下面的命令
curl -XPUT 'localhost:9200/_cluster/settings' -d
'{
"transient": {
"cluster.routing.allocation.exclude._ip": "192.168.0.1,192.168.0.2"
}
}'
讓ES不再向這兩個ip的node進行分片分配溢陪。這個配置還可以使用_name以及_host等【龋可以參考官方文檔:
https://www.elastic.co/guide/en/elasticsearch/reference/current/allocation-filtering.html