【问题标题】:Kafka Listeners - how many?卡夫卡听众——有多少?
【发布时间】:2022-01-22 16:29:35
【问题描述】:

更新 我正在更新这篇文章以反映当前的配置(并且,在@OneCricketeer 响应之后,更多信息)

根据this 2018 blog(每个人似乎都提到)我正在使用此配置运行 Kafka(在 Docker Compose 堆栈中):

KAFKA_LISTENERS: DOCKER://kafka0:29092,LOCAL://localhost:9092
KAFKA_ADVERTISED_LISTENERS: DOCKER://kafka0:29092,LOCAL://localhost:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: DOCKER:PLAINTEXT,LOCAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: DOCKER

Kafka 代理应该同时监听端口 29092(在 Docker 网络“内部”使用)和端口 9092(由运行在主机上的客户端使用)。

问题是 Kafka 代理似乎在像这样启动时在端口 29092 上响应:

    image: confluentinc/cp-kafka:7.0.1
    hostname: kafka
    container_name: kafka
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"

(environment 同上)

使用kafkacat,这是我通过上面的配置得到的:

└─( nc -vz localhost 9092
Connection to localhost 9092 port [tcp/*] succeeded!

└─( kafkacat -b localhost:9092 -L 
% ERROR: Failed to acquire metadata: Local: Broker transport failure

端口 29092 上的打开和连接“按预期”工作,只是我必须绕过 /etc/hosts 以使 kafka0 指向 127.0.0.1,正如所指出的那样,这是一个非常糟糕的主意(因此整个这个问题的重点)。

那篇 Confluent 博客中的图表和文字让我相信,要么我在容器的配置中遗漏了某些东西,要么事情自 2018 年以来发生了变化。

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    所以我终于解开了这个谜,部分感谢this question

    TL;DR 版本是 listeners 配置的 host 部分与 advertised.listeners 的含义不同(相反):在后者中,它表示客户端应该与之交谈的主机,在前者中,服务器应绑定到的 NIC 地址。

    换句话说,将listeners 中的host 的值更改为0.0.0.0(所有可用的网卡)使一切正常:

    KAFKA_LISTENERS: DOCKER://0.0.0.0:29092,LOCAL://0.0.0.0:9092
    KAFKA_ADVERTISED_LISTENERS: DOCKER://kafka0:29092,LOCAL://localhost:9092
    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: DOCKER:PLAINTEXT,LOCAL:PLAINTEXT
    KAFKA_INTER_BROKER_LISTENER_NAME: DOCKER
    

    从主机(容器外):

    └─( kafkacat -b localhost:9092 -L 
    Metadata for all topics (from broker 1: localhost:9092/1):
     1 brokers:
      broker 1 at localhost:9092 (controller)
     4 topics:
      topic "devices" with 1 partitions:
    ...
    

    虽然在 Docker 网络中,但一切正常。 例如:

    {
      "@timestamp":"2021-12-25T00:05:27Z",
      "@service":"benthos",
      "component":"benthos.output",
      "level":"INFO",
      "message":"Sending Kafka messages to addresses: [kafka0:29092]"
    }
    

    在主机上运行的客户端可以连接到 Kafka 集群:

    from pykafka import KafkaClient
    
    client = KafkaClient(hosts='localhost:9092')
    print(f"Available topics: {client.topics}")
    
    # Produce or Consume data here
    

    完整的代码示例可在here获取。

    值得注意的是,AFAICT,the original blog postlisteners 提供了不正确的配置。

    【讨论】:

      【解决方案2】:

      切勿修改 /etc/hosts 来“修复”您的听众。

      在 Kafka 完全不再需要 Zookeeper 之前,一切都没有改变。

      让我相信我在容器的配置中遗漏了一些东西

      有默认的监听器,但是 Docker Compose 中的ports 与实际的代理服务器配置无关。没有两个端口监听外部流量。内部和外部各一个。

      请注意,您将返回kafka0,根据您宣传的设置,这不是您在撰写文件中设置的主机名,因此您的内部客户端在解析主机名@987654324 时会出错@...

      好像Kafka这样启动时只监听29092端口

      两者都听得很好。

      $ nc -vz localhost 9092
      Connection to localhost port 9092 [tcp/XmlIpcRegSvc] succeeded!
      $ nc -vz localhost 29092
      Connection to localhost port 29092 [tcp/*] succeeded!
      

      kafka 协议不响应 Docker 网络外部的“bob”内部侦听器,不。

      有多少?

      根据您的网络所需的数量。例如,我看到多达四个使用 SASL 的内部复制、使用 SSL 的外部客户端、PLAINTEXT,而我们已经将这些客户端迁移到 SSL,然后添加了 SASL_SSL 以进行更多授权控制。

      【讨论】:

      • 感谢您尝试回复,但不幸的是,您遗漏了我所缺少的关键部分(当然 docker comp YAML 中的 ports 与它无关,我只是打开两个端口,这样我就可以在容器上同时访问它们)。我仍然不知道我应该在上面显示的内容中进行哪些更改才能使其正常工作:您能否分享您的配置,因为您声称代理在两个端口上都进行了回复?特别是,我看到了完全相反的情况:kafkacat(从主机运行,而不是容器)得到 BOB 的响应,但不是 FRED
      • 抱歉,您似乎在问一个特定的问题,而不是想知道为什么它不起作用。是的,主机侦听器上的 0.0.0.0 是解决方法。看来你编辑了帖子。请注意,您仍然为kafka0 设置了广告,同时hostname: kafka 仍然存在
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-15
      • 2021-09-11
      • 1970-01-01
      相关资源
      最近更新 更多