是否可以强制清理器为流量非常低的分区压缩分区日志?
Is it possible to force the cleaner to compact a partition log for partitions with very low traffic?
是否可以强制清洁器为流量非常低的分区压缩分区日志?
对于 retention.policy
设置为 "compact, delete"
的主题,可以理解压缩(对于空记录 - 删除)发生在清理线程决定清理日志时。这个决定是基于几件事。与这个问题相关的是分段滚动功能;除非创建新段,否则压缩不会 运行.
分段滚动可以通过 segment.ms
和 segment.bytes
进行配置。
现在,进入正题。由于活动段不会被清理并且新段在记录被写入之前不会变为活动状态,是否可以强制清洁器为不再接收任何写入流量的主题压缩分区日志?
示例日志:
$ kcat -b kafka:9092 -t foo -C -K:
1:hello
2:world
1:
无论配置如何,除非在 1:null
之后写入一条记录,否则压缩不会 运行。然而:
$ echo "3:compact" | kcat -b kafka:9092 -t foo -P -K:
# `segment.ms` time passes
$ kcat -b kafka:9092 -t foo -C -K:
2:world
1:
3:compact
如果 log.cleaner.backoff.ms 具有默认值 (15000),清理线程应该 运行 每 15 秒。当然,如果没有要清理的东西,什么也不会做。墓碑消息(空消息)包含在清理过程中。如果同时启用压缩和删除策略,则删除策略应遵循 log.retention.* 参数。当然不能删除活动段。无论如何要注意,因为清理线程逐段地在整个分区上工作,并且当一个段的清理完成时,同一段将被清理过的段替换。如果清理线程没有足够的内存来清理它被跳过的段,但是你应该在 kafka 日志中看到一个错误。如果流量低,您或许应该使用 log.segment.bytes 和 log.segment.ms.
调整您的分段关闭策略
我在 Confluent Community 进行了进一步调查,并验证了当写入记录的时间戳与当前活动段中的第一条记录的差异超过 segment.ms 时,段会滚动。
换句话说,除非写入记录,否则段永远不会滚动。所以,问题的答案是“不,不可能”。
是否可以强制清洁器为流量非常低的分区压缩分区日志?
对于 retention.policy
设置为 "compact, delete"
的主题,可以理解压缩(对于空记录 - 删除)发生在清理线程决定清理日志时。这个决定是基于几件事。与这个问题相关的是分段滚动功能;除非创建新段,否则压缩不会 运行.
分段滚动可以通过 segment.ms
和 segment.bytes
进行配置。
现在,进入正题。由于活动段不会被清理并且新段在记录被写入之前不会变为活动状态,是否可以强制清洁器为不再接收任何写入流量的主题压缩分区日志?
示例日志:
$ kcat -b kafka:9092 -t foo -C -K:
1:hello
2:world
1:
无论配置如何,除非在 1:null
之后写入一条记录,否则压缩不会 运行。然而:
$ echo "3:compact" | kcat -b kafka:9092 -t foo -P -K:
# `segment.ms` time passes
$ kcat -b kafka:9092 -t foo -C -K:
2:world
1:
3:compact
如果 log.cleaner.backoff.ms 具有默认值 (15000),清理线程应该 运行 每 15 秒。当然,如果没有要清理的东西,什么也不会做。墓碑消息(空消息)包含在清理过程中。如果同时启用压缩和删除策略,则删除策略应遵循 log.retention.* 参数。当然不能删除活动段。无论如何要注意,因为清理线程逐段地在整个分区上工作,并且当一个段的清理完成时,同一段将被清理过的段替换。如果清理线程没有足够的内存来清理它被跳过的段,但是你应该在 kafka 日志中看到一个错误。如果流量低,您或许应该使用 log.segment.bytes 和 log.segment.ms.
调整您的分段关闭策略我在 Confluent Community 进行了进一步调查,并验证了当写入记录的时间戳与当前活动段中的第一条记录的差异超过 segment.ms 时,段会滚动。
换句话说,除非写入记录,否则段永远不会滚动。所以,问题的答案是“不,不可能”。