公司在做数据库慢日志的采集,大体逻辑是,用户在对应主机部署filebeat监控数据库,把产生的慢日志写入到kafka的topic中。
遇到个问题就是topic默认是有3个分区的,导致filebeat采集到的数据会被随机发送到任意分区。需求是希望同一个filebeat发送的数据保存的时候,默认都只会写入到一个分区里。研究半天好像只能手动创建一个单分区的topic,但是这样肯定不太行,这个有什么办法可以做到吗 万分感谢!
可以使用Kafka的分区器函数来解决这个问题。分区器函数确定消息被分配到哪个分区,因此,您可以编写一个自定义分区器函数来确保来自相同filebeat的所有消息都被分配到同一个分区。为此,您需要从Kafka的Partitioner接口中创建一个新的分区器,然后在配置文件中将其设置为您的主题的分区器。这样,每个filebeat都会将其消息发送到同一个分区,确保数据保存在一个分区中。
回答引自chatgpt
可以使用Kafka的消息键(Key)的方式来实现同一个Filebeat发送的数据被保存到同一个分区的需求。
Kafka的消息键,是指在发送消息时,可以携带一个键值对,键是一段二进制数据,值是消息体。Kafka通过对键值对中键的哈希值进行计算,将同一个键的消息保存到同一个分区中。因此,只要在Filebeat发送消息时,为每个消息携带相同的键值对,就可以实现同一个Filebeat发送的数据保存的时候,默认都只会写入到一个分区里的需求。
具体实现方法可以在Filebeat的配置文件中配置output.kafka.key配置项,指定消息键的值,例如
output.kafka:
hosts: ["kafka:9092"]
topic: "my-topic"
key: "my-key"
在上述配置中,key的值设置为"my-key",这样Filebeat发送的所有消息都会携带"my-key"作为消息键,从而实现同一个Filebeat发送的数据保存到同一个分区的需求。需要注意的是,为了确保同一个Filebeat发送的所有消息都保存到同一个分区,需要在Kafka的目标主题中创建只有一个分区的主题。
经过上面的测试,我们已经知道我们已经把日志成功发送到kafka集群中了。不过上节课我们提到了,我们有很多种类的日志,有些时候我们并不想把所有日志都发送到同一个topic上,不便于分析处理也不便于日志的维护。所以我们一般会选择不同类别的日志写到不同的topic中。
首先,要在input中加入filed字段,上一节课字段分类已经讲述了。
fields:
log_type: system
然后,在配置topic输出:
topic: '%{[fields.log_topic]}'
这样就会根据新增加的字段log_type的值来决定发送到哪个topic中了。