apache-kafka - 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 天删除一次数据,并确保在需要时可以在更短的窗口内删除数据,以免内存不足?
解决方案
关于时间保留很容易,只需将其设置为您需要的即可。
对于尺寸保持,这并非微不足道,原因如下:
保留限制是最低限度的保证。这意味着如果您设置
log.retention.bytes
为 1GB,您将始终在磁盘上至少有 1GB 的可用数据。这不包括分区可以占用的最大磁盘大小,仅包括下限。日志清理器仅定期运行(默认每 5 分钟运行一次),因此在最坏的情况下,您最终可能会得到 1GB + 5 分钟内可以写入的数据量。根据您的环境,这可能是大量数据。
除了分区的数据之外,Kafka 还会向磁盘写入更多文件(主要是索引)。虽然这些文件通常很小(默认为 10MB),但您可能需要考虑它们。
忽略索引,可以用来估计分区的最大磁盘大小的一种不错的启发式方法是:
SIZE = segment.bytes + retention.bytes
在正常环境中,很少有所有分区同时超过其限制,因此通常可以忽略第二点。
如果要计算索引,则还需要segment.index.bytes
为每个段添加两次(有 2 个索引:偏移量和时间戳)。
使用 3 个代理和 3 个副本,每个代理将托管 350 个分区。包含“软糖因素”也可能更安全,因为 Kafka 不喜欢全盘!因此,请删除总磁盘大小的 5-10%,尤其是在不计算索引的情况下。
考虑到所有这些问题,您应该能够找到所需的日志大小。
推荐阅读
- c# - 继承对象的 XML 序列化 C#
- reactjs - 在自定义钩子中使用 redux 的 useDispatch 会产生错误
- git - 在不克隆的情况下比较两个 Git 分支
- php - 用于推送通知的 iOS 13 PHP 脚本负载
- azure-devops - 如何确定当前用户的存储键或描述符
- sql - 测试值存在并相应返回布尔值
- javascript - 在 mongo 集合上运行并将数组字段更改为不同的
- javascript - 使像素强度取决于与鼠标的距离
- ruby-on-rails - 日志不会在 Rails 5 中刷新
- unity3d - 部署到 hololens 后出现 0x80070057 错误