Skip to content
清晨的一缕阳光
返回

Kafka 故障演练与应急预案实战

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 故障演练的核心要点:

  1. 故障场景:Broker 宕机、网络分区、磁盘故障
  2. 演练方法:脚本自动化、监控记录
  3. 应急预案:预案模板、联系人、工具包
  4. 演练总结:报告模板、改进跟踪

核心要点

参考资料


分享这篇文章到:

上一篇文章
Redis 多活架构设计与实战
下一篇文章
Kafka 消息设计最佳实践与案例