CentOS 上 Kafka 连接问题的排查与修复
一 快速自检清单
- 在 Broker 上确认进程与端口:ps -ef | grep kafka;ss -lntp | grep 9092(或 netstat -tulnp | grep 9092)。若无监听,先启动服务。
- 从客户端测试连通:telnet <broker_ip> 9092 或 nc -zv <broker_ip> 9092;不通优先检查 防火墙/安全组 与监听地址。
- 核对客户端 bootstrap.servers 使用实际可达的 IP:端口,避免使用 localhost/127.0.0.1(跨机访问时)。
- 查看 Broker 日志 logs/server.log,关注 Connection refused、Invalid URL、UnknownHostException 等关键字。
二 常见根因与对应修复
-
监听与对外地址配置不当
- 现象:本地脚本能连,远程连不上;或报 TimeoutException。
- 处理:在 server.properties 明确 listeners 与 advertised.listeners,且 advertised.listeners 必须是可路由 IP 或主机名,不可用 0.0.0.0。
- 示例:
- listeners=PLAINTEXT://0.0.0.0:9092
- advertised.listeners=PLAINTEXT://<服务器真实IP>:9092
- 说明:Kafka 会把 advertised.listeners 返回给客户端用于后续连接,错误或未设置会导致跨机访问失败。
-
防火墙或 SELinux 拦截
- 现象:telnet/nc 连接被拒绝或超时。
- 处理:
- 临时放行端口:firewall-cmd --add-port=9092/tcp --permanent && firewall-cmd --reload(或 iptables -I INPUT -p tcp --dport 9092 -j ACCEPT)。
- 如为云主机,同步放行安全组入站规则。
- SELinux 必要时可临时 setenforce 0 验证,再改为持久化策略。
-
主机名解析失败
- 现象:日志出现 UnknownHostException,客户端无法解析返回的主机名。
- 处理:在 /etc/hosts 增加映射,例如:172.16.10.102 MY_HOST_NAME;确保客户端能解析 Broker 返回的主机名。
-
资源限制导致异常
- 现象:偶发超时、连接被重置或性能异常。
- 处理:提升系统限制(/etc/security/limits.conf):
- 使配置生效并重启会话或进程。
-
协议与安全认证不匹配
- 现象:客户端报握手失败、认证错误。
- 处理:若 Broker 启用了 SSL/SASL,客户端需一致配置,例如:
- security.protocol=SASL_SSL
- sasl.mechanism=PLAIN
- sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username=“admin” password=“admin-secret”;
- 同时确保 advertised.listeners 的协议与端口与客户端一致。
三 配置示例与验证步骤
- server.properties 最小可用示例(单机)
- broker.id=0
- listeners=PLAINTEXT://0.0.0.0:9092
- advertised.listeners=PLAINTEXT://<服务器真实IP>:9092
- log.dirs=/var/lib/kafka/data
- zookeeper.connect=localhost:2181
- 启动与验证
- 启动:bin/kafka-server-start.sh -daemon config/server.properties
- 本机验证:bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test;bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
- 远程验证:在客户端执行 telnet <服务器IP> 9092;生产者/消费者使用 bootstrap.servers=<服务器IP>:9092
四 常见报错对照表
| 报错或现象 |
高概率原因 |
快速修复 |
| TimeoutException 发送超时 |
advertised.listeners 未设置或返回不可达地址 |
设置 advertised.listeners=PLAINTEXT://<可路由IP>:9092 |
| Connection refused / 端口不通 |
防火墙/安全组未放行 9092 |
放行 9092/tcp,云上同步安全组规则 |
| UnknownHostException |
Broker 返回的主机名无法解析 |
/etc/hosts 增加 主机名<->IP 映射 |
| 本地脚本可用、远程不可用 |
客户端用了 localhost 或监听地址绑定错误 |
客户端用服务器IP;listeners 用 0.0.0.0,advertised.listeners 用服务器IP |
| 启动报错 advertised.listeners cannot use 0.0.0.0 |
将 0.0.0.0 写进了 advertised.listeners |
改为实际 IP 或可解析主机名 |