3.6. 使用数据保留策略管理日志

Kafka 使用日志来存储消息数据。日志是与各种索引关联的一系列片段。新消息被写入 active 片段,之后永远不会修改。在服务从消费者获取请求时读取片段。有时候,活跃段会滚动到变为只读,一个新的活跃段会被创建来替代它。次只有一个活跃段。旧段将被保留,直到它们有资格删除。

代理级别的配置设置日志片段的最大大小(以字节为单位),以及推出活跃段前的时间(毫秒):

# ...
log.segment.bytes=1073741824
log.roll.ms=604800000
# ...

您可以使用 segment.bytessegment.ms 在主题级别上覆盖这些设置。无论您需要降低还是提升这些值,都取决于删除片段的策略。较大的大小表示活跃片段包含更多消息,且更频繁地推出。段还具有更短的删除条件。

您可以设置基于时间的日志保留和清理策略,以便保留日志。根据您的要求,您可以使用日志保留配置来删除旧的片段。如果使用日志保留策略,则在达到保留限制时会删除非活跃日志片段。删除旧的片段会绑定日志所需的存储空间,这样您不会超过磁盘容量。

对于基于时间的日志保留,您可以根据小时、分钟和毫秒设置保留周期。保留周期基于将时间信息附加到片段中。

毫秒的配置具有超过分钟的时间,其优先级持续数小时。默认情况下,分钟和毫秒配置为空,但三个选项提供对您要保留的数据进行大量控制。首选应提供给毫秒配置,因为它是唯一可动态更新的三个属性之一。

# ...
log.retention.ms=1680000
# ...

如果 log.retention.ms 设为 -1,则不会将时间限制应用到日志保留,因此所有日志都会被保留。应始终监控磁盘用量,但通常不建议 -1 设置,因为它可能会导致完整磁盘出现问题,这可能会难以对磁盘进行重新处理。

对于基于大小的日志保留,您可以以字节为单位设置最大日志大小(日志中的所有片段):

# ...
log.retention.bytes=1073741824
# ...

换句话说,日志通常会有大约 log.retention.bytes/log.segment.bytes 片段,当它达到稳定状态。当达到最大日志大小时,会删除旧的片段。

使用最大日志大小的一个潜在问题是不会考虑将时间消息附加到段中。您可以对清理策略使用基于时间和大小的日志保留,以获得所需的平衡。达到哪个阈值首先触发清理。

如果要在从系统中删除段文件前添加时间延迟,您可以使用在代理级别或 file.delete.delay.ms 中特定主题的 log.segment.delete.delay.ms 来添加延迟。

# ...
log.segment.delete.delay.ms=60000
# ...