最近公司需要对存储在kafka的日志做一些特殊处理,要求对每个设备只存储最后一条日志数据,也就是需要根据key进行日志更新和保留,删除重复的key日志数据,因此想到了kafka的Log Compaction。
通过kafka官网能了解到Log Compaction是什么?能做什么?官网介绍的使用其实很简单,只需进行参数配置即可。但是具体的实施并不那么简单,我在测试中也是出现了很多问题,反复琢磨后才看到效果。
首先简单的来看看Log Compaction到底是什么吧?
Kafka是一个基于日志的流处理平台,一个topic可以有多个分区(partition),分区是复制的基本单元,在单节点上,一个分区的数据文件可以存储在多个磁盘目录中,每个分区的日志文件存储的时候又会分成一个个的segment,默认日志段(segment)的大小是1GB,segment是日志清理的基本单元,当前正在使用的segment是不会被清理的。对于每一个kafka partition的日志,以segment为单位,都会被分为两部分,已清理和未清理的部分。同时,未清理的那部分又分为可以清理的和不可清理的。
日志压缩是一种机制,可以提供细粒度的记录保留,而不是基于粗粒度的基于时间的保留。这个想法是选择性地删除记录,在这里我们有一个最新的更新和相同的主键。这样,日志保证至少在每个键上至少有最后一个状态。
这个保留策略可以设置每个主题,因此一个单个集群可以有一些主题,在这些主题中,保留由大小或时间和其他主题执行,在那里保留由压缩执行。
压缩还允许删除。带有键和空有效负载的消息将被视为从日志中删除。这个删除标记将导致删除任何先前带有该键的消息(与任何带有该键的新消息一样),但是删除标记的特殊之处在于,它们将在一段时间后从日志中