Elasticsearch通過雜湊映射將文檔均勻地路由到分區中,同時shard均勻地分散在各個資料節點中,這樣可能會出現某些節點儲存的熱點資料較多,導致這些節點的負載較高的情況。針對這種情況,可採用重啟叢集或手動遷移shard的方式,重新分配shard,臨時降低高負載節點的壓力。本文介紹如何手動遷移shard。
問題情境
- 負載高的節點中存在大量的同一屬性分區,例如僅存在主分區。
- 業務索引在負載高的節點儲存的shard比其他節點多。
注意事項
- 手動遷移shard,僅能臨時解決節點壓力較高的問題。如果節點短暫地脫離叢集,shard重新分配,這些節點可能還會出現同樣的問題。因此建議在遷移shard前,參見叢集負載不均問題的分析方法及解決方案,最佳化shard後再遷移。
- 如果熱點索引分配均衡,而叢集整體壓力較大,建議升配叢集或擴容節點,解決資源緊張的問題。
解決方案
- 禁用分區分配。
PUT /_cluster/settings { "transient" : { "cluster.routing.allocation.enable" : "none" } }
重要 以上命令僅臨時禁用了分區分配,shard遷移完成後,需要重新啟用(將cluster.routing.allocation.enable設定為all)。 - 手動遷移shard。以下樣本將index_parkingorder_v1索引,從192.168.130.77節點上的3號分區遷移到192.168.130.78節點上。
POST /_cluster/reroute { "commands" : [ { "move" : { "index" : "index_parkingorder_v1", "shard" : 3, "from_node" : "192.168.130.77", "to_node" : "192.168.130.78" } } ] }
說明- 遷移shard時,請確保同一序號的shard不能遷移到同一節點。例如,A節點中已經存在某一索引的3號副本分區,那麼該索引的3號主分區就不能遷移到A節點中。
- 手動遷移shard更詳細的說明,請參見cluster-reroute。
- 查看shard遷移狀態。
GET _cat/shards?v
正常情況下,返回結果如下。 - shard遷移完成後,重新啟用分區分配。
PUT /_cluster/settings { "transient" : { "cluster.routing.allocation.enable" : "all" } }