在對集群進行擴容或者替換節點的時候,不可避免會有移動分片的操作,可以使用如下的語句進行操作,首先要關閉自動reshard
cluster.routing.allocation.disable_allocation = false
然后可以使用move、cancel以及allocate進行分片的移動、取消分配以及重新分配沒有分配的shard到指定節點。
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"
}
}
]
}'
當然,推薦使用kopf插件,對以上操作進行可視化操作,更直觀容易。
kopf插件截圖
但是以上方式,對于分片很少的情況下是適用的,如果需要轉移的節點很多就有些太過于麻煩了。
當然ES默認是開啟自動reshard功能的,也就是說設置
cluster.routing.allocation.disable_allocation = true
ES會按照同node不能存相同shard、shard分片分配平均等因素進行重新平衡。如果我們是進行擴容,那么把擴容的節點加進來,然后開啟自動reshard功能,我們就可以坐等平衡結束了。
但是如果我們是想要替換掉部分節點,那么如果按照以上操作,會將所有的節點在所有的節點上進行平衡,那么我們要下掉的節點也會平均分布著分片數據。待平衡后,我們想要下掉某個節點,還是需要轉移走這部分分片,而且原來的處理方式是手工的。。。很明顯,這種方式太原始,而且浪費了之前平衡花費的時間和流量。那么有沒有什么配置,讓ES平衡節點的時候不向上面分配分片,或者更進一步直接將原有分片“趕出去”呢?
可以嘗試使用下面的命令
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