机器有两块网卡,kafka的host.name
开始只绑定在了内部IP上,另一块对外网卡无法访问,把值设置为空的话会kafka监听端口在所有的网卡上绑定,但是在外网访问时,客户端又遇到了java.nio.channels.ClosedChannelException
异常信息,server端用tcpdump分析的时候发现客户端有传递kafka所在机器的机器名过来。在client里断点跟踪一下发现是findLeader
的时候返回的元信息是机器名而不是IP。客户端无法解析这个机器名所以出现了前面的异常。
在server.properties 里还有另一个参数是解决这个问题的, advertised.host.name参数用来配置返回的host.name值,把这个参数配置为外网IP地址即可。
这个参数默认没有启用,默认是返回的java.net.InetAddress.getCanonicalHostName
的值,在我的mac上这个值并不等于hostname
的值而是返回IP,但在linux上这个值就是hostname
的值。