一、Kafka无法启动
常见原因:配置文件错误(如broker.id不唯一、zookeeper.connect指向无效地址)、Zookeeper服务未启动、端口被占用(默认9092)、磁盘空间不足、Kafka运行用户无权限访问数据目录或日志目录。
解决方法:
server.properties关键配置:确保broker.id在集群中唯一,zookeeper.connect格式为ip:port(如192.168.1.100:2181),listeners(Broker监听地址)和advertised.listeners(客户端访问地址)配置正确(若Kafka与客户端不在同一机器,需将advertised.listeners设为客户端可访问的IP或域名)。systemctl status zookeeper检查是否运行,未运行则执行systemctl start zookeeper。netstat -tuln | grep 9092,若有冲突,修改server.properties中的port参数。df -h查看磁盘使用率,删除无用文件或扩容磁盘,确保可用空间大于总容量的20%。chown -R kafka:kafka /var/lib/kafka(数据目录)和chown -R kafka:kafka /var/log/kafka(日志目录),确保Kafka用户有读写权限。二、客户端无法连接Kafka集群
常见原因:bootstrap.servers配置错误(未指向正确的Broker地址)、防火墙拦截(默认9092端口未开放)、网络分区(客户端与Broker无法通信)、advertised.listeners配置错误(客户端无法通过该地址反向访问Broker)。
解决方法:
bootstrap.servers:在客户端配置文件中,将bootstrap.servers设为Broker的IP和端口(如192.168.1.100:9092,192.168.1.101:9092),多个地址用逗号分隔。firewall-cmd --zone=public --add-port=9092/tcp --permanent添加端口规则,然后firewall-cmd --reload生效。ping <broker_ip>检查网络是否可达,telnet <broker_ip> 9092验证端口是否开放。advertised.listeners:若Broker在NAT网络后(如云服务器),需将advertised.listeners设为客户端可访问的地址(如公网IP或域名),确保客户端能通过该地址连接Broker。三、消息发送/消费异常
生产者消息发送慢
常见原因:网络带宽不足、消息未压缩(增加网络传输量)、未批量发送(每次发送单条消息)、Topic分区数少(无法并行发送)。
解决方法:
iperf3测试生产者与Broker之间的带宽,若不足则升级网络套餐。compression.type=gzip(或snappy、lz4),减少传输数据量。batch.size(如batch.size=16384,单位字节)和linger.ms(如linger.ms=10,等待时间),让生产者积累更多消息后批量发送。kafka-topics.sh --alter --topic your_topic --partitions 6 --bootstrap-server localhost:9092将分区数从默认1增加到6,提高并行度。消费者无法消费或重复消费
常见原因:bootstrap.servers配置错误、消费者组分配不均(部分消费者负载过高)、自动提交Offset间隔过长(崩溃前未提交)、消费者处理逻辑耗时过长(导致心跳超时)。
解决方法:
bootstrap.servers:确保消费者配置中的bootstrap.servers与生产者一致,指向正确的Broker地址。partition.assignment.strategy=org.apache.kafka.clients.consumer.RoundRobinAssignor,替代默认的RangeAssignor,均衡各消费者的分区负载。auto.commit.interval.ms从默认5000ms改为1000ms(auto.commit.interval.ms=1000),减少重复消费概率;或改用手动提交(enable.auto.commit=false),在poll循环中调用consumer.commitSync()确保处理完成后提交Offset。max.poll.interval.ms(如max.poll.interval.ms=300000,5分钟),避免因处理时间过长被判定为下线。四、数据丢失或不一致
常见原因:生产者未开启ACK确认(acks=0或1,Leader宕机后数据丢失)、Broker副本同步未完成(min.insync.replicas设置过小,无法保证数据冗余)、消费者读取未同步的副本(isr列表缩小,消费者读取到旧数据)。
解决方法:
acks设置为all(acks=all),确保所有ISR(同步副本)都确认收到消息后再返回成功。min.insync.replicas=2(min.insync.replicas=2),要求至少2个副本同步成功才允许写入,避免单点故障。read_committed=true(read.committed=true),只读取已提交的消息(即ISR中的副本数据),避免读取到未同步的脏数据。五、ZooKeeper连接问题
常见原因:ZooKeeper服务未启动、zookeeper.connect配置错误、ZooKeeper会话超时(zookeeper.session.timeout.ms设置过小,网络波动导致连接断开)。
解决方法:
systemctl status zookeeper检查状态,未运行则执行systemctl start zookeeper。zookeeper.connect:确保server.properties中的zookeeper.connect格式正确(如192.168.1.100:2181),多个ZooKeeper节点用逗号分隔(如192.168.1.100:2181,192.168.1.101:2181)。zookeeper.session.timeout.ms从默认6000ms改为18000ms(zookeeper.session.timeout.ms=18000),避免因网络波动导致Session过期;同时确保zookeeper.connection.timeout.ms(连接超时时间)小于session.timeout.ms。六、磁盘空间满导致Broker停机
常见原因:日志保留时间过长(log.retention.hours设置过大)、日志段大小未限制(log.segment.bytes过大)、未开启日志清理(log.cleanup.policy未设置为delete或compact)。
解决方法:
kafka-delete-records.sh工具删除旧数据,例如创建cleanup.json文件指定要删除的偏移量,然后执行kafka-delete-records.sh --bootstrap-server localhost:9092 --offset-json-file cleanup.json。server.properties中的log.retention.hours=72(保留3天),log.retention.bytes=1073741824(每个分区最多保留1GB),log.cleanup.policy=delete(开启删除策略,删除过期数据)。df -h定期检查磁盘使用率,设置告警阈值(如80%),提前清理无用文件。