【问题标题】:Kafka Log compaction returns two records with the same keyKafka Log 压缩返回两条具有相同键的记录
【发布时间】:2019-06-30 05:15:39
【问题描述】:

我在 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"

我向主题发送具有相同键的消息,当compation启动时,它返回该主题的最后两条消息。

例子:

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"

压缩

从头开始打印'myTopic'

{"ROWTIME":1549444994905,"ROWKEY":"1","value=B"} {"ROWTIME":1549444994905,"ROWKEY":"1","value=C"}

Writting message with key="1" and value="D" into topic "myTopic"

压缩

从头开始打印'myTopic'

{"ROWTIME":1549444994905,"ROWKEY":"1","value=C"} {"ROWTIME":1549444994905,"ROWKEY":"1","value=D"}

segment.ms=60000 也一样

有什么想法吗?

谢谢!!

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    在压缩之前,Kafka 确定了不能参与压缩的最低偏移位置 (firstUncleanableDirtyOffset)。

    该位置是基于计算的:

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

    在您的情况下,min.compaction.lag.ms 非常低,因此最低偏移位置(不能参与压缩)取自 Active 段。因为只有一条消息可以参与压缩(例如 key=1,value=C),所以没有什么可做的。

    如果您使用其他密钥生成额外消息,它应该将您的消息压缩为key=1

    注意:您还必须注意segment.bytes 属性,它决定了段的大小。如果消息与segment.bytes 相比较小,则它们可能处于活动段中并且不会被压缩。

    【讨论】:

      猜你喜欢
      • 2020-08-09
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      相关资源
      最近更新 更多