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);