Kafka连接服务器出现:Connection to node 1 (localhost/127.0.0.1:9092) could not be established.

本文详细记录了在外网环境中遇到的Kafka连接问题及其解决过程,包括检查安全组设置、防火墙规则、Kafka服务状态、运行日志及正确配置listeners与advertised.listeners的区别。

微信公众号搜“非典型开发者”,添加关注,不再迷路
在这里插入图片描述

今天遇到个很奇怪的问题,是关于外网连接Kafka的。

在服务器本地可以使用命令行参数连接并且进行发布订阅操作,但是在外网环境就不可以了,SpringBoot连接报错:

Connection to node 1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.

首先一点点来排查错误。

从错误信息可以看到,SpringBoot开启后连接的是127.0.0.1,也就是本地的Kafka broker,但是配置文件中配置的是服务器的IP地址。我本地也并没有安装Kafka和Zookeeper服务。

1.安全组是否开放&防火墙是否拦截请求

一般数据库或Redis连接不可用,都有可能是安全组没有开放或者防火墙拦截了外来连接导致。登陆阿里云服务器管理台后发现,9092端口和2181端口都是开放的,说明阿里云这边并没有关闭了Kafka和Zookeeper的外部连接权限,那么尝试下端口扫描,发现这两个端口依然可以被外部访问:

在这里插入图片描述

2.登陆服务器查看Kafka broker是否可用
xx@xx:~$ sudo lsof -i:9092
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    11049 root  164u  IPv4 1349268      0t0  TCP *:9092 (LISTEN)
java    11049 root  180u  IPv4 1350151      0t0  TCP localhost:33640->localhost:9092 (ESTABLISHED)
java    11049 root  181u  IPv4 1349272      0t0  TCP localhost:9092->localhost:33640 (ESTABLISHED)

通过查询Kafka broker默认端口9092发现,服务运行状态良好,排除掉服务下线的可能性。

3.查看Kafka运行日志
xx@xx~/kafka_2.11-2.3.1/$ sudo tail -f logs/server.log
[2019-12-09 00:49:13,507] INFO [GroupMetadataManager brokerId=1] Finished loading offsets and group metadata from __consumer_offsets-24 in 1 milliseconds. (kafka.coordinator.group.GroupMetadataManager)
[2019-12-09 00:49:13,507] INFO [GroupMetadataManager brokerId=1] Finished loading offsets and group metadata from __consumer_offsets-27 in 0 milliseconds. (kafka.coordinator.group.GroupMetadataManager)
[2019-12-09 00:49:13,507] INFO [GroupMetadataManager brokerId=1] Finished loading offsets and group metadata from __consumer_offsets-30 in 0 milliseconds. (kafka.coordinator.group.GroupMetadataManager)
[2019-12-09 00:49:13,508] INFO [GroupMetadataManager brokerId=1] Finished loading offsets and group metadata from __consumer_offsets-33 in 1 milliseconds. (kafka.coordinator.group.GroupMetadataManager)
[2019-12-09 00:49:13,508] INFO [GroupMetadataManager brokerId=1] Finished loading offsets and group metadata from __consumer_offsets-36 in 0 milliseconds. (kafka.coordinator.group.GroupMetadataManager)
[2019-12-09 00:49:13,508] INFO [GroupMetadataManager brokerId=1] Finished loading offsets and group metadata from __consumer_offsets-39 in 0 milliseconds. (kafka.coordinator.group.GroupMetadataManager)
[2019-12-09 00:49:13,509] INFO [GroupMetadataManager brokerId=1] Finished loading offsets and group metadata from __consumer_offsets-42 in 1 milliseconds. (kafka.coordinator.group.GroupMetadataManager)
[2019-12-09 00:49:13,509] INFO [GroupMetadataManager brokerId=1] Finished loading offsets and group metadata from __consumer_offsets-45 in 0 milliseconds. (kafka.coordinator.group.GroupMetadataManager)
[2019-12-09 00:49:13,509] INFO [GroupMetadataManager brokerId=1] Finished loading offsets and group metadata from __consumer_offsets-48 in 0 milliseconds. (kafka.coordinator.group.GroupMetadataManager)
[2019-12-09 00:49:13,509] INFO [GroupMetadataManager brokerId=1] Finished loading offsets and group metadata from __consumer_offsets-3 in 0 milliseconds. (kafka.coordinator.group.GroupMetadataManager)

运行状态良好,没有出现WARNERROR信息,从日志看不出问题。

4.在网上找资料

既然自己菜,没能力找到问题所在,那么问问google,总有一些解决问题的方式,虽然并不一定能直接解决问题,但是在查找问题的过程中还是能学到很多,例如这篇博客也提到了Kafka外网连接问题,但按照这个方式修改后并不能解决我的问题:

kafka连接问题

这里面提到了一个很重要的概念:

kafka启动后会在zookeeper的/brokers/ids下注册监听协议,包括IP和端口号,客户端连接的时候,会取得这个IP和端口号。
后来查看了kafka的配置,原来我忽视了listeners和advertised.listeners的区别,advertised.listeners才是真正暴露给外部使用的连接地址,会写入到zookeeper节点中的。于是再次进行修改,把IP配置到advertised.listeners中,问题再一次解决。

advertised.listeners才是真正的对外代理地址!
那么listeners的作用就不是对外提供服务代理,而是监听!

5.解决问题

修改server.properties的两行默认配置,即可通过外网连接服务器Kafka,问题解决:

