近日在云虚拟机上搭建kafka测试集群(kafka版本2.8.2),由于云虚拟机只配置了内网网卡,在配置kafka的config/server.properties时,将listeners配置为内网IP+端口。这样Kafka在内网是可以访问成功的。
listeners=PLAINTEXT://192.168.1.136:9092
为了可以在办公网进行数据测试,对云虚拟机增加了外网地址映射。例如映射8.8.8.8 ->192.168.1.136 。这时通过外网ip,8.8.8.8:9092访问kafka,虽然路由上是可以连通的,但由于配置了Kafka只监听192.168.1.136:9092,导致要求无法正常建立连接。这时请求会报tcp time out/ connect time out.
为了实现可能用外网映射ip访问kafka,需要更新kafka的配置。我们知道Kafka涉及服务IP端口监听的主要有两个配置:advertised.listeners和listeners。
advertised.listeners是发布到zookeeper上供client使用的IP端口。假设我们一个3节点Kafka集群。分别配置为
#broker1
advertised.listeners=PLAINTEXT://192.168.1.136:9092
#broker2
advertised.listeners=PLAINTEXT://192.168.1.137:9092
#broker3
advertised.listeners=PLAINTEXT://192.168.1.138:9092
这里zookeeper上保存的信息为
{"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://192.168.1.136:9092"],"jmx_port":-1,"features":{},"host":"192.168.1.136","timestamp":"1679317596175","port":9092,"version":5}
zk中的endpoints就是advertised.listeners上配置的IP端口。我们通过一个192.168.1.136:9092地址访问kafka,client会通过协议查询到所有的broker-endpoints,然后通过endpoint能broker进行访问。
配置中,PLAINTEXT://192.168.1.136:9092,PLAINTEXT是服务命名,一个服务命名,对应一个服务协议。一般情况下使用的是默认的命名协议映射,使用listener.security.protocol.map进行配置。默认值是
listener.security.protocol.map=PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
为了实现内外网访问,我们定义两种访问服务INTERNAL(内网),EXTERNAL(外网)。内外网配置的协议都是PLAINTEXT。
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
然后配置client使用的advertised.listeners
advertised.listeners=INTERNAL://192.168.1.136:9092,EXTERNAL://8..8.8.8:19092
再配置kafka内服务使用的listeners
listeners=INTERNAL://192.168.1.136:9092,EXTERNAL://192.168.1.136:19092
指定broker间使用的协议为
inter.broker.listener.name=INTERNAL
这样就可以实现区分内外网ip访问kafka服务。
版权归原作者 大数据点灯人 所有, 如有侵权,请联系我们删除。