apache-kafka - 无法从 EC2 外部连接到 AWS 上运行的 kafka 连接集群

标签 apache-kafka amazon-ecs apache-kafka-connect

我有一个 ECS 集群,其中包含 3 个 EC2 实例,全部位于私有(private)子网中。我创建了一个任务定义来运行 Confluence 提供的 kafka-connect 镜像,并使用以下环境变量:

    CONNECT_CONFIG_STORAGE_TOPIC=quickstart-config
    CONNECT_GROUP_ID=quickstart
    CONNECT_INTERNAL_KEY_CONVERTER=org.apache.kafka.connect.json.JsonConverter
    CONNECT_INTERNAL_VALUE_CONVERTER=org.apache.kafka.connect.json.JsonConverter
    CONNECT_KEY_CONVERTER=org.apache.kafka.connect.json.JsonConverter
    CONNECT_OFFSET_STORAGE_TOPIC=quickstart-offsets
    CONNECT_PLUGIN_PATH=/usr/share/java
    CONNECT_REST_ADVERTISED_HOST_NAME=localhost
    CONNECT_REST_ADVERTISED_PORT=8083
    CONNECT_SECURITY_PROTOCOL=SSL
    CONNECT_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM=
    CONNECT_STATUS_STORAGE_TOPIC=quickstart-status
    CONNECT_VALUE_CONVERTER=org.apache.kafka.connect.json.JsonConverter

我在此集群前面有一个应用程序负载均衡器,并在端口 8083 上有一个监听器。我已正确设置目标组以包含运行 kafka-connect 的 EC2 实例。因此负载均衡器应该将请求转发到集群。确实如此,但我总是收到 502 Bad Gateway 响应。我可以 ssh 进入 EC2 实例并 curl localhost:8083 并从 kafka-connect 获取响应,但从 EC2 外部,我没有得到响应。

为了排除负载均衡器和集群之间的网络问题,我创建了一个在端口 80 上运行 Nginx 的单独任务定义,并且我能够通过负载均衡器从 EC2 实异常(exception)部成功访问它。

我感觉我没有将 CONNECT_REST_ADVERTISED_HOST_NAME 设置为正确的值。据我了解,这是客户端应该连接的主机。但是,因为我的 EC2 实例位于私有(private)子网中,所以我不知道将其设置为什么,这就是我将其设置为 localhost 的原因。我尝试将其设置为负载均衡器的 DNS 名称,但这不起作用。

最佳答案

您需要将 CONNECT_REST_ADVERTISED_HOST_NAME 设置为其他 Kafka Connect 工作线程可以解析和连接的主机或 IP。

它用于工作人员之间的内部通信,如果它是localhost,那么如果您的 REST 请求(通过负载均衡器)命中了一个不是集群当前领导者的工作人员,该工作人员将尝试使用 CONNECT_REST_ADVERTISED_HOST_NAME 将请求转发给领导者。但是,如果CONNECT_REST_ADVERTISED_HOST_NAMElocalhost,那么工作线程只会将请求转发给自己,因此事情将无法正常工作。

有关更多详细信息,请参阅 https://rmoff.net/2019/11/22/common-mistakes-made-when-configuring-multiple-kafka-connect-workers/

关于apache-kafka - 无法从 EC2 外部连接到 AWS 上运行的 kafka 连接集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58965000/

相关文章:

java - Spring Kafka - 为任何主题的分区消耗最后 N 条消息

multithreading - 在 Kafka 中设计消息键的最佳方法是什么?

apache-spark - 带有 Kafka SASL/PLAIN 身份验证的 Spark 结构化流

networking - 从我的 LAN 外部访问 Kafka 代理

java - Kafka Connect 无法将自定义存储接收器分区器转换为 Partitioner 接口(interface)

amazon-web-services - 在集群创建期间自动启动 EC2 上运行脚本

amazon-web-services - AWS ECS : get public IP of the instance container when start task is called

amazon-web-services - 如何运行 AWS ECS 任务覆盖环境变量

apache-kafka - Kafka-connect 动态添加更多主题

apache-kafka - Kafka Connect与接收器流