网上有太多此类帖子,然而本帖比他们全面。
背景
有一台阿里云服务器A,用作测试服务器,一台华为服务器B,用作生产服务器。均搭建相同配置和版本Apache Kafka。现在需远程生产和消费Kafka。在服务器B均无错误,在服务器A死活不通。
问题排查
iptable input和output均打开Kafka端口。
telnet通。
log没有任何报错,就是没接收到。
tcpdump检测两台机器发送的tcp包是一样的。
原因分析
首先,可以肯定网上的说法是没错的。Kafka监听的地址(listeners)和广播的地址(advertised.listeners)是会有默认值的。但是为什么服务器A行不通,服务器B行得通呢?这点目前应该没有文章提到过。就是网卡数量。
华为服务器只有一块网卡,网卡地址是常用局域网地址
192.168.xxx.xxx
所以发送给该服务器的TCP报文会通过路由网关转发到该网卡。无论是外网内网最终都只会指向一个地址。针对此类情况,网上绝大多数文章所说指定监听和广播地址的做法是没有必要的。
而阿里云不同了,阿里云服务器有两块网卡,内网网卡编号eth0,外网网卡编号eth1,如果不指定Kafka配置的地址,默认监听内网网卡eth0,而远程访问一定是访问eth1,则Kafka是绝对监听不到的。所以这类情况需要把配置地址改掉。普遍情况是在两块网卡,远程调用的机器和哪一块网卡处于同一个环境就要把地址换成哪一块网卡的地址。