我们在ec2示例中使用以下server.properties运行kafka:
# The id of the broker. This must be set to a unique integer for each broker.
broker.id=10
# A comma seperated list of directories under which to store log files
log.dirs=/tmp/kafka-logs
log.dirs=/tmp/kafka-logs
# add all 3 zookeeper instances ip here
zookeeper.connect=ip1:2181,ip2:2181,ip3:2181,ip4:2181,ip5:2181
zookeeper.connection.timeout.ms=6000
# Addition of listeners
listeners=EXTERNAL://0.0.0.0:36379,INTERNAL://0.0.0.0:9092
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
advertised.listeners=EXTERNAL://our-external-endpoint:36379,INTERNAL://ec2-hostname:9092
inter.broker.listener.name=INTERNAL
我们必须从ec2网络外部访问代理,因为每个代理都有一个端点(配置NLB以指向实际代理)。我们可以从端点远程登录到实际代理。甚至我们可以使用外部端点作为引导服务器获取元数据,如下所示:
kafkacat -b our-external-endpoint:36379 -L
Metadata for all topics (from broker -1: our-external-endpoint:36379/bootstrap):
6 brokers:
broker 10 at compute1.internal:9092
broker 20 at compute2.internal:9092 (controller)
broker 40 at compute3.internal:9092
broker 30 at compute4.internal:9092
broker 50 at compute5.internal:9092
broker 60 at compute6.internal:9092
4 topics:
topic "from_ec2" with 1 partitions:
...
但是我们得到的是实际的内部主机名,而不是外部主机名。在zkcli中,我们可以看到以下数据:
get /brokers/ids/10
{"listener_security_protocol_map":{"EXTERNAL":"PLAINTEXT","INTERNAL":"PLAINTEXT"},"endpoints":["EXTERNAL://our-external-endpoint:36379","INTERNAL://compute1.internal:9092"],"jmx_port":-1,"host":"our-external-endpoint","timestamp":"1575456980136","port":36379,"version":4}
因此,我们的端点配置没有问题,因为我们可以使用端点获取元数据。那么,一定是配置有问题,我们尝试了组合,例如在中只有一个值 listeners=PLAINTEXT://0.0.0.0:9092)
以及 advertised.listeners=PLAINTEXT://our-external-endpoint:36379
但是运气不好。要从外部ec2网络生成/使用,我认为在元数据中应该返回外部点,因为外部网络无法访问内部ec2主机名。我们缺少什么?
1条答案
按热度按时间w6lpcovy1#
你的问题是:
[负载平衡器的]目标组指向实际的ec2代理ip和端口(9092)
实际上,您正在将外部流量转发给内部(9092)侦听器。有了lb,你可以有任何外部端口,如果你想的话-这里的关键是网络流量到达kafka代理的点。如果来自lb的流量正在9092上访问代理,那么代理使用的内部侦听器超出了您的定义。
更改lb以将流量路由到外部侦听器端口
36379
裁判:https://rmoff.net/2018/08/02/kafka-listeners-explained/ (我知道你已经看到了,但会帮助其他人发现这个答案)