關於Kafka遠端生產和消費的額外說明
阿新 • • 發佈:2019-01-03
網上有太多此類帖子,然而本帖比他們全面。
背景
有一臺阿里雲伺服器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是絕對監聽不到的。所以這類情況需要把配置地址改掉。普遍情況是在兩塊網絡卡,遠端呼叫的機器和哪一塊網絡卡處於同一個環境就要把地址換成哪一塊網絡卡的地址。