我们在具有以下server.properties的EC2实例中运行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主机名无法从外部网络访问。我们在这里缺少什么? / p>
答案 0 :(得分:1)
这是您的问题:
[负载均衡器的]目标组指向实际的EC2代理IP和端口(9092)
实际上,您是将外部流量转发到内部(9092)侦听器。使用LB时,如果需要,您可以具有任何外部端口-此处的关键是网络流量到达Kafka代理的时刻。如果来自LB的流量在9092上击中了中间商,则中间人正在使用比您定义的内部侦听器。
更改LB以将流量路由到您的外部侦听器,端口36379
参考:https://rmoff.net/2018/08/02/kafka-listeners-explained/(我知道您已经看过,但会帮助其他人找到此答案)