Debian Kafka集群故障排查指南
systemctl status kafka命令检查Kafka服务是否处于active (running)状态。若未运行,尝试通过systemctl start kafka启动服务,并观察启动日志(journalctl -u kafka -f)中的错误信息。jps -l | grep Kafka命令确认Kafka主进程(Kafka类)是否在运行。若进程不存在,需检查启动脚本或日志定位进程终止原因。Kafka的日志是故障排查的核心依据,主要关注以下日志文件:
/opt/kafka/logs/server.log(或/var/log/kafka/server.log,取决于安装方式),通过tail -f /opt/kafka/logs/server.log | grep -i "error\|exception"过滤错误信息,重点关注端口冲突、磁盘空间不足、ZooKeeper连接失败、集群ID不一致等问题。journalctl -u kafka或dmesg查看系统级错误(如OOM Killer终止Kafka进程、硬件故障)。hs_err_pid*.log文件(位于Kafka工作目录),其中包含崩溃时的堆栈跟踪和内存信息。Kafka的核心配置文件为/opt/kafka/config/server.properties(或/etc/kafka/server.properties),需重点检查以下参数:
listeners(Broker监听地址,如PLAINTEXT://0.0.0.0:9092)、advertised.listeners(客户端连接的Broker地址,需与集群网络匹配,如PLAINTEXT://broker1:9092)、log.dirs(日志存储目录,需确保磁盘空间充足,建议≥100GB)。zookeeper.connect(ZooKeeper集群地址,如broker1:2181,broker2:2181,broker3:2181),需确保ZooKeeper服务正常运行(systemctl status zookeeper)。broker.id唯一,且log.dirs中的cluster.metadata目录与ZooKeeper中的集群ID一致(可通过kafka-metadata-shell.sh查看集群元数据)。df -h检查log.dirs所在磁盘的剩余空间,建议保留≥20%的空闲空间(Kafka依赖磁盘存储,磁盘满会导致服务崩溃)。top或htop命令查看Kafka进程的CPU(建议≤70%)、内存使用情况(-Xmx参数设置的堆内存需适配服务器资源,避免OOM)。iostat -x 1监控磁盘的await(平均等待时间,建议≤10ms)、%util(利用率,建议≤70%),高I/O延迟会影响Kafka的读写性能。ping <broker-ip>测试网络可达性,telnet <broker-ip> 9092(或Kafka监听端口)测试端口连通性。若无法连通,需检查防火墙(iptables -L)或安全组规则。advertised.listeners地址(如telnet broker1 9092),避免因网络策略导致的生产/消费失败。Kafka依赖ZooKeeper管理集群元数据(如Topic分区、Broker注册信息),需通过以下命令检查ZooKeeper状态:
/opt/zookeeper/bin/zkCli.sh -server broker1:2181(替换为ZooKeeper节点地址)。ls /brokers/ids,应列出所有Broker的ID(如[0,1,2]);若列表为空,说明Broker未成功注册,需检查zookeeper.connect配置或网络问题。kafka-topics.sh --bootstrap-server <broker-ip>:9092 --describe --topic <topic-name>查看Topic的分区数、副本分布(Leader、ISR列表),重点关注UnderReplicatedPartitions(未同步副本数,若大于0说明副本同步失败)。kafka-consumer-groups.sh --bootstrap-server <broker-ip>:9092 --describe --group <group-id>查看消费者组的消费偏移量(CURRENT-OFFSET)、日志末端偏移量(LOG-END-OFFSET),若两者差距过大(如LAG>1000),说明消费者滞后。cmdline-jmxclient.jar工具获取Broker的JMX指标(如Leader分区数、OSR分区数),例如:java -jar cmdline-jmxclient.jar -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -broker1:9010 kafka.server:name=LeaderCount,type=ReplicaManager
关注UnderReplicatedPartitions(未同步副本数)、MessagesInPerSec(消息流入速率)等指标,异常值可能提示集群问题。Address already in use,使用netstat -tuln | grep <port>(如9092)检查端口占用进程,通过kill -9 <pid>终止占用进程或修改Kafka配置中的listeners端口。log.dirs目录中的旧日志(可通过kafka-configs.sh修改log.retention.hours参数缩短日志保留时间),或扩容磁盘。systemctl status zookeeper),确保zookeeper.connect配置正确(如broker1:2181,broker2:2181),并验证网络连通性。InconsistentClusterIdException,需清理ZooKeeper中/cluster/id节点的旧集群ID(通过zookeeper-cli.sh get /cluster/id查看),并确保所有Broker的server.properties中log.dirs目录一致。kafka-consumer-groups.sh --bootstrap-server <broker-ip>:9092 --alter --group <group-id> --increase-partitions <new-partition-count>)或调整生产者发送速率(linger.ms、batch.size参数)。