近期在进行服务器的集群搭建,使用kafka作为消息中间件来进行消息的分发。开始在本机编写demo验证的时候很顺利,没有遇到什么问题。今天consumer部分编写完毕,准备对接,中间出了很多问题,记录一下。
首先是第一个问题,连接被refused了。
此问题比较常见,关闭服务器针对该端口的防火墙。然后在zookeeper配置文件中加入如下内容,ip是我测试主机在局域网内的ip
server.1=192.168.2.123:2888:3888
配置zookeeper集群和kafka集群中配置文件添加该服务器的ip,类似的其他两个配置文件中内容就不再写了。因为同时打开了防火墙,修改完配置文件后重启测试解决,所以具体是那个原因造成的不是特别清楚,但是这两步应该都是要做的。
之后就遇到第二个问题了
WARN Fetching topic metadata with correlation id 0 for topics [Set(test)] from broker [id:0,host:192.168.1.8,port:9092] failed (kafka.client.ClientUtils$)
所以我当时就蒙逼了,这个192.168.1.8是个什么情况。内网是通过一个连接到电信光纤路由器的交换机来进行连接的,ip都是在.2上的,.1.8我是无论如何也没有找到这个ip的来历。
之后在stackoverflow上找到了一个解决办法,开始没怎么理解。
The broker tells the client which hostname should be used to produce/consume messages. By default Kafka uses the hostname of the system it runs on. If this hostname can not be resolved by the client side you get this exception.
You can try setting advertised.host.name in the Kafka configuration to an hostname/address which the clients should use.
后来研究了一番,kafka是通过zookeeper来维护集群信息的,通过zookeeper找到Broker,然后尝试连接Broker。这个问题就是由于kafka发送的ip错误造成的,虽然不知道kafka是如何得到这个错误ip的,但是在配置文件中添加
advertised.host.name=192.168.2.145
还是成功解决了问题,此设置是强行设置kafka的反馈ip,stackoverflow太给力