Flume消费内外网分流配置的Kafka时遇到的坑

网上有铺天盖地的文章,介绍如何将Kafka同时配置成公网地址、内网地址,以实现内外网分流,看着都很成功。
但我们通过Flume消费一个配置了内外网分流的Kafka(版本0.10.1)集群时遇到了坑,却没有从现有的文章中找到解决方案。
如果使用公有云服务,一般一台虚拟机只有一块网卡,这时内外网分流的Kafka配置方案如下:

listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXTlisteners=INTERNAL://内网地址:9092,EXTERNAL://内网地址:19092advertised.listeners=INTERNAL://内网地址:9092,EXTERNAL://外网地址:19092inter.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:PLAINTEXTlisteners=INTERNAL://内网地址:9092,EXTERNAL://内网地址:19092advertised.listeners=EXTERNAL://外网地址:19092,INTERNAL://内网地址:9092inter.broker.listener.name=INTERNAL

我们再次从Zookeeper中获得endpoints的值如下:
"endpoints":[公网地址及端口,内网地址及端口]

通过将公网地址和内网地址的配置对调后,Flume可以成功消费到公网地址的Kafka!
【Flume消费内外网分流配置的Kafka时遇到的坑】 至于Zookeeper如何将endpoints中的多个地址返回的,是不是就选择了第一个,还需要继续研究一下源代码。

    推荐阅读