Kafka 在 Linux 的故障恢复流程
一 快速定位与恢复步骤
- 查看服务状态与日志:使用 systemctl status kafka 与 journalctl -u kafka -n 100 --no-pager 获取 systemd 输出;同时查看 Kafka 服务端日志(常见路径为安装目录下的 logs/server.log 或 /var/log/kafka/server.log)以定位异常堆栈与报错关键词。
- 校验关键配置:核对 server.properties 中的 broker.id(唯一)、listeners/advertised.listeners(对外可达)、zookeeper.connect(或 KRaft 的 controller.quorum.voters)、log.dirs(数据目录) 等,确保与实际网络与目录一致。
- 依赖与连通性:确认 ZooKeeper/KRaft 控制器已就绪;检测 9092 端口是否被占用(如 netstat -tlnp | grep 9092 或 lsof -i :9092);排查 防火墙/安全组策略是否放行。
- 资源与系统:检查 磁盘空间(df -h)、内存(free -h)、文件描述符限制(ulimit -n),避免因 OOM 或 FD 不足导致进程退出。
- 手动拉起与验证:必要时先前台启动以观察输出,再用 kafka-console-producer.sh / kafka-console-consumer.sh 验证生产/消费是否正常。
- 重启与回滚:完成修复后执行 systemctl restart kafka;若近期变更引发问题,优先回滚最近配置或版本。
二 常见故障场景与修复要点
- 启动即退或 systemd 报错:若 ExecStart 脚本拉起守护进程,单元文件 Type 应为 forking;如脚本使用非 0 退出码表示成功,需配置 SuccessExitStatus;同时设置 Restart=on-failure 与 RestartSec=10 提升自愈能力。
- 配置错误导致无法启动:重点检查 broker.id 唯一、listeners/advertised.listeners 对外可达、zookeeper.connect 或 KRaft 相关配置、log.dirs 路径是否存在且权限正确。
- 端口冲突:默认 9092 被占用时,释放端口或修改 listeners 端口后重启。
- 依赖未就绪:确认 ZooKeeper 已启动且网络可达;KRaft 模式需确保 controller.quorum.voters 配置正确且多数派在线。
- 资源不足:磁盘满、内存不足触发 OOM、FD 限制过低均会导致异常退出,需扩容或调优系统/进程限制。
- 日志目录在 /tmp:将 log.dirs 从 /tmp 改为持久化路径,避免系统清理导致 __consumer_offsets 等日志清理失败与进程异常。
- Java 版本不兼容:安装并指向 Kafka 要求的 Java 版本,确保 JAVA_HOME 正确。
三 systemd 单元文件示例
[Unit]
Description=Apache Kafka Server
After=network.target zookeeper.service
[Service]
Type=forking
User=kafka
Group=kafka
ExecStart=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
Restart=on-failure
RestartSec=10
SuccessExitStatus=0 143
LimitNOFILE=65536
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk"
[Install]
WantedBy=multi-user.target
说明:若使用包装脚本启动,请确保 Type、SuccessExitStatus 与实际退出码匹配;按需调整 User/Group、ExecStart/ExecStop、LimitNOFILE 等参数。
四 数据一致性与恢复策略
- 单 Broker 异常:修复配置/资源后按依赖顺序拉起;确认 log.dirs 无损坏后重启,观察 server.log 是否完成日志恢复与分区加载。
- 多 Broker 异常:先恢复 ZooKeeper/KRaft 控制器 与多数派,再逐台恢复其余 Broker;避免同时重启导致再均衡风暴。
- 主题与副本:对关键 Topic 检查 replication.factor 与 min.insync.replicas,必要时临时提高副本数并等待 ISR 恢复后再恢复业务写入。
- 数据目录损坏:若 log.dirs 中个别分区目录损坏,可先移出故障分区目录,启动后再通过 重新分配分区(reassign partitions) 补齐副本。
- 客户端恢复:短暂不可用后,客户端通常会自动重连;如长时间未恢复,检查 advertised.listeners 是否对外可达并重试生产/消费。
- 变更管控:任何配置调整先在测试环境验证,变更窗口内分批滚动重启,保留回滚方案。
五 验证与监控
- 连通性验证:使用 telnet 9092 或 nc -zv 9092 测试端口连通;生产者/消费者命令行工具验证端到端消息流。
- 系统资源监控:持续关注 磁盘空间、内存、FD 使用率 与 OOM 日志,防止因资源瓶颈再次引发故障。
- 指标与告警:通过 JMX 或 Prometheus/Grafana 监控 UnderReplicatedPartitions、RequestHandlerAvgIdlePercent、MessagesInPerSec/OutPerSec、ConsumerLag 等关键指标,异常时及时告警与处置。