如何在 Kafka 中测试日志压缩是否有效?

How to test whether log compaction is working or not in Kafka?

我在 Kafka 0.8.1.1 中的 server.properties 文件中进行了更改,即添加了 log.cleaner.enable=true 并在创建主题时启用了 cleanup.policy=compact。 现在,当我测试它时,我将以下消息推送到带有以下 (Key, Message) 的主题。

现在我使用与之前输入相同的键推送了第 4 条消息,但更改了消息。这里应该考虑日志压缩。使用 Kafka 工具,我可以看到主题中的所有 4 个偏移量。我怎么知道日志压缩是否有效?如果删除较早的消息,或者在推送新消息时日志压缩工作正常。 它与 log.retention.hourstopic.log.retention.hourslog.retention.size 配置有什么关系吗?这些配置在日志压缩中的作用是什么。 P.S。 - 我已经仔细阅读了 Apache 文档,但仍然不清楚。

实际上,日志压缩只有在日志数量达到非常高的计数(例如100万)时才可见。所以,如果你有那么多数据,那很好。否则,使用配置更改,您可以将此限制减少到 100 条消息,然后您可以看到在具有相同密钥的消息中,只有最新的消息会在那里,之前的消息将被删除。如果您每次都有完整的数据快照,那么最好使用日志压缩,否则您可能会丢失具有相同关联键的先前日志,这可能很有用。

尽管这个问题已经有几个月了,但我只是在为我自己的问题进行研究时遇到它。我已经创建了一个最小示例,用于查看压缩如何使用 Java,也许它对您也有帮助:

https://gist.github.com/anonymous/f78184eaeec3ee82b15182aec24a432a

此外,查阅文档后,我在主题级别使用了以下配置以尽快启动压缩:

min.cleanable.dirty.ratio=0.01
cleanup.policy=compact
segment.ms=100
delete.retention.ms=100

当 运行 时,此 class 表明压缩有效 - 只有一条消息在主题上具有相同的键。

通过适当的设置,这可以在命令行上重现。

最好也看看 log.roll.hours,默认情况下是 168 小时。简而言之:即使您没有如此活跃的主题并且您无法在一周内填充最大段大小(默认情况下正常主题为 1G,偏移主题为 100M),您将有一个大小低于 log.segment.bytes。该段可以在下一轮压缩。

为了从 CLI 检查主题 属性,您可以使用 Kafka-topics cmd 来完成:

https://grokbase.com/t/kafka/users/14aev0snbd/command-line-tool-for-topic-metadata

您可以使用 kafka-topics CLI 来完成。 我是 运行 来自 docker(confluentinc/cp-enterprise-kafka:6.0.0).

$ docker-compose exec kafka kafka-topics --zookeeper zookeeper:32181 --describe --topic count-colors-output
Topic: count-colors-output  PartitionCount: 1   ReplicationFactor: 1    Configs: cleanup.policy=compact,segment.ms=100,min.cleanable.dirty.ratio=0.01,delete.retention.ms=100
    Topic: count-colors-output  Partition: 0    Leader: 1   Replicas: 1 Isr: 1

但是如果您在“配置”字段中没有看到任何内容,请不要感到困惑。如果使用默认值,就会发生这种情况。因此,除非您在输出中看到 cleanup.policy=compact - 主题未压缩。