3.7. 使用清理策略删除日志数据
删除旧日志数据的方法由日志 清理 器配置决定。
默认情况下,代理启用了 log cleaner:
... ...
# ...
log.cleaner.enable=true
# ...
如果您使用日志压缩清理策略,则需要启用日志清理。您可以在主题或代理级别设置清理策略。对于没有设置策略的主题,代理级配置是默认设置。
您可以设置策略以删除日志、紧凑日志或同时执行两者:
... ...
# ...
log.cleanup.policy=compact,delete
# ...
delete
策略与使用数据保留策略管理日志对应。当不需要永久保留数据时,它适合。紧凑
策略保证为每个消息键保留最新的消息。日志压缩适合消息值可改变,您希望保留最新的更新。
如果将清理策略设置为删除日志,则根据日志保留限制删除旧的片段。否则,如果没有启用日志清理程序,且没有日志保留限制,日志将继续增长。
如果为日志压缩设置了清理策略,日志 的头 将作为标准 Kafka 日志运行,并按顺序添加新信息。在紧凑日志的末尾,日志清理程序运行,如果日志稍后发生具有相同键的另一个记录,则会删除记录。带有 null 值的消息也会被删除。如果您不使用密钥,则无法使用压缩,因为需要密钥来识别相关消息。虽然 Kafka 保证每个键的最新信息将被保留,但它不能保证整个压缩日志不包含重复的日志。
图 3.1. 在压缩前,显示键值写入的偏移位置的日志
使用键来识别消息,Kafka 压缩会保留特定消息键的最新消息(具有最高偏移),最终丢弃具有相同键的之前信息。换句话说,处于 latest 状态的消息始终可用,在日志清理程序运行时最终会删除特定消息的最新记录。您可以将消息还原回以前的状态。
即使删除记录,记录也会保留其原始偏移量。因此,尾部可以有非连续偏移。当消耗尾部不再可用的偏移量时,会找到具有下一个较高偏移的记录。
图 3.2. 压缩后的日志
如果您只选择一个紧凑策略,则您的日志仍然可以变得任意大。在这种情况下,您可以将策略设置为紧凑和删除日志。如果您选择紧凑和删除,首先压缩日志数据,在日志头使用键删除记录。之后,在日志保留阈值前的数据会被删除。
图 3.3. 日志保留点和压缩点
您可以设置日志检查的频率,以毫秒为单位进行清理:
... ...
# ...
log.retention.check.interval.ms=300000
# ...
调整日志保留检查间隔,以便与日志保留设置相关。较小的保留大小可能需要更频繁地检查。
清理的频率应该足以管理磁盘空间,但通常不会影响主题的性能。
您还可以设置一个时间(毫秒),以便在没有日志清理时将清理器置于待机状态:
... ...
# ...
log.cleaner.backoff.ms=15000
# ...
如果您选择删除旧的日志数据,可以设置一个毫秒的句点来保留已删除的数据,然后再清除:
... ...
# ...
log.cleaner.delete.retention.ms=86400000
# ...
删除的数据保留周期提供了在不必要的删除数据前了解数据的时间。
要删除与特定键相关的所有消息,生成者可以发送 tombstone 消息。tombstone 有一个 null 值,并充当一个标记来告知消费者会删除该值。压缩后,只会保留 tombstone,这必须很长时间才能让消费者知道该消息已被删除。删除旧的消息时,没有值,tombstone 键也会从分区中删除。