Load-Balancing
NAT/LB 後面的 Apache Kafka 配置
為了使我們的 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 內部元數據主題)