内外网分开访问AWS上kafka集群

aws上的服务是有内网ip和外网ip区分的。我们在aws内部环境运行程序需要指定内网ip,在外网访问时需要指定外网ip。但是broker是只能配置一个ip的,我们怎么做呢?

首先要了解一下几个配置:

host.name

已弃用。 仅当listeners属性未配置时被使用,已用listeners属性代替。表示broker的hostname

advertised.host.name

已弃用。仅当advertised.listeners或者listeners属性未配置时被使用。官网建议使用advertised.listeners。该配置的意思是这册到zookeeper上的broker的hostname或ip。是提供给客户端与kafka通信使用的。如果没有设置则使用host.name

listeners

需要监听的URL和协议,如:PLAINTEXT://myhost:9092,SSL://:9091 CLIENT://0.0.0.0:9092,REPLICATION://localhost:9093。如果未指定该配置,则使用java.net.InetAddress.getCanonicalHostName()函数的的返回值

advertised.listeners

注册到zookeeper上并提供给客户端的监听器,如果没有配置则使用listeners。如果listeners也没有配置则使用java.net.InetAddress.getCanonicalHostName()函数的的返回值
从上诉配置我们很清楚的了解了该如何配置hostname,但是我们如何把外网ip注册到zookeeper呢,答案是不可能的,因为内网是不识别外网ip的。

网上一些道友的解决方法如下:

listeners=PLAINTEXT://0.0.0.0:9092 
advertised.listeners=PLAINTEXT://x.x.x.x:9092
x.x.x.x为外网ip。

想法很丰满,直接把外网ip注册给zookeeper,这样客户端就可以识别到外网ip进行访问了。但现实很骨感,内网是不识别外网ip的,这样把外网ip配置进去,会导致内网访问也会通过公网ip连接。
解决方案
1、修改server.properties配置文件

listeners=PLAINTEXT://kafka1:9092   (好像可以不添加)
advertised.listeners=PLAINTEXT://kafka1:9092   

2、修改aws上broker的/etc/hosts文件

[内网ip]    kafka1

3、修改外网访问服务器上的/etc/hosts文件

[外网ip]    kafka1

注意:这里拿一个节点举例,集群其他节点也如此配置。
此处的kafka1 必须为机器的hostname,不能自己随便写

另一个道友的回答

listeners和advertised.listeners都写成PLAINTEXT://hostname:9092,
命令消费时也都用hostname替代真实ip,只不过内网客户端hosts配置hostname映射成内网ip,外网客户端配置成外网ip就好了

原文来自,对其进行了修改和添加:
https://blog.csdn.net/xiaoyu_BD/article/details/82496257

你可能感兴趣的:(linux运维)