3.7. 使用清理策略删除日志数据
删除旧日志数据的方法由 日志清理 配置决定。
默认情况下,代理启用了 log cleaner:
# ...
log.cleaner.enable=true
# ...
如果您使用日志压缩清理策略,则需要启用日志清理器。您可以在 topic 或 broker 级别设置清理策略。broker-level 配置是没有策略集的主题的默认设置。
您可以设置策略来删除日志、紧凑日志或两者都:
# ...
log.cleanup.policy=compact,delete
# ...
删除策略 与使用数据保留策略来管理日志对应。当数据不需要永久保留数据时,它很合适。紧凑 策略保证保留每条消息键的最新消息。日志压缩非常适合消息值可更改,而您想要保留最新更新。
如果清理策略被设置为删除日志,则会根据日志保留限制删除旧的片段。否则,如果没有启用日志清理器,且没有日志保留限制,日志将继续增大。
如果为日志压缩设置了 cleanup 策略,日志的 头 条作为标准 Kafka 日志运行,并按顺序写入附加新消息。在紧凑日志的 尾部,如果日志清理器运行,则在日志中会发生具有相同键的另一个记录,则会删除记录。具有 null 值的消息也会被删除。如果您不使用密钥,则无法使用压缩,因为需要密钥来识别相关信息。虽然 Kafka 保证每个密钥的最新消息都会被保留,但它不能保证整个紧凑的日志不包含重复。
图 3.1. 在压缩前显示键值写入使用偏移位置的写入
使用密钥来识别信息,Kafka 压缩为特定消息键保留最新的信息(使用最高偏移量),最终丢弃了具有相同密钥的先前消息。换句话说,其最新状态的消息始终可用,当日志清理器运行时,该特定消息的任何过期记录都将最终删除。您可以将消息恢复回以前的状态。
记录会保留其原始偏移,即使周围的记录被删除。因此,tail 可能会具有非协调误差。当消耗在 tail 中不再可用的偏移值时,会找到带有下一较高偏移的记录。
图 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 密钥。