首页 > 解决方案 > Filebeat 和 Kafka:客户端已用完可与之交谈的代理

问题描述

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

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

On server2I want to installFilebeat将一些日志消息发送到Kafkaon server1。它似乎可以建立与经纪人的连接......

[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?)

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

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

ADVERTISED_HOST运行容器时一样,我确实使用了server1主机名。

为了澄清: 我正在使用KAfkaspotify/kafkahttps://hub.docker.com/r/spotify/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

标签: dockerapache-kafkafilebeat

解决方案


Kafka Broker 和 Zookeeper 的端口映射到主机

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

Filebeat 不在 docker 容器中运行,而是直接在 server2 上运行

应该没关系

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


推荐阅读