Amazon web services Kafka EC2:“播发的.侦听器”和“侦听器”的配置问题

Amazon web services Kafka EC2:“播发的.侦听器”和“侦听器”的配置问题,amazon-web-services,amazon-ec2,apache-kafka,Amazon Web Services,Amazon Ec2,Apache Kafka,我们在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-log

我们在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:9092中只有一个值,并进行了广告。listeners=PLAINTEXT://我们的外部端点:36379,但没有运气。要从外部EC2网络生产/消费,我认为在元数据中,应该返回我们的外部点,因为外部网络无法访问内部EC2主机名。这里缺少什么?

这是您的问题:

[load balancer's]目标组指向实际的EC2代理IP和端口9092

实际上,您正在将外部通信转发给内部9092侦听器。使用LB,如果需要,您可以拥有任何外部端口-这里的关键是网络流量到达Kafka代理的点。如果来自LB的流量击中9092上的代理,则代理使用的是您定义的内部侦听器

更改LB以将流量路由到外部侦听器端口36379


Ref:我知道您已经看到了,但这将帮助其他人发现这个答案

您的负载平衡器是如何配置的?如果您尝试直接连接到EC2实例而不是通过LB连接,会发生什么?我想先从等式中去掉它。@RobinMoffatt我们可以直接从EC2实例创建/使用/生成数据,没有问题。例如,我们可以使用以下命令进行使用:./kafka console consumer-bootstrap server localhost:9092-topic from_EC2-从一开始。关于LB:our_endpoint->LB->target group,目标组指向实际的EC2代理IP和端口9092。然后,端点外部端口36379从我们的网络中被列入白名单。我不怀疑这里的端点连接有任何问题,因为我们能够访问代理并获取元数据。我只是指你的博客!谢谢,这正是问题所在。我的印象是,客户会尝试连接到广告中提到的每个端点。听众们一个接一个,显然是我这边的误解。