最近把公司的 Elasticsearch Cluster 加了一台 Cluster Node,準備應戰更大量的 Data Query,但是加完之後發現 Index shard 沒有很平均的分散在新的 Cluster Node … :(
原本我的 Elasticsearch Cluster 有 2 台,加到第 3 台後開始不平均 …
在同事強力的協助下發現如果要新增移除 Cluster Node 都必須調整 Index Shard Allocation,詳細可以參考 elastic 官方「Cluster level shard allocation」文件
主要影響的參數有
- cluster.routing.allocation.balance.shard 每個節點分配 shard 的權重,預設為 0.45f
- cluster.routing.allocation.balance.index 每個節點分配 index 的權重,預設為 0.55f
- cluster.routing.allocation.balance.threshold 分配優化值,數字越大越不平均,預設 1.0f
預設的 index、shard 權重大概就僅適合 2 台 Cluster 分配,所以當第三台出現的時候就開始不平均了,可以透過設定 elasticsearch.yml 用 API 來讓 index / shard balance。
以 3 台來說,每台平均分配大約就是 0.3
curl -XPUT -H 'Content-Type: application/json' http://127.0.0.1:9200/_cluster/settings -d '{
"transient" : {
"cluster.routing.allocation.balance.shard" : 0.33,
"cluster.routing.allocation.balance.index" : 0.33,
"cluster.routing.allocation.balance.threshold" : 1.0}}'
或是寫在 elasticsearch.yml
cluster:
routing:
allocation
balance
shard: 0.33
index: 0.33
threshold: 1.0