卡夫卡 log.segment.bytes 对比 log.retention.hours

Kafka log.segment.bytes vs log.retention.hours

我正在关注“Kafka:权威指南”第一版这本书,以了解代理何时删除日志段。

根据我所理解的文本,一个片段在关闭之前不会有资格被删除。只有在达到 log.segment.bytes 大小时才能关闭段(考虑到 log.segment.ms 未设置)。一旦某个分段符合删除条件,log.retention.ms 政策将适用于最终决定何时删除该分段。

然而,这似乎与我在我们的生产集群(Kafka ver 2.5)中看到的行为相矛盾。

只要 log.retention.ms 满足,日志段就会被删除,即使段大小小于 log.segment.bytes。

[2020-12-24 15:51:17,808] INFO [Log partition=Topic-2, dir=/Folder/Kafka_data/kafka] Found deletable segments with base offsets [165828] due to retention time 604800000ms breach (kafka.log.Log)

[2020-12-24 15:51:17,808] INFO [Log partition=Topic-2, dir=/Folder/Kafka_data/kafka] Scheduling segments for deletion List(LogSegment(baseOffset=165828, size=895454171, lastModifiedTime=1608220234000, largestTime=1608220234478)) (kafka.log.Log)

大小仍小于 1GB,但该段已被删除。

本书在新闻稿发布时提到 Kafka 版本是 0.9.0.1。那么在后来的 Kafka 版本中是否更改了此设置。 (我在 Kafka 文档中找不到任何关于此更改的具体提及)。以下是书中的摘录。

您观察到的是预期的行为。简而言之,如果您有一个尚未满的活动段,并且 segment.ms 已经过去,那么即使未满,它也会被关闭并变成“旧日志段”。

希望这变得更清楚。

segment.ms => the maximum age of the segment file (from the date of creation)

retention.ms => the maximum age of any message in a segment (that is closed) beyond which this segment is eligible for deletion (if delete policy is set)

因此,如果段是“活动段”,则可以根据 segment.ms(或 segment.bytes)而不是 retention.ms 滚动。留存仅在关闭的(非活动的)细分市场上发挥作用。

所以书中引用的行为是正确的。但是,您认为该段处于活动状态并且 INFO 日志指定该段已设置为删除。 这不会发生在活动段上(假设没有错误)。在任何保留*属性生效之前,必须关闭该段(不活动)。

参见this

设置:log.retention.mslog.retention.bytes

Kafka broker 保留消息(实际上是“日志段”)多长时间的最常见配置是按时间(以毫秒为单位),并使用 log.retention.ms 参数指定(默认为 1 周)。如果设置为 -1,则不应用时间限制。

另一种过期方式是根据保留消息的总字节数。该值使用 log.retention.bytes 参数设置,并应用于每个分区。它的默认值为 -1,允许无限保留。这意味着如果您有一个包含 8 个分区的主题,并且 log.retention.bytes 设置为 1 GB,则为该主题保留的数据量最多为 8 GB。如果您同时指定了 log.retention.byteslog.retention.ms,则在满足任一条件时可能会删除邮件。

设置:log.segment.byteslog.segment.ms

在向 Kafka 代理生成消息时,它们会附加到分区的当前日志段。一旦日志段达到 log.segment.bytes 参数指定的大小(默认 1 GB),日志段将关闭并打开一个新的。只有在日志段被关闭后,才可以考虑过期(通过 log.retention.mslog.retention.bytes)。

另一种控制日志段何时关闭的方法是使用 log.segment.ms 参数,该参数指定日志段应关闭的时间量。 Kafka 将在达到大小限制或达到时间限制时关闭日志段,以先到者为准。

较小的日志段大小意味着必须更频繁地关闭和分配文件,这会降低磁盘写入的整体效率。如果主题的生成率较低,则调整日志段的大小可能很重要。例如,如果一个主题每天只接收 100 兆字节的消息,并且 log.segment.bytes 设置为默认值,则需要 10 天才能填满一个段。由于在日志段关闭之前消息不会过期,如果 log.retention.ms 设置为 1 周,它们实际上将最多保留 17 天的消息,直到关闭的段过期。这是因为一旦日志段用当前 10 天的消息关闭,根据时间策略,该日志段必须在到期前保留 7 天。