前因
最近公司有一套ES集群主机需要下线扩容到新集群,我们在将旧集群节点上的分片exclude掉时,发现相关节点上的分片并未被exclude掉:集群配置如图展示:
后果
如图一所示,集群其它参数配置并未与exclude参数起冲突,正常情况下exclude掉的节点不应该有分片分布,实际情况是相关节点依然分布着分片,于是在进一步的排查中我们发现基于索引级的分片分布有配置index.routing.allocation.require参数,如图二所示:
index.routing.allocation.require参数解释:表示索引分片必须要分配在具有指定属性值的节点上。
在图二里我们可以看到,index.routing.allocation.require参数配置索引分片必须分配在具有属性box_type值为clod的节点上,而我们在对相关节点分片进行exclude时,相关节点属性box_type值具有clod,因此require与exclude参数起到冲突,且require参数优先级大于exclude参数,所以在对相关节点分片进行exclude时失效,后续我们取消掉相关索引的require参数配置,分片得以正常排除。
PUT index/_settings
{
"routing": {
"allocation": {
"require": {
"box_type": null
},
"total_shards_per_node": null
}
}
}