Kafka:将集群端口映射到公网访问

关于kafka代理,一般来说kafka是用在内网的,这个需求很少有人会碰到,所以目前网上的教程很少有直接将kafka映射到公网的教程,大多数教程都是用nginx将kafka服务转为http。

这块记录一下我的案例。

有内网kafka节点3个,需要通过代理或者转发把kafka服务暴露在公网上。但是只提供一个IP,尽可能少的开放端口。

解决方案:

一开始我想着用nginx做tcp代理,结果失败了,大概是这个样子。

nginx代理kafka

为什么失败呢?因为经过一番查找资料发现kafka有个比较特殊的机制,produce/consumer 客户端链接kafka之后可以随时获取元数据,这个元数据包含了kafka配置的监听地址和topic分区主节点等等。

用nginx代理tcp,nginx有自己的负载均衡策略,每一次数据请求没法准确的推送到topic分区主节点的那个broker上,所以会出现一会儿数据生产成功一会儿又提示LEADER_NOT_AVAILABLE。消费者也只能消费到一部分数据。

所以nginx代理的方式走不通了。

搞清楚问题原因之后,就想到了tcp转发。不能用1个IP和端口就访问kafka集群,那1个IP多个端口也是能接受的。

接下来说一下具体的配置。

1.kafka配置:

#broker1
advertised.listeners=EXTERNAL_LISTENER://kafka01:18088
#broker2
advertised.listeners=EXTERNAL_LISTENER://kafka02:18089
#broker3
advertised.listeners=EXTERNAL_LISTENER://kafka03:18090

2.客户端配置:

在host文件中把kafka01、kafka02、kafka03都映射到公网地址。这个很关键,上面提到过客户端会获取到kafka配置的元数据 ,客户端会获取到 kafka01、kafka02、kafka03 这3个hostname,之后生产或消费数据会直接通过这个地址访问。如果不把这三个hostname重新映射到公网IP,就不能成功生产或者消费数据。

#/etc/hosts
www.cosmozhu.fun kafka01
www.cosmozhu.fun kafka02
www.cosmozhu.fun kafka03

3.通过防火墙策略将18088、18089、18090映射到公网。

4.通过kafka01:18088、kafka02:18089、kafka03:18090 访问kafka集群。


作者:cosmozhu –90后的老父亲,专注于保护地球的程序员
个人网站:https://www.cosmozhu.fun
欢迎转载,转载时请注明出处。