Filebeat 和 Kafka:客户有 运行 个可用的经纪人可以与之交谈

Filebeat and Kafka: Client has run out of available brokers to talk to

我有两台服务器,我们将它们命名为 server1server2

server1 我有一个 docker 容器 Kafka 运行ning。 Kafka Broker 和 Zookeeper 的端口映射到主机。

server2 我想安装 Filebeat,它将一些日志消息发送到 server1Kafka。好像可以和broker建立连接...

[publisher_pipeline_output]        pipeline/output.go:143        Connecting to kafka(server1:9092)
[publisher_pipeline_output]        pipeline/output.go:151        Connection to kafka(server1:9092) established

...但实际发送消息失败并显示错误消息:

[kafka] kafka/client.go:317     Kafka (topic=sample-topic): kafka: client has run out of available brokers to talk to (Is your cluster reachable?)

我也尝试过 运行 我的 server2 中的 kafka-producer-console(也在 docker 中)并且确实有效!唯一的区别是我的 Filebeat 不是 运行 在 docker 容器中而是直接在 server2.

所以我忘记了什么?知道如何进一步调试问题吗?

作为 ADVERTISED_HOST 当 运行 连接容器时我确实使用了 server1 主机名。

澄清一下: 我正在使用 spotify/kafka (https://hub.docker.com/r/spotify/kafka) 和 运行 中的 KAfka,它是这样的:

docker run -p 2181:2181 -p 9092:9092 --name kafka --env ADVERTISED_HOST=server1 --env ADVERTISED_PORT=9092 spotify/kafka

我的 Filebeat 配置如下所示:

output.kafka:
  hosts: ["server1:9092"]
  topic: 'sample-topic'
  partition.round_robin:
    reachable_only: false

  required_acks: 1
  compression: gzip
  max_message_bytes: 1000000

Port of Kafka Broker and Zookeeper are mapped to the host

对于Kafka,你需要的不仅仅是端口映射。您还需要将广告侦听器地址(广告 host 已弃用 属性)设置为容器所在服务器的外部 hostname/ip 运行 以便从另一台机器访问它。您还需要将侦听器地址设为 0.0.0.0

Filebeat does not run in a docker container but directly on server2

应该没关系

如果控制台生产者在另一台机器上工作,那么您希望任何其他 Kafka 客户端也能工作