很多人都因为配置kafka外网转发而困扰,我这里统一讲一下原理和原因。
比如你有一个kafka集群,在阿里云上,该集群有2个broker,A
和B
。
kafka集群:
A
内网:172.10.0.2 外网:10.0.21.1B
内网:172.10.0.1 外网:10.0.21.2server.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:9092
和10.0.21.2:9092
:
注意,我额外加一层场景,转发,复杂一点,但是原理相同。
路由转发,比如:
11.10.21.1 -> 10.0.21.1
11.10.21.2 -> 10.0.21.2
这时,如果你通过11.10.21.1:9092
和11.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:9092
和kafka-2:9092
,通过客户端配置的hosts映射,都转成了对应的外网的ip,因此就可以访问了。
注意:
- 端口要一致,hosts映射只转ip。
- 端口不能共用,每个转发对应一个端口。