3.7. 使用清理策略删除日志数据

删除旧日志数据的方法由日志 清理 配置决定。

默认情况下,代理启用了 log cleaner:

# ...
log.cleaner.enable=true
# ...

如果您使用日志压缩清理策略,则需要启用日志清理程序。您可以在主题或代理级别设置清理策略。代理级配置是没有设置策略的主题的默认设置。

您可以设置策略来删除日志、压缩日志或同时操作:

# ...
log.cleanup.policy=compact,delete
# ...

删除策略 与使用数据保留策略管理日志对应。当不需要永久保留数据时,它非常适合。紧凑 策略保证为每个消息键保留最新的消息。日志压缩适合消息值可更改的位置,并且您想要保留最新的更新。

如果将清理策略设置为删除日志,则根据日志保留限制删除旧的片段。否则,如果没有启用日志清理程序,且没有日志保留限制,日志将继续增长。

如果为日志压缩设置了 cleanup 策略,日志 作为标准 Kafka 日志运行,并按顺序写入新信息。在紧凑日志的尾部中,如果稍后在日志中发生具有相同键的记录,则日志清理将被删除。也会删除具有 null 值的消息。如果您不使用密钥,则无法使用压缩,因为需要使用密钥来识别相关信息。虽然 Kafka 确保保留每个密钥的最新信息,但它不能保证整个压缩日志不会包含重复。

图 3.1. 在压缩前显示使用偏移位置写入的键值日志

显示键值写入的压缩镜像

使用密钥识别信息,Kafka 压缩为特定消息键保留最新消息(具有最高偏移量),最终丢弃具有相同键的早期消息。换句话说,其最新状态的消息始终可用,在日志清理运行时最终会删除特定消息的最新记录。您可以将消息恢复回以前的状态。

即使删除周围的记录,记录也会保留其原始偏移值。因此,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 键也会从分区中删除。