首页 > 解决方案 > Kafka 保留政策

问题描述

假设我有一个多代理(在同一主机上运行)Kafka 设置,其中包含 3 个代理和 50 个主题,每个主题配置为具有 7 个分区和 3 的复制因子。

我有 50GB 的内存可用于 kafka,并确保 Kafka 日志永远不会超过此内存量,因此我想配置我的保留策略以防止出现这种情况。

我已经设置了删除清理策略:

log.cleaner.enable=true
log.cleanup.policy=delete

并且需要配置以下属性,以便每周删除一次数据,并且我永远不会耗尽内存:

log.retention.hours
log.retention.bytes
log.segment.bytes
log.retention.check.interval.ms
log.roll.hours

这些主题包含由数据库上的表流式传输的数据,总大小约为 10GB(但插入、更新或删除在这些主题中不断流式传输)。

我应该如何配置上述参数,以便每 7 天删除一次数据,并确保在需要时可以在更短的窗口内删除数据,以免内存不足?

标签: apache-kafka

解决方案


关于时间保留很容易,只需将其设置为您需要的即可。

对于尺寸保持,这并非微不足道,原因如下:

  1. 保留限制是最低限度的保证。这意味着如果您设置log.retention.bytes为 1GB,您将始终在磁盘上至少有 1GB 的可用数据。这不包括分区可以占用的最大磁盘大小,仅包括下限。

  2. 日志清理器仅定期运行(默认每 5 分钟运行一次),因此在最坏的情况下,您最终可能会得到 1GB + 5 分钟内可以写入的数据量。根据您的环境,这可能是大量数据。

  3. 除了分区的数据之外,Kafka 还会向磁盘写入更多文件(主要是索引)。虽然这些文件通常很小(默认为 10MB),但您可能需要考虑它们。

忽略索引,可以用来估计分区的最大磁盘大小的一种不错的启发式方法是:

SIZE = segment.bytes + retention.bytes

在正常环境中,很少有所有分区同时超过其限制,因此通常可以忽略第二点。

如果要计算索引,则还需要segment.index.bytes为每个段添加两次(有 2 个索引:偏移量和时间戳)。

使用 3 个代理和 3 个副本,每个代理将托管 350 个分区。包含“软糖因素”也可能更安全,因为 Kafka 不喜欢全盘!因此,请删除总磁盘大小的 5-10%,尤其是在不计算索引的情况下。

考虑到所有这些问题,您应该能够找到所需的日志大小。


推荐阅读