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

提问说明

有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






发表于: 2月前   最后更新时间: 2月前   游览量:322
上一条: 到头了!
下一条: 已经是最后了!

  • kakfa是主动发现其他的集群地址的,
    172.50.63.1虽然可以通,但是获取到内部的地址还是不能通。
    建议你用域名做映射。
    • 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配置有问题吧?
        • 我改用niginx做的映射,用的三个server配置有三个端口 映射三台机器,但是我本机的hosts只能一个写外网那台做映射的
          props.put("bootstrap.servers", "node1:9092");还有2个映射端口,应该是node2,和node3我不知道咋写这个配置了。麻烦大佬指点下
            • 就是leader跑到node3去了,但是我本地没有node3的hosts所以才会找不到,但是本机只有一个hosts配置 172.50.63.1 node1 怎么才能写三个呢
                • 我发现props.put("bootstrap.servers", "node1:9092") 这个配置 直接写外网ip也可以,看来重点还是advertised.listeners和nginx代理的配置
                    • 总结出来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就行