Flume消費內外網分流配置的Kafka時遇到的坑

靜若清池發表於2021-12-03

  網上有鋪天蓋地的文章,介紹如何將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中的多個地址返回的,是不是就選擇了第一個,還需要繼續研究一下原始碼。

相關文章