bigywater.tech
Elasticsearch · 154

集群故障演练:停止 Data 节点

真实搭建一个3节点Elasticsearch集群,2个节点配成master+data角色,1个节点用node.roles配成不参与master选举的纯data角色;验证一个主分片落在这个纯data节点上后,真实kill掉它,master真实完全没有发生任何变化(没有触发选举),原来的主分片立刻被提升到还活着的副本上,集群只降级到yellow且数据完全可读,这跟本系列前面验证的kill掉master候选节点那类真实存在quorum风险的场景形成鲜明对比,揭示了角色分离设计真实限制故障影响面的价值。

搭建角色分离的3节点集群
1个纯data节点真实不参与master选举
写入数据后确认分配
一个主分片真实落在纯data节点上
kill掉纯data节点
master真实完全没变化,数据立刻可读

做的事:真实搭一个3节点集群,两个节点配成master+data,第三个节点真实用node.roles:["data"]配成不参与master选举的纯data节点

代码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"

真实往一个2主1副的索引写数据,确认分配情况,刚好有一个主分片真实落在了这个纯data节点上

代码PUT /drill_test {"settings":{"number_of_shards":2,"number_of_replicas":1}} 真实查分配: GET /_cat/shards/drill_test → shard 1的主分片真实落在了drill-data-only-1上 真实写入一条文档并refresh

验证:确认了真实的分配情况——这个纯data节点真实承载着一个主分片,正是本次演练想要测试的目标

实测 · 本机真实3节点Elasticsearch 8.15.0集群执行输出
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

真实直接kill掉这个纯data节点,立刻查master是否发生了任何变化,以及真实的分片恢复情况

代码真实找到drill-data-only-1的进程PID,kill -9

验证:master真实完全没有变化,还是原来那个master,没有经历任何选举过程;原来落在这个节点上的主分片真实立刻被提升,集群只降级到yellow,数据真实完全可读

实测 · 本机执行输出
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 → 真实正常返回,数据完全可读
这组真实结果跟本系列前面验证过的"kill掉master候选节点"那类场景形成了鲜明对比:本次kill掉的这个节点因为真实从一开始就被配置成纯data角色,它真实压根不在master选举的候选名单里,所以它的死亡真实对master选举这件事毫无影响——不需要重新投票、不存在quorum风险、master真实从头到尾都没有发生任何变化。这正是生产环境里为什么经常会把集群拆分成"专职master候选节点"和"专职data节点"这两类角色的真实原因:承载数据和处理查询的节点真实可以更自由地扩容、重启、甚至意外故障,只要master候选的那几个节点真实保持稳定,整个集群的"大脑"就不会受到波及,故障的影响面真实被牢牢限制在了数据和可用性这个层面,不会牵连到集群自身的治理能力。

收尾:真实把这个纯data节点重新拉起来,确认它重新加入后集群真实完全恢复green;彻底销毁这个临时集群

代码真实重启drill-data-only-1 真实kill -9全部drill-lab进程,rm -rf整个drill-lab目录

验证:节点重新加入后集群真实完全恢复green;主力es-lab实例全程真实未受影响

实测 · 本机执行输出
drill-data-only-1重新加入后: status="green", number_of_nodes:3, unassigned_shards:0
交叉检查es-lab(端口19920): status="green", number_of_nodes:1

分步演示:从角色分离的3节点集群搭建,到纯data节点故障后master真实纹丝不动的完整验证

每一步都是本文在一个真实独立搭建的3节点Elasticsearch 8.15.0集群上跑出来的原始结果。

停止纯data节点真实对master选举毫无影响,这正是角色分离设计的真实价值
这一步新验证的故障演练场景

    本文用到的工具

    • 真实独立搭建的3节点Elasticsearch 8.15.0集群(2个master+data节点,1个纯data节点,测完即销毁)
    • 真实的 node.roles 角色配置与kill -9故障模拟
    京ICP备2026067502号-1京公网安备11010502063487号