《集群故障模拟方案》系列,共包含以下文章:
😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!
集群故障模拟方案(一):节点宕机、节点离线
1.节点宕机模拟
1.1 方案描述
模拟 Elasticsearch 节点突然崩溃或进程被终止的情况。
1.2 操作步骤
- 识别目标节点
curl -XGET 'http://localhost:9200/_cat/nodes?v'
- 终止节点进程
- 直接
kill
进程:# 查找Elasticsearch进程ID ps -ef | grep elasticsearch # 终止进程 kill -9 <pid>
- 或者停止服务:
systemctl stop elasticsearch
- 直接
- 观察集群反应
curl -XGET 'http://localhost:9200/_cluster/health?pretty' watch -n 1 curl -s 'http://localhost:9200/_cat/nodes?v'
- 恢复节点
systemctl start elasticsearch
2.节点离线模拟(网络隔离)
2.1 方案描述
模拟节点因网络问题无法与其他节点通信的情况。
2.2 操作步骤
- 识别目标节点IP
curl -XGET 'http://localhost:9200/_cat/nodes?v'
- 使用 iptables 阻断网络
# 阻断目标节点与其他节点的通信(假设集群端口为9300) iptables -A INPUT -p tcp --dport 9300 -j DROP iptables -A OUTPUT -p tcp --dport 9300 -j DROP # 查看规则 iptables -L
- 观察集群状态
watch -n 1 curl -s 'http://localhost:9200/_cluster/health?pretty'
- 恢复网络
iptables -D INPUT -p tcp --dport 9300 -j DROP iptables -D OUTPUT -p tcp --dport 9300 -j DROP
2.3 命令说明
iptables -A INPUT -p tcp --dport 9300 -j DROP
:阻止其他节点通过 9300 端口向本节点发送数据(如集群状态同步、分片复制等),模拟网络中断。
-A INPUT
:表示向INPUT
链(处理进入本机的数据包)追加(Add)一条新规则。-p tcp
:指定规则应用于 TCP 协议(Elasticsearch 节点间通信默认使用 TCP)。--dport 9300
:匹配目标端口(dport
=destination port
)为 9300 的数据包(Elasticsearch 的节点间通信默认端口)。-j DROP
:对匹配的数据包执行DROP
动作(直接丢弃,不响应任何错误信息)。
iptables -A OUTPUT -p tcp --dport 9300 -j DROP
:阻止本节点通过 9300 端口向其他节点发送数据(如心跳检测、分片请求等)。
-A OUTPUT
:向OUTPUT
链(处理从本机发出的数据包)追加一条规则。-p tcp --dport 9300 -j DROP
:同上,匹配目标端口为 9300 的 TCP 数据包并丢弃。
2.3.1 组合效果
这两条命令一起使用时,会完全阻断本节点与其他 Elasticsearch 节点在 9300 端口上的 双向通信。
- INPUT 规则:其他节点无法联系本节点。
- OUTPUT 规则:本节点无法联系其他节点。
2.3.2 典型场景
- 模拟节点因网络故障被集群 “踢出”(触发重新选主或分片重新分配)。
- 测试 Elasticsearch 的 容错机制(如副本分片提升为主分片)。
2.3.3 注意事项
- 恢复通信:需要删除规则才能恢复。
iptables -D INPUT -p tcp --dport 9300 -j DROP iptables -D OUTPUT -p tcp --dport 9300 -j DROP
- 持久化问题:
iptables
规则默认重启后失效。如需持久化,需保存规则(如iptables-save
)。 - 端口差异
- Elasticsearch 节点间通信 默认用
9300
(需阻断此端口模拟节点离线)。 - 客户端请求 默认用
9200
(如果同时阻断此端口,客户端也无法访问该节点)。
- Elasticsearch 节点间通信 默认用