3.6. 使用数据保留策略管理日志
Kafka 使用日志来存储消息数据。日志是与各种索引关联的一系列片段。新消息被写入 active 片段,之后永远不会修改。在服务从消费者获取请求时读取片段。有时候,活跃段会滚动到变为只读,一个新的活跃段会被创建来替代它。一次只有一个片段活跃。旧的片段会被保留,直到它们有资格删除。
代理级别的配置会以字节为单位设置日志片段的最大大小,以及滚动活跃片段前的时间(以毫秒为单位):
... ...
# ...
log.segment.bytes=1073741824
log.roll.ms=604800000
# ...
您可以使用 segment.bytes
和 segment.ms
在主题级别上覆盖这些设置。无论您需要降低或引发这些值,都取决于删除片段的策略。较大的大小意味着活跃片段包含更多信息,经常滚动。段也变得更频繁地删除。
您可以设置基于时间或基于大小的日志保留和清理策略,以便日志保持可以管理。根据您的要求,您可以使用日志保留配置来删除旧的片段。如果使用日志保留策略,则在达到保留限制时会删除非主动日志片段。删除旧的片段会绑定日志所需的存储空间,因此您不会超过磁盘容量。
对于基于时间的日志保留,您可以根据小时、分钟和毫秒设置一个保留周期。保留周期基于时间信息附加到片段中。
毫秒的配置的优先级超过分钟,其优先级超过小时。分钟和毫秒配置默认为 null,但三个选项提供了对您要保留的数据进行大量控制。首选应分配给毫秒配置,因为它是唯一可动态更新的三个属性之一。
... ...
# ...
log.retention.ms=1680000
# ...
如果 log.retention.ms
设为 -1,则不会将时间限制应用到日志保留,因此会保留所有日志。应始终监控磁盘用量,但通常不建议 -1 设置,因为它可能会导致完整磁盘出现问题,这可能会很难重新处理。
对于基于大小的日志保留,您可以以字节为单位设置最大日志大小(日志中的所有片段):
... ...
# ...
log.retention.bytes=1073741824
# ...
换句话说,日志通常会在达到稳定状态后有大约 log.retention.bytes/log.segment.bytes 段。当达到最大日志大小时,旧的片段会被删除。
使用最大日志大小的潜在问题是,它不会考虑时间信息被附加到片段中。您可以使用基于时间和基于大小的日志保留来进行清理策略,以获取您需要的平衡。每当首先达到清理阈值时都会触发清理。
如果要在从系统中删除段文件前添加时间延迟,您可以为主题配置中的特定主题使用 log.segment.
添加延迟。
delete.delay.ms
... ...
# ...
log.segment.delete.delay.ms=60000
# ...