有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
kakfa是主动发现其他的集群地址的,
172.50.63.1虽然可以通,但是获取到内部的地址还是不能通。
建议你用域名做映射,参考:kafka外网转发
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配置有问题吧?
0.0.0.0换成域名地址,集群内的域名映射配置内网地址。
客户端连接用域名,每个都要配,配外网地址
谢谢,映射做好了,启动一台kafka的时候没问题,启动多台就找不到leader了,因为leader在别的机器了。头疼
都做映射吧。
我改用niginx做的映射,用的三个server配置有三个端口 映射三台机器,但是我本机的hosts只能一个写外网那台做映射的
props.put("bootstrap.servers", "node1:9092");还有2个映射端口,应该是node2,和node3我不知道咋写这个配置了。麻烦大佬指点下
就是leader跑到node3去了,但是我本地没有node3的hosts所以才会找不到,但是本机只有一个hosts配置 172.50.63.1 node1 怎么才能写三个呢
我搞定了,advertised.listeners=PLAINTEXT://代理的ip:代理的端口 每台kafka都配成相应的代理就行了
我发现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就行
~(≧▽≦)/~
你的答案