当我尝试同时将数据日志发送到2个Kafka节点时,Filebeat出现问题
以下是filebeat.yml文件的Output Kafka部分:
output.kafka:
enabled: true
hosts: [ "192.168.xxx.xx:9092", "192.168.zzz.zz:9092" ]
topic: "syslog"
timeout: 30s
max_message_bytes: 1000000
两个kafka服务都在运行,但只有第二个节点获取数据。我的意思是,只有Kafka节点192.168.zzz.zz才能获得Filebeat发送的数据。
如果我交换IP地址,则第二个IP地址获得了数据日志。
为什么会这样?要实现此用例,还需要其他哪些配置?我需要将数据发送到两个kafka输出。
答案 0 :(得分:2)
假设两个代理url组成同一个集群,则仅使用一个地址来引导其余集群。如果其中一个地址不可达,则选择另一个。
如果Filebeat正在使用空键创建消息,则消息应在要连接的群集的指定kafka主题内的各个分区之间均匀分布。
数据仅发送到计算出的分区的领导者(基于消息键),因此,单个消息无法同时发送到“(同一集群的)两个节点”。另外,如果您在Kafka群集中拥有的服务器多于这两个服务器,则获取数据的服务器可能不是您列出的那些地址的一部分。
我认为Filebeat不能一次输出到多个唯一的Kafka群集,至少不能在单个output.kafka
部分中输出。 Logstash在该用例下可能会更好地工作
答案 1 :(得分:0)
如cricket_007所述,该主机阵列应仅包含来自同一kafka群集的节点,因为它们用于引导您与该群集的连接。提升处理基本上是通过提供集群的一个,一些或所有节点的地址来起作用的,以便卡夫卡生产者可以接收描述该卡夫卡集群的蓝图(元数据)。
此外,当您说无法在其中一个节点上看到消息时,我感到它们不属于同一kafka群集。如果您说由于尝试从“其他”服务器上的主题进行消费而看不到数据,那么即使它们没有属于同一分区(领导者或副本),如果它们属于同一群集,您仍然可以使用它)出现在该特定节点上。
使用时,使用方将连接到ZK并获取集群元数据,以便它连接到正确的节点/分区,从而允许您从kafka主题进行使用,因此实际上并不依赖于运行您的计算机的消费者。
因此,此答案假设您确实要向不同的kafka群集生成消息。
在这种情况下,由于filebeat不支持相同输出类型的多个输出块,因此可以使用我所知道的最简单的解决方案之一来镜像kafka-to-kafka: https://docs.confluent.io/current/connect/kafka-connect-replicator/index.html
通过复制,您可以实现相同的结果,但是您可以将文件信号发送到两个kafka群集,而只发送到一个,然后将主题镜像到另一个kafka群集。