Kafka 故障演练是保障集群稳定运行的关键。本文将深入探讨各种故障场景的演练方法和应急预案。
一、故障演练基础
1.1 演练目标
演练目标:
1. 验证集群高可用能力
2. 测试故障恢复时间
3. 验证监控告警有效性
4. 提升团队应急能力
5. 完善应急预案
1.2 演练原则
演练原则:
1. 在测试环境先演练
2. 选择低峰期执行
3. 准备回滚方案
4. 全程监控记录
5. 演练后总结改进
1.3 演练分类
| 分类 | 说明 | 频率 |
|---|---|---|
| Broker 故障 | Broker 宕机、重启 | 每月 |
| 网络故障 | 网络分区、延迟 | 每季度 |
| 磁盘故障 | 磁盘满、IO 慢 | 每季度 |
| ZooKeeper 故障 | ZK 宕机、切换 | 每季度 |
| 全链路故障 | 多组件同时故障 | 每半年 |
二、Broker 故障演练
2.1 单 Broker 宕机
演练步骤:
#!/bin/bash
# Broker 宕机演练脚本
echo "=== Broker 宕机演练 ==="
# 1. 记录演练开始时间
START_TIME=$(date +%s)
echo "演练开始时间:$(date)"
# 2. 记录当前状态
echo -e "\n=== 演练前状态 ==="
kafka-topics.sh --bootstrap-server localhost:9092 --describe > /tmp/topics_before.txt
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe > /tmp/consumers_before.txt
# 3. 停止 Broker
echo -e "\n=== 停止 Broker ==="
ssh kafka-1 "systemctl stop kafka"
# 4. 监控集群状态
echo -e "\n=== 监控集群状态 ==="
for i in {1..10}; do
echo "检查 $i/10..."
# 检查未同步副本
under_replicated=$(kafka-topics.sh --bootstrap-server localhost:9092 --describe 2>/dev/null | grep -c "Isr:" || echo "0")
echo "未同步副本数:$under_replicated"
# 检查 Consumer Lag
lag=$(kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe 2>/dev/null | awk 'NR>3 {sum+=$6} END {print sum}')
echo "消费堆积:$lag"
sleep 10
done
# 5. 启动 Broker
echo -e "\n=== 启动 Broker ==="
ssh kafka-1 "systemctl start kafka"
# 6. 等待恢复
echo -e "\n=== 等待恢复 ==="
sleep 60
# 7. 验证恢复
echo -e "\n=== 验证恢复 ==="
kafka-topics.sh --bootstrap-server localhost:9092 --describe > /tmp/topics_after.txt
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe > /tmp/consumers_after.txt
# 8. 计算恢复时间
END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))
echo -e "\n演练结束时间:$(date)"
echo "演练持续时间:$DURATION 秒"
2.2 多 Broker 宕机
演练步骤:
#!/bin/bash
# 多 Broker 宕机演练脚本
echo "=== 多 Broker 宕机演练 ==="
# 1. 停止 2 个 Broker
echo "停止 kafka-1 和 kafka-2..."
ssh kafka-1 "systemctl stop kafka"
ssh kafka-2 "systemctl stop kafka"
# 2. 验证集群仍可用
echo "验证集群可用性..."
echo "test" | kafka-console-producer.sh --bootstrap-server kafka-3:9092 --topic test-topic
kafka-console-consumer.sh --bootstrap-server kafka-3:9092 --topic test-topic --from-beginning --max-messages 1 --timeout-ms 5000
# 3. 启动 Broker
echo "启动 Broker..."
ssh kafka-1 "systemctl start kafka"
ssh kafka-2 "systemctl start kafka"
# 4. 等待恢复
sleep 60
# 5. 验证恢复
kafka-topics.sh --bootstrap-server localhost:9092 --describe
三、网络故障演练
3.1 网络分区
演练步骤:
#!/bin/bash
# 网络分区演练脚本
echo "=== 网络分区演练 ==="
# 1. 模拟网络分区(使用 iptables)
echo "创建网络分区..."
ssh kafka-1 "iptables -A OUTPUT -d kafka-2 -j DROP"
ssh kafka-1 "iptables -A OUTPUT -d kafka-3 -j DROP"
# 2. 验证分区效果
echo "验证分区..."
ssh kafka-1 "ping -c 1 kafka-2"
# 3. 监控集群状态
echo "监控集群状态..."
for i in {1..10}; do
echo "检查 $i/10..."
kafka-topics.sh --bootstrap-server kafka-1:9092 --describe 2>&1 | head -5
sleep 10
done
# 4. 恢复网络
echo "恢复网络..."
ssh kafka-1 "iptables -F"
# 5. 验证恢复
sleep 60
kafka-topics.sh --bootstrap-server localhost:9092 --describe
3.2 网络延迟
演练步骤:
#!/bin/bash
# 网络延迟演练脚本
echo "=== 网络延迟演练 ==="
# 1. 添加网络延迟
echo "添加 100ms 延迟..."
ssh kafka-1 "tc qdisc add dev eth0 root netem delay 100ms"
# 2. 验证延迟
echo "验证延迟..."
ssh kafka-1 "ping -c 3 kafka-2"
# 3. 监控性能
echo "监控性能..."
for i in {1..10}; do
echo "检查 $i/10..."
# 检查 Producer 延迟
kafka-producer-perf-test.sh --topic test-topic --num-records 1000 --record-size 1024 --throughput 100 --producer-props bootstrap.servers=kafka-1:9092 2>&1 | tail -1
sleep 10
done
# 4. 移除延迟
echo "移除延迟..."
ssh kafka-1 "tc qdisc del dev eth0 root netem delay 100ms"
# 5. 验证恢复
sleep 30
kafka-topics.sh --bootstrap-server localhost:9092 --describe
四、磁盘故障演练
4.1 磁盘满
演练步骤:
#!/bin/bash
# 磁盘满演练脚本
echo "=== 磁盘满演练 ==="
# 1. 检查当前磁盘使用
echo "当前磁盘使用:"
ssh kafka-1 "df -h /data/kafka-logs"
# 2. 创建大文件填满磁盘
echo "创建大文件..."
ssh kafka-1 "dd if=/dev/zero of=/data/kafka-logs/fillfile bs=1G count=10"
# 3. 监控告警
echo "监控告警..."
# 检查是否触发磁盘告警
# 4. 清理文件
echo "清理文件..."
ssh kafka-1 "rm /data/kafka-logs/fillfile"
# 5. 验证恢复
ssh kafka-1 "df -h /data/kafka-logs"
4.2 磁盘 IO 慢
演练步骤:
#!/bin/bash
# 磁盘 IO 慢演练脚本
echo "=== 磁盘 IO 慢演练 ==="
# 1. 限制磁盘 IO
echo "限制磁盘 IO..."
ssh kafka-1 "ionice -c3 -p \$(pgrep -f kafka)"
# 2. 监控性能
echo "监控性能..."
for i in {1..10}; do
echo "检查 $i/10..."
ssh kafka-1 "iostat -x 1 1 | grep -A1 Device"
sleep 10
done
# 3. 恢复 IO
echo "恢复 IO..."
ssh kafka-1 "ionice -c2 -p \$(pgrep -f kafka)"
# 4. 验证恢复
sleep 30
ssh kafka-1 "iostat -x 1 1 | grep -A1 Device"
五、应急预案
5.1 预案模板
# Kafka 故障应急预案
## 故障信息
- 故障时间:YYYY-MM-DD HH:MM:SS
- 故障类型:Broker 宕机/网络故障/磁盘故障
- 影响范围:Topic/Consumer Group
## 应急步骤
### 1. 故障确认
- [ ] 确认故障现象
- [ ] 确认影响范围
- [ ] 通知相关人员
### 2. 故障处理
- [ ] 执行故障切换
- [ ] 重启故障组件
- [ ] 验证集群状态
### 3. 恢复验证
- [ ] 验证 Producer 正常
- [ ] 验证 Consumer 正常
- [ ] 验证监控指标
### 4. 事后总结
- [ ] 记录故障原因
- [ ] 记录处理过程
- [ ] 提出改进建议
5.2 应急联系人
# emergency-contacts.yml
emergency_contacts:
- name: 运维负责人
phone: 138-xxxx-xxxx
role: 应急指挥
- name: Kafka 专家
phone: 139-xxxx-xxxx
role: 技术支持
- name: 网络工程师
phone: 137-xxxx-xxxx
role: 网络支持
- name: DBA
phone: 136-xxxx-xxxx
role: 数据库支持
5.3 应急工具包
#!/bin/bash
# 应急工具包
# 1. 集群状态检查
check_cluster_status() {
kafka-topics.sh --bootstrap-server localhost:9092 --describe
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe
kafka-broker-api-versions.sh --bootstrap-server localhost:9092
}
# 2. Broker 重启
restart_broker() {
local broker=$1
ssh $broker "systemctl restart kafka"
}
# 3. 分区重分配
reassign_partitions() {
kafka-reassign-partitions.sh --bootstrap-server localhost:9092 \
--reassignment-json-file $1 --execute
}
# 4. Consumer 重置
reset_consumer_offset() {
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--group $1 --topic $2 --reset-offsets --to-latest --execute
}
# 5. 日志收集
collect_logs() {
local broker=$1
ssh $broker "tail -1000 /var/log/kafka/server.log" > logs/$broker.log
}
六、演练总结
6.1 演练报告模板
# 故障演练报告
## 演练信息
- 演练时间:YYYY-MM-DD HH:MM:SS
- 演练类型:Broker 宕机/网络故障/磁盘故障
- 参与人员:xxx、xxx、xxx
## 演练过程
### 1. 演练前状态
- Broker 数量:3
- Topic 数量:10
- Consumer Group 数量:5
### 2. 演练步骤
1. HH:MM:SS - 开始演练
2. HH:MM:SS - 执行故障注入
3. HH:MM:SS - 观察集群状态
4. HH:MM:SS - 执行恢复操作
5. HH:MM:SS - 验证恢复
6. HH:MM:SS - 演练结束
### 3. 演练结果
- 故障检测时间:30 秒
- 故障恢复时间:120 秒
- 数据丢失:无
- 服务中断:是(60 秒)
## 问题分析
1. 问题 1:...
原因:...
改进:...
2. 问题 2:...
原因:...
改进:...
## 改进建议
1. 优化监控告警
2. 完善应急预案
3. 增加自动恢复
4. 定期演练
6.2 改进跟踪
# 改进跟踪表
| 改进项 | 负责人 | 状态 | 完成时间 |
|--------|--------|------|----------|
| 优化监控告警 | 张三 | 进行中 | 2026-09-30 |
| 完善应急预案 | 李四 | 已完成 | 2026-09-15 |
| 增加自动恢复 | 王五 | 计划中 | 2026-10-30 |
| 定期演练 | 赵六 | 进行中 | 持续 |
总结
Kafka 故障演练的核心要点:
- 故障场景:Broker 宕机、网络分区、磁盘故障
- 演练方法:脚本自动化、监控记录
- 应急预案:预案模板、联系人、工具包
- 演练总结:报告模板、改进跟踪
核心要点:
- 定期执行故障演练
- 建立完善的应急预案
- 记录演练过程和问题
- 持续改进优化
- 提升团队应急能力
参考资料
- Kafka Operations 官方文档
- Chaos Engineering
- 《SRE:Google 运维解密》