kafka 集群映射端口到外网,外网无法生产消息

Elwyn 发表于: 2019-03-10   最后更新时间: 2022-09-02 19:41:37   6,791 游览

有3台kafka
ip分别是内网ip

192.168.2.21   9092
192.168.2.22   9092
192.168.2.23   9092

另有一台同时接通了内网和互联网的机器(内网ip 192.168.2.13,外网ip 172.50.63.1),
现在用这台机器做了端口映射,用的rinetd

0.0.0.0  9092  192.168.2.21  9092
0.0.0.0  9093  192.168.2.22  9092
0.0.0.0  9094  192.168.2.23  9092

然后在自己开发电脑上用java代码生产消息 topic=ffff

props.put("bootstrap.servers", "172.50.63.1:9092");

会产生如下报错

java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Batch containing 1 record(s) expired due to timeout while requesting metadata from brokers for ffff-0
    at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.valueOrError(FutureRecordMetadata.java:65)
    at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.get(FutureRecordMetadata.java:52)
    at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.get(FutureRecordMetadata.java:25)
    at Producer.run(Producer.java:140)
Caused by: org.apache.kafka.common.errors.TimeoutException: Batch containing 1 record(s) expired due to timeout while requesting metadata from brokers for ffff-0

这是我的kafka配置

listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://192.168.2.13:9092

现在的疑问是:
这个配置应该写什么?才能让外网能够正常生产
advertised.listeners应该写互联网ip 172.50.63.1 还是做映射的那台内网ip 192.168.2.13

发表于 2019-03-10
添加评论

kakfa是主动发现其他的集群地址的,
172.50.63.1虽然可以通,但是获取到内部的地址还是不能通。
建议你用域名做映射,参考:kafka外网转发

Elwyn -> 半兽人 5年前

0.0.0.0 9092 node1 9092
0.0.0.0 9093 node2 9092
0.0.0.0 9094 node3 9092

端口映射改成这样了,同时所有机器加了hosts
192.168.2.21 node1
192.168.2.22 node2
192.168.2.23 node3
192.168.2.13 neirece1 (这台就是做端口映射的)

kafka的配置改成了
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://neirece1:9092

java代码用的配置是
本机外网电脑的hosts加了
125.72.63.51 neirece1
bootstrap.servers", "neirece1:9092

这样出现新的报错
[2019-03-12 00:12:48]WARN org.apache.kafka.clients.NetworkClient 600 handleResponse - Error while fetching metadata with correlation id 0 : {ffff=LEADER_NOT_AVAILABLE}
感觉是连上了,但是找不到leader,应该是kafka的listeners和advertised.listeners配置有问题吧?

半兽人 -> Elwyn 5年前

0.0.0.0换成域名地址,集群内的域名映射配置内网地址。
客户端连接用域名,每个都要配,配外网地址

Elwyn -> 半兽人 5年前

谢谢,映射做好了,启动一台kafka的时候没问题,启动多台就找不到leader了,因为leader在别的机器了。头疼

半兽人 -> Elwyn 5年前

都做映射吧。

Elwyn -> 半兽人 5年前

我改用niginx做的映射,用的三个server配置有三个端口 映射三台机器,但是我本机的hosts只能一个写外网那台做映射的
props.put("bootstrap.servers", "node1:9092");还有2个映射端口,应该是node2,和node3我不知道咋写这个配置了。麻烦大佬指点下

Elwyn -> Elwyn 5年前

就是leader跑到node3去了,但是我本地没有node3的hosts所以才会找不到,但是本机只有一个hosts配置 172.50.63.1 node1 怎么才能写三个呢

Elwyn -> Elwyn 5年前

我搞定了,advertised.listeners=PLAINTEXT://代理的ip:代理的端口 每台kafka都配成相应的代理就行了

Elwyn -> Elwyn 5年前

我发现props.put("bootstrap.servers", "node1:9092") 这个配置 直接写外网ip也可以,看来重点还是advertised.listeners和nginx代理的配置

Elwyn -> Elwyn 5年前

总结出来2个条件

1.客户端本机hosts还是要加
172.50.63.1 代理那台机器的主机名

2.advertised.listeners=PLAINTEXT://代理那台机器的主机名:端口
两个主机名要一致

代码里可以写主机名或ip都行,但是客户端必须要配置hosts
props.put("bootstrap.servers", "172.50.63.1:9092,172.50.63.1:9093,172.50.63.1:9094");

3.nginx代理配置直接用ip就行

半兽人 -> Elwyn 5年前

~(≧▽≦)/~

你的答案

查看kafka相关的其他问题或提一个您自己的问题