4

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

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

然而,这似乎与我在我们的生产集群(Kafka 版本 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] 由于保留时间 604800000 毫秒违规(kafka.log。日志)

[2020-12-24 15:51:17,808] INFO [Log partition=Topic-2, dir=/Folder/Kafka_data/kafka] 调度段删除 List(LogSegment(baseOffset=165828, size=895454171 , lastModifiedTime=1608220234000,最大时间=1608220234478)) (kafka.log.Log)

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

该书在新闻发布时提到 Kafka 版本是 0.9.0.1 。在后来的 Kafka 版本中,这个设置也发生了变化。(我在 Kafka 文档中找不到任何具体提及此更改的内容)。以下是书中的片段。

在此处输入图像描述

4

3 回答 3

7

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

Kafka 代理将保留消息(实际上是“日志段”)多长时间的最常见配置是按时间(以毫秒为单位),并使用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 天。

于 2021-08-05T05:31:49.407 回答
4

希望这变得更清楚。

segment.ms => 段文件的最大年龄(从创建之日起)

保留.ms => 段中任何消息的最大年龄(已关闭),超过该段有资格删除(如果设置了删除策略)

因此,如果该段是“活动段”,那么它可以基于段.ms(或段.bytes)而不是保留.ms 来翻转。保留仅在关闭(非活动)段上发挥作用。

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

看到这个

于 2021-05-12T22:33:52.930 回答
1

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

于 2020-12-30T14:40:03.243 回答