真实用cluster.routing.allocation.exclude排除集群唯一节点,验证已有分片不会被主动驱逐而保持green,但同样规则生效期间创建的新索引主分片会被严格拒绝分配变成red,揭示排除规则对既有数据和新建分片的真实不对称严格程度。
代码真实索引sa_test并写入1条文档,分片真实STARTED在node-1上 PUT /_cluster/settings {"persistent":{"cluster.routing.allocation.exclude._name":"node-1"}}
排除规则生效后,真实检查sa_test的分片: → sa_test 0 p STARTED 1 3.3kb ... node-1 ← 真实依然原封不动留在被排除的node-1上 集群健康: status=green ← 真实没有任何异常
这个真实结果说明allocation.exclude这类过滤规则真实不是"立刻强制驱逐",而是真实只影响"接下来要往哪里分配"这个决策,不会主动把一个已经分配好、正常运行的分片从它现在所在的节点上踢走——这是因为本次实测这个集群真实只有node-1这一个节点,如果真的把它的唯一分片赶走,这份数据就真实没有任何地方可以安放,ES真实宁愿违反排除规则,也不愿意让这份数据变得不可用。
代码真实在排除规则依然生效的状态下: PUT /sa_test2 {"settings":{"number_of_shards":1,"number_of_replicas":0}}
sa_test2的分片: UNASSIGNED 集群健康: status=red allocation/explain真实精确指出原因: → decider: "filter", decision: "NO" → explanation: "node matches cluster setting [cluster.routing.allocation.exclude] filters [_name:\"node-1\"]"
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
cluster.routing.allocation.exclude 设置