kafka外网转发

半兽人 发表于: 2019-09-24   最后更新时间: 2019-11-16  

很多人都因为配置kafka外网转发而困扰,我这里统一讲一下原理和原因。

场景假设

比如你有一个kafka集群,在阿里云上,该集群有2个broker,AB

kafka集群:

  • A内网:172.10.0.2 外网:10.0.21.1
  • B内网:172.10.0.1 外网:10.0.21.2

server.properties配置

config/server-1.properties: 
    broker.id=1 
    listeners=PLAINTEXT://172.10.0.1:9092

config/server-2.properties: 
    broker.id=2 
    listeners=PLAINTEXT://172.10.0.2:9092
  • 配置内网地址即可,就可以通过外网访问了(10.0.21.1:9092 和 10.0.21.2:9092 可以通,但是如果用kafka客户端连接会报超时)

你想通过你的电脑来访问kafka集群,也就想访问10.0.21.1:909210.0.21.2:9092

注意,我额外加一层场景,转发,复杂一点,但是原理相同。

路由转发,比如:

11.10.21.1  -> 10.0.21.1
11.10.21.2  -> 10.0.21.2
  • 11.10.21.x 为又加了一层转发ip

测试

这时,如果你通过11.10.21.1:909211.10.21.2端口都是通的,但是访问kafka发送或消费消息时,会报网络超时,这是为什么呢?

因为kafka客户端是主动发现集群地址的,当你通过11.10.21.1:9092确实是连接到kafka集群了,kafka集群返回给你的ip列表是你listeners配置的,也就是

172.10.0.1:9092
172.10.0.2:9092

你的ip转发和端口都没有用,这就是所有转发外网等等的本质原因。

解决

最简单的方式是客户端通过域名映射的方式。

修改kafka集群服务端的server.properties配置

config/server-1.properties: 
    broker.id=1 
    listeners=PLAINTEXT://kafka-1:9092

config/server-2.properties: 
    broker.id=2 
    listeners=PLAINTEXT://kafka2:9092

kafka集群的服务端,配置hosts

cat /etc/hosts
172.10.0.1 kafka-1
172.10.0.2 kafka-2

本机客户端,配置hosts

cat /etc/hosts
11.10.21.1 kafka-1
11.10.21.2 kafka-2

客户端访问kafka集群时,获取的是kafka-1:9092kafka-2:9092,通过客户端配置的hosts映射,都转成了对应的外网的ip,因此就可以访问了。

注意:端口要一致,hosts映射只转ip。



您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容




上一条: 手把手教你写Kafka Streams程序
下一条: kafka实战SSL

  • 服务端三个节点,可以只配置kafka单个节点A对外转发吗,能不能客户端访问集群的时候只通过这一个节点A(只有一个服务器的外网ip)进行访问。目前我在3个节点的服务器上配置了节点A的hosts:172.10.0.1 kafka-1。然后客户端配置了节点A的外网hosts映射:11.10.21.1 kafka-1,连接配置bootstrap-servers: kafka-1:9092。但客户端访问节点A的时候却是报错了

    映射外网之后端口不一致,这个怎么解决