Ubuntu Kafka故障排查指南
systemctl命令检查Kafka及依赖服务(Zookeeper)的运行状态,确保服务处于active (running)状态。若未运行,可通过sudo systemctl start kafka(或zookeeper)启动服务,并通过sudo systemctl enable kafka设置开机自启。/var/log/kafka/目录下(核心日志为server.log)。使用tail -f /var/log/kafka/server.log实时查看日志,或tail -500 /var/log/kafka/server.log查看最近500条日志,重点关注ERROR、WARN级别的错误信息(如配置错误、端口冲突、Zookeeper连接失败等)。/etc/kafka/server.properties(默认路径),核对以下核心配置:
listeners:Broker监听的地址和端口(如PLAINTEXT://your_server_ip:9092),需与客户端连接地址一致;advertised.listeners:客户端访问Broker的地址(如PLAINTEXT://your_public_ip:9092),若为集群需确保每个Broker的地址可达;zookeeper.connect:Zookeeper集群地址(如localhost:2181或zk1:2181,zk2:2181,zk3:2181),需确保Zookeeper服务正常;log.dirs:日志存储目录(如/var/lib/kafka/logs),需确保目录存在且有写入权限。kafka-configs.sh工具或直接读取配置文件,检查是否有拼写错误、格式错误(如缺少引号、逗号)或无效配置项(如不支持的参数)。ping命令测试Kafka Broker与客户端、Zookeeper节点之间的网络连通性(如ping your_client_ip);使用telnet或nc命令测试端口是否可达(如telnet your_server_ip 9092或nc -zv your_server_ip 9092)。若无法连通,需检查防火墙(sudo ufw allow 9092)或安全组规则。netstat -tuln | grep 9092(或ss -tuln | grep 9092)查看Kafka端口是否被其他进程占用。若端口被占用,可修改server.properties中的listeners配置更换端口,或停止占用端口的进程(如sudo kill -9 <PID>)。systemctl status zookeeper检查Zookeeper服务状态,若未运行,启动服务(sudo systemctl start zookeeper)。可通过echo stat | nc localhost 2181(Zookeeper默认端口2181)查看Zookeeper集群状态,确保Mode为leader或follower。top、htop查看CPU使用率,free -h查看内存使用情况,df -h查看磁盘空间(确保/var/log/kafka、/var/lib/kafka/logs所在分区有足够空间,建议剩余空间大于20%)。使用iostat -x 1 10查看磁盘IO性能(重点关注await、%util,若%util接近100%说明磁盘瓶颈)。kafka或root)对配置文件(/etc/kafka/server.properties)、日志目录(/var/log/kafka)、数据目录(/var/lib/kafka/logs)有读取和写入权限。可使用ls -l /var/log/kafka查看权限,通过sudo chmod -R 755 /var/log/kafka修改权限。Address already in use表示端口占用,No such file or directory表示日志目录不存在)。常见问题及解决:
listeners配置或停止占用进程;zookeeper.connect配置及Zookeeper服务状态。bootstrap.servers是否指向正确Broker地址)、Topic是否存在(使用kafka-topics.sh --list --bootstrap-server localhost:9092)、网络是否可达;group.id是否正确)、订阅Topic是否正确(使用kafka-consumer-groups.sh --describe --bootstrap-server localhost:9092 --group your_group)、消费者是否已提交偏移量(auto.offset.reset设置为earliest可从头消费)。log.cleanup.policy=compact)、使用SSD存储、调整log.segment.bytes(增大日志段大小,减少刷盘次数);socket.send.buffer.bytes、socket.receive.buffer.bytes)、启用Nagle算法(tcp.no.delay=false);num.network.threads(处理网络请求的线程数,建议设置为CPU核数+1)、num.io.threads(处理磁盘IO的线程数,建议设置为CPU核数×2);