我在kafka中使用日志压缩有一个奇怪的行为。我创建了一个具有以下配置的主题:
kafka-topics --zookeeper ... \
--create --topic myTopic \
--partitions 12 \
--replication-factor 3 \
--config "min.insync.replicas=2" \
--config "cleanup.policy=compact" \
--config "delete.retention.ms=100" \
--config "retention.bytes=-1" \
--config "segment.ms=100" \
--config "min.cleanable.dirty.ratio=0.000001" \
--config "min.compaction.lag.ms=10"
我使用相同的关键字发送该主题的消息,并且当启动组合时,它将返回该主题的最后两条消息。
示例:
Writting message with key="1" and value="A" into topic "myTopic"
Writting message with key="1" and value="B" into topic "myTopic"
Writting message with key="1" and value="C" into topic "myTopic"
COMPACTION
从头开始打印'myTopic'
{“ ROWTIME”:1549444994905,“ ROWKEY”:“ 1”,“ value = B”} {“ ROWTIME”:1549444994905,“ ROWKEY”:“ 1”,“ value = C”}
Writting message with key="1" and value="D" into topic "myTopic"
COMPACTION
从头开始打印'myTopic'
{“ ROWTIME”:1549444994905,“ ROWKEY”:“ 1”,“ value = C”} {“ ROWTIME”:1549444994905,“ ROWKEY”:“ 1”,“ value = D”}
与segment.ms = 60000相同
有什么主意吗?
谢谢!
答案 0 :(得分:0)
在压实之前,Kafka确定了最低的偏移位置,该位置无法参与压实(firstUncleanableDirtyOffset
)。
该排名是基于以下计算得出的:
min.compaction.lag.ms
在您的情况下,min.compaction.lag.ms
太低,因此最低偏移位置(不能参与压缩)是从活动段中获取的。因为只有一条消息可以参与压缩(例如key = 1,value = C),所以没有任何事情要做。
如果您使用其他键产生了额外的消息,它应该压缩key=1
的消息。
注意:您还必须注意segment.bytes
属性,该属性确定段的大小。如果邮件与segment.bytes
相比较小,则它们可能位于有效段中,不会被压缩。