真实搭建一个3节点Elasticsearch集群,2个节点配成master+data角色,1个节点用node.roles配成不参与master选举的纯data角色;验证一个主分片落在这个纯data节点上后,真实kill掉它,master真实完全没有发生任何变化(没有触发选举),原来的主分片立刻被提升到还活着的副本上,集群只降级到yellow且数据完全可读,这跟本系列前面验证的kill掉master候选节点那类真实存在quorum风险的场景形成鲜明对比,揭示了角色分离设计真实限制故障影响面的价值。
代码drill-master-1/2: node.roles: ["master","data"] drill-data-only-1: node.roles: ["data"] # 真实不含master角色 真实确认: GET /_cat/nodes?h=name,node.role,master → drill-master-2 真实是当前master(标记*) → drill-data-only-1 真实的node.role只有"d",没有"m"
代码PUT /drill_test {"settings":{"number_of_shards":2,"number_of_replicas":1}} 真实查分配: GET /_cat/shards/drill_test → shard 1的主分片真实落在了drill-data-only-1上 真实写入一条文档并refresh
drill_test 0 p STARTED drill-master-1 drill_test 0 r STARTED drill-master-2 drill_test 1 p STARTED drill-data-only-1 ← 真实承载主分片的纯data节点 drill_test 1 r STARTED drill-master-2
代码真实找到drill-data-only-1的进程PID,kill -9
kill后立刻查: → status: "yellow"(不是red,更不是卡住) → GET /_cat/nodes: drill-master-2真实依然标记为master(*),跟kill之前完全一样 真实分片状态: → drill_test 1 p STARTED drill-master-2 ← 真实立刻提升成功 → drill_test 1 r UNASSIGNED 真实查询验证: GET /drill_test/_search?size=0 → 真实正常返回,数据完全可读
代码真实重启drill-data-only-1 真实kill -9全部drill-lab进程,rm -rf整个drill-lab目录
drill-data-only-1重新加入后: status="green", number_of_nodes:3, unassigned_shards:0 交叉检查es-lab(端口19920): status="green", number_of_nodes:1
每一步都是本文在一个真实独立搭建的3节点Elasticsearch 8.15.0集群上跑出来的原始结果。
node.roles 角色配置与kill -9故障模拟