Connection to node -0 could not be established. Broker may not be available

搜索了很多网络知识,得到这个问题的解决办法有下列三种

  1. 确认服务已经启动
  2. 关闭防火墙
  3. 在kafka的应用下/config/server.properties下找到#listeners=PLANTEXT://9092,去掉井号,并且将服务器ip或者域名加入到PLANTEXT:的后面,其中PLANTEXT是kafka默认使用的通信协议。在这个文件中,还有一个advertised.listeners的配置,这个主要用来配置公网ip

 

对于第三点,我有点不是很理解,为什么服务端需要显示的指定ip,为什么?

还是决定自己寻找答案

: [Producer clientId=producer-1] Connection to node 0 could not be established. Broker may not be available. java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for msg-for-test-acks-0: 30044 ms has passed since last append

对于这个错误信息,我开始重新整理思路,这段英文的意思是不能连接到node0节点,节点可能是不可用的。

我先进行网络连通的一个确认,发现telnet ip port是通的,但还是有点不甘心,于是我试着配错地址,去获取一个报错,错误日志如下

org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 3000 ms.

那么问题不是出在客户端配置错地址的问题上。

Connection to node 0 could not be established,Broker may not be available 因为 node0 是没有建立连接的,estabished是TCP中的一个状态 ,说明node0 没有成功建立连接的,导致broker是不可用的。为什么不能建立连接,网络明明是通的。说明node0建立连接的方式或者信息可能存在问题,通过查看源码知道,node0的信息来自于元数据,而元数据的加载来自于客户端与broker之间的通信,broker的元数据存储在zookeeper上。那么我查看了zookeeper的节点信息,发现如下

 

Connection to node -0 could not be established. Broker may not be available_第1张图片

发现了PLAINTEXT://master:9092 这个地址,难道node0 是与master:9092建立连接?我要怎么验证这个猜想呢,于是我在本地的hosts文件追加了ip master 的对应关系,重新运行程序,果然奏效。那么为什么broker会将master写入到zookeeper的节点呢,这个时候会想起了kafka的server.properties文件的listeners配置项,恍然大悟。

 

你可能感兴趣的:(kafka)