Load-Balancing

NAT/LB 後面的 Apache Kafka 配置

  • March 4, 2022

為了使我們的 Kafka 集群既可以從 Internet 也可以從我們的專用網路使用,我們認為可以這樣配置 Kafka:

Private VIP:9000 => All brokers:9092 (topology query only)
Private VIP:9001 => Broker #1:9092
Private VIP:9002 => Broker #2:9092
...
Public VIP:9000 => All brokers:9092 (topology query only)
Public VIP:9001 => Broker #1:9092
Public VIP:9002 => Broker #2:9092
...

我們以這種方式配置了負載均衡器,然後是我們的代理:

listeners=PLAINTEXT://<server_priv_ip>:9092
advertised.listeners=INTERNAL://<private_VIP>:9001,EXTERNAL://<public_vip>:9001
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
inter.broker.listener.name=INTERNAL

現在,正如您所料,Kafka 代理不會啟動:

ERROR Exiting Kafka due to fatal exception (kafka.Kafka$)
java.lang.IllegalArgumentException: requirement failed: Each listener must have a different port, listeners: INTERNAL://<private_VIP>:9001,EXTERNAL://<public_vip>:9001

從我的管理員的角度來看,我的方法是完全合乎邏輯的,儘管我預計生產者/消費者會從他們聯繫經紀人的任何地方獲得兩個地址的問題。在 2 個不同的地址上使用相同的埠似乎是合乎邏輯的,並且可以提高畫質晰度……

**第一個問題:**為什麼這是錯誤的?

**第二個問題:**如果不是這樣,我怎樣才能實現我的目標?(大多數選項都在桌面上)

我們已經與 Kafka 專家進行了交談,這就是結果。

簡而言之,雖然 kafka 在其知識中具有偵聽器名稱來區分 2 個偵聽器,但他需要知道連接的客戶端想要到達哪個偵聽器,並且只能使用傳入埠這樣做。

如果偵聽器和廣播的偵聽器具有相同的埠,它們也會相互映射,因此您需要它們匹配。

最後,這就是我們所做的:

listeners=INTERNAL://hostname:900N,EXTERNAL://hostname:910N,REPLICATION:hostname:9092
advertised.listeners==INTERNAL://vip:900N,EXTERNAL://vip:910N,REPLICATION:hostname:9092  
listeners.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,REPLICATION:PLAINTEXT
inter.listener.protocol=REPLICATION

其中“N”是經紀人 ID(從 1 開始計數)

在負載均衡器上,我們將 VIP 的每個埠映射到代理的 IP 地址以及埠 9000(內部網路)和 9100(外部網路)上的虛擬 IP,它們映射到每個代理的相關偵聽器。

這有點矯枉過正,但它可以按預期工作(只要__consumer_offset複製 kafka 內部元數據主題)

引用自:https://serverfault.com/questions/933791