網上有鋪天蓋地的文章,介紹如何將Kafka同時配置成公網地址、內網地址,以實現內外網分流,看著都很成功。
但我們通過Flume消費一個配置了內外網分流的Kafka(版本0.10.1)叢集時遇到了坑,卻沒有從現有的文章中找到解決方案。
如果使用公有云服務,一般一臺虛擬機器只有一塊網路卡,這時內外網分流的Kafka配置方案如下:
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT listeners=INTERNAL://內網地址:9092,EXTERNAL://內網地址:19092 advertised.listeners=INTERNAL://內網地址:9092,EXTERNAL://外網地址:19092 inter.broker.listener.name=INTERNAL
在另一個公網環境中,通過Flume消費上面配置的公網Kafka地址時,通過Zookeeper拿到的卻始終是內網地址!
但是直接查詢Zookeeper,獲得的endpoints訪問地址,卻是同時包含了公網和內網地址的:
"endpoints":[內網地址及埠,公網地址及埠]
經過多次對比Kafka的配置以及從Zookeeper中獲得的endpoints值,我們大膽猜想:
是不是Zookeeper返回了endpoints中的第一個值?
如果是這樣,那我們把Kafka的配置改為公網在前,內網在後,是不是Flume通過Zookeeper獲得的Kafka地址就是公網地址了呢?
於是帶著疑問與猜想,我們把內外網分流的Kafka配置對調了一下,調整如下:
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT listeners=INTERNAL://內網地址:9092,EXTERNAL://內網地址:19092 advertised.listeners=EXTERNAL://外網地址:19092,INTERNAL://內網地址:9092 inter.broker.listener.name=INTERNAL
我們再次從Zookeeper中獲得endpoints的值如下:
"endpoints":[公網地址及埠,內網地址及埠]
通過將公網地址和內網地址的配置對調後,Flume可以成功消費到公網地址的Kafka!
至於Zookeeper如何將endpoints中的多個地址返回的,是不是就選擇了第一個,還需要繼續研究一下原始碼。