# 允许外部端口连接                                            
listeners=PLAINTEXT://0.0.0.0:9092  
# 外部代理地址                                                
advertised.listeners=PLAINTEXT://121.201.64.12:9092
<think>好的,我现在需要帮助用户解决Java连接Kafka时出现的连接错误:“Connection to node 0 (localhost/127.0.0.1:9092) could not be established. Broker may not be available”。首先,我要回想一下常见的Kafka连接问题可能的原因,然后逐步分析可能的解决方案。 首先,用户提到错误信息指向无法连接到节点0localhost:9092,这说明Kafka broker可能没有正常运行,或者网络配置有问题。常见的解决步骤包括检查Kafka服务是否启动,确认监听地址是否正确配置,以及防火墙设置是否阻止了连接。 接下来,我需要回忆Kafka的配置文件,比如server.properties中的listeners和advertised.listeners参数是否正确设置为PLAINTEXT://localhost:9092或者对应的IP地址。有时候,Kafka可能绑定到127.0.0.1而不是0.0.0.0,导致外部连接失败。此外,检查客户端的配置是否正确,比如bootstrap.servers是否指向正确的地址和端口。 另外,还要考虑防火墙或安全组是否允许9092端口的流量。在Linux系统中,可以使用netstat或ss命令查看端口监听情况,或者用telnet测试端口连通性。如果是Windows系统,同样需要检查防火墙设置。 用户可能已经启动了Kafka,但Zookeeper没有正确运行,或者Kafka和Zookeeper之间的连接有问题。所以需要确认Zookeeper服务是否启动,并且Kafka配置中指向的Zookeeper地址是否正确。 此外,Java客户端的版本与Kafka版本是否兼容也是一个潜在问题。版本不匹配可能导致连接失败,需要检查两者的版本对应关系。 可能还需要检查客户端的错误日志,看看是否有更详细的错误信息,比如SSL配置错误或者其他网络问题。有时候,客户端的日志会提供更具体的错误原因,帮助缩小问题范围。 最后,如果以上步骤都确认无误,可能需要重新启动Kafka和Zookeeper服务,有时候服务可能出现临时问题,重启可以解决。 总结一下,解决步骤可能包括: 1. 检查Kafka和Zookeeper服务是否运行。 2. 验证Kafka配置中的listeners和advertised.listeners。 3. 检查防火墙或安全组设置。 4. 测试端口连通性。 5. 确认客户端配置正确,版本兼容。 6. 查看更详细的日志信息。 在回答中需要将这些步骤清晰地分点说明,帮助用户逐步排查问题。同时,根据用户提供的引用内容,虽然引用是关于Akka使用Netty和Protocol Buffers的,可能与当前问题关联不大,但可能需要忽略该引用,专注于Kafka相关的解决方案。</think>### Java连接Kafka时“Broker不可用”错误解决方案 出现`Connection to node 0 (localhost/127.0.0.1:9092) could not be established`错误时,通常是由于Kafka Broker未正确运行或网络配置问题导致。以下是逐步排查方法: --- #### 1. 检查Kafka服务状态 - **启动Zookeeper和Kafka** 确保Zookeeper和Kafka Broker已启动(默认端口分别为21819092): ```bash # 启动Zookeeper(需先配置zookeeper.properties) bin/zookeeper-server-start.sh config/zookeeper.properties # 启动Kafka Broker bin/kafka-server-start.sh config/server.properties ``` - **验证服务进程** 通过`jps`命令检查Java进程是否包含`QuorumPeerMain`(Zookeeper)和`Kafka`(Broker)。 --- #### 2. 检查Kafka配置 - **修改`server.properties`** 确保Broker的监听地址配置正确: ```properties listeners=PLAINTEXT://0.0.0.0:9092 advertised.listeners=PLAINTEXT://localhost:9092 ``` 如果客户端与Broker不在同一机器,需将`advertised.listeners`改为Broker的**实际IP**(而非`localhost`)。 --- #### 3. 测试端口连通性 - **使用`telnet`或`nc`命令** 验证端口是否开放: ```bash telnet localhost 9092 # 成功应显示Connected ``` - **检查防火墙** 若使用云服务器或虚拟机,需开放9092端口: ```bash # Linux开放端口示例 sudo ufw allow 9092 ``` --- #### 4. 检查客户端配置 - **Java代码中的`bootstrap.servers`** 确保与Broker的`advertised.listeners`一致: ```java properties.put("bootstrap.servers", "localhost:9092"); ``` - **版本兼容性** 确认客户端依赖(如`kafka-clients`)与Broker版本匹配。可通过Maven检查依赖: ```xml <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>3.6.0</version> <!-- 需与Broker版本一致 --> </dependency> ``` --- #### 5. 查看日志定位问题 - **Broker日志** 检查`logs/server.log`是否有异常(如端口占用、Zookeeper连接失败): ```log ERROR [KafkaServer id=0] Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) ``` - **客户端日志** 启用DEBUG日志级别,查看连接失败的具体原因: ```java properties.put("log4j.logger.org.apache.kafka", "DEBUG"); ``` --- #### 6. 其他可能性 - **Hosts文件配置** 检查`/etc/hosts`(Linux)或`C:\Windows\System32\drivers\etc\hosts`(Windows)是否包含`127.0.0.1 localhost`。 - **重启服务** 重启Zookeeper和Kafka Broker以清除临时状态: ```bash bin/kafka-server-stop.sh bin/zookeeper-server-stop.sh ``` --- ### 相关问题 1. **如何配置Kafka支持外部网络访问?** 需修改`advertised.listeners`为公网IP并开放防火墙端口[^1]。 2. **Kafka客户端连接超时如何解决?** 检查网络延迟、增大`socket.connection.setup.timeout.ms`参数值。 3. **Zookeeper在Kafka中的作用是什么?** 用于管理Broker元数据、消费者偏移量和分区领导者选举。
评论 50
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值