之前一直可以本地启动的kafka服务突然之间就启动失败了, 一直报错。查看日志controller.log发现报错信息:
java.io.IOException: Connection to 172.16.4.223:9092 (id: 1 rack: null) failed.
at org.apache.kafka.clients.NetworkClientUtils.awaitReady(NetworkClientUtils.java:71)
at kafka.controller.RequestSendThread.brokerReady(ControllerChannelManager.scala:289)
at kafka.controller.RequestSendThread.doWork(ControllerChannelManager.scala:243)
at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96)
尝试了很多博客说的方式,包括清空日志, 删除zookeeper信息等等,重试后还是一直报错,并不能实际解决问题;因此只能自己探索
1、 首先考虑为什么连接不到这个地址,是不是端口被占用了?
lsof -i:9092
发现并没有端口占用
2、 接着考虑这个地址连接是不是有问题?查看本机的ip地址信息:
ifconfig
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=400<CHANNEL_IO>
ether 3c:06:30:3e:8f:35
inet6 fe80::1c2f:8742:5028:ac53%en0 prefixlen 64 secured scopeid 0xb
inet 172.16.4.225 netmask 0xfffffc00 broadcast 172.16.7.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
为什么本机的IP地址是172.16.4.225, kafka却要连接172.16.4.223呢?,这个时候就该看一下kafka server的配置文件了
cat config/server.properties
# The address the socket server listens on. It will get the value returned from
# java.net.InetAddress.getCanonicalHostName() if not configured.
# FORMAT:
# listeners = listener_name://host_name:port
# EXAMPLE:
# listeners = PLAINTEXT://your.host.name:9092
# listeners=PLAINTEXT://localhost:9092
发现默认的 listeners被注释掉了,看详细注释里说,如果该配置未指定的话,则通过java.net.InetAddress.getCanonicalHostName()获取ip地址, 是不是这个获取的有问题呢?赶紧写个代码段查看一下通过java获取的localhost是不是有问题?
public static void main(String[] args) throws UnknownHostException {
System.out.println(InetAddress.getLocalHost());
}
发现果然是java获取的ip地址有问题
最后尝试把该配置取消注释,并且修改成:listeners=PLAINTEXT://localhost:9092
保存,重启kafka, 启动成功了!!!!!!
至于为什么java获取的localhost ip地址是223并没有深究了,java不在研究范围内,如有大佬了解的话,烦请告知一二,感激不尽