Kafka日志压缩返回具有相同键的两个记录

时间:2019-02-06 09:39:56

标签: apache-kafka

我在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相同

有什么主意吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

在压实之前,Kafka确定了最低的偏移位置,该位置无法参与压实(firstUncleanableDirtyOffset)。

该排名是基于以下计算得出的:

  • 第一个不稳定偏移量
  • 活动细分的偏移量
  • min.compaction.lag.ms

在您的情况下,min.compaction.lag.ms太低,因此最低偏移位置(不能参与压缩)是从活动段中获取的。因为只有一条消息可以参与压缩(例如key = 1,value = C),所以没有任何事情要做。

如果您使用其他键产生了额外的消息,它应该压缩key=1的消息。

注意:您还必须注意segment.bytes属性,该属性确定段的大小。如果邮件与segment.bytes相比较小,则它们可能位于有效段中,不会被压缩。