Linux环境下Kafka配置常见问题及解答
常见症状:启动时抛出java.net.UnknownHostException、端口冲突或地址绑定错误,或日志中出现Address already in use。
解决方法:
server.properties中的listeners配置(如PLAINTEXT://your.host.name:9092),确保主机名能解析为正确IP(可通过ping your.host.name验证);netstat -tulnp | grep 9092或ss -tulnp | grep 9092检查端口是否被占用,若占用则修改listeners中的端口或停止占用服务;log.dirs(日志目录)存在且有读写权限(如chown -R kafka:kafka /tmp/kafka-logs)。常见症状:Broker日志中出现Connection to ZooKeeper lost、Session expired或ZooKeeper session timeout。
解决方法:
systemctl status zookeeper或zkServer.sh status);server.properties中的zookeeper.connect配置(如localhost:2181),确保ZooKeeper地址和端口正确;zk1:2181,zk2:2181,zk3:2181),并确保网络可达。常见症状:kafka-topics.sh --describe显示分区积压(lag值持续增长),消费者处理速度远低于生产者。
解决方法:
max.poll.records参数,默认500);kafka-topics.sh --alter --topic your_topic --partitions 6 --bootstrap-server localhost:9092提升并行消费能力;partition.assignment.strategy从RangeAssignor改为RoundRobinAssignor,改善负载均衡。常见症状:生产者收到acks=all的成功响应,但消费者无法消费到对应消息,或ISR(同步副本)列表中副本数不足。
解决方法:
acks=all(要求所有ISR副本确认),retries=3(自动重试失败请求);min.insync.replicas=2(至少2个副本确认写入才算成功),避免单副本故障导致数据丢失;default.replication.factor)≥min.insync.replicas(生产环境建议3副本)。常见症状:消费者重启后,已处理的消息再次被消费,导致业务重复执行。
解决方法:
consumer.commitSync()替代自动提交(enable.auto.commit=true),在消息处理完成后同步提交Offset;auto.commit.interval.ms从默认5秒改为更小值(如1000毫秒),减少重复概率;commitSync()提交已处理的Offset。常见症状:分区Leader宕机后,生产者发送消息时出现NotEnoughReplicasException或超时(request.timeout.ms触发)。
解决方法:
retries=5(生产者重试次数),retry.backoff.ms=1000(重试间隔1秒);buffer.memory(生产者缓冲区大小,默认32MB),避免因重试导致缓冲区满;kafka-controller.log查看Controller切换日志,优化Broker稳定性(如增加内存、优化磁盘IO)。常见症状:Broker日志中出现Disk full或No space left on device,生产者收到Message size too large或NotEnoughSpace错误。
解决方法:
kafka-delete-records.sh工具清理过期日志(如--offset-json-file cleanup.json指定要删除的偏移量);log.retention.hours=168(保留7天)或log.retention.bytes=1073741824(每个分区最大1GB),自动删除旧日志;常见症状:ZooKeeper日志中出现Session expired,Kafka Controller频繁切换(kafka-controller.log中Leader election记录增多)。
解决方法:
zookeeper.session.timeout.ms(默认30秒,可调整为60秒),减少误判;zkServer.sh status查看ZooKeeper状态,避免部署过多Kafka Broker(建议每3-5个Broker对应1个ZooKeeper节点);常见症状:kafka-consumer-groups.sh --describe显示消费者组频繁进入REBALANCE状态,消费进度长时间不更新。
解决方法:
session.timeout.ms=30000(默认10秒)和max.poll.interval.ms=300000(默认5分钟),给消费者足够时间处理消息;max.poll.interval.ms,需增大该参数;max.poll.records:降低每次拉取的消息数(如从500改为200),避免消费者因处理大量消息而超时。常见症状:异地机房之间的副本同步延迟大(kafka-topics.sh --describe中ISR列表更新慢),ISR列表不稳定。
解决方法:
broker.rack参数(如broker.rack=rack1),标记Broker所在机房,Kafka会优先同步同机房副本;replica.socket.timeout.ms=30000(默认10秒)和replica.fetch.wait.max.ms=500(默认500毫秒),减少网络波动影响;