假设我有一个多代理程序(在同一主机上运行),安装了3个代理和50个主题的Kafka,每个主题配置为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天删除一次数据,并确保可以在较短的窗口中删除数据(如果需要),以免耗尽内存?
答案 0 :(得分:2)
要完成您的请求,我可能将log.retention.hours
设置为168
,将log.retention.bytes
设置为〜53687091200
,除以您所选择的主题数计划使用。 log.segment.bytes
只是确定可删除日志段中有多少字节-最旧的日志段是运行清理时将删除的字节。
但是,这些是代理级别的设置-尽管建议的默认值正是您所要求的,但通常建议在每个主题级别而不是retention.ms
设置log.retention.hours
-7天。
答案 1 :(得分:2)
关于时间保留很简单,只需将其设置为您需要的即可。
出于尺寸保留的考虑,出于以下几个原因,这并非微不足道:
保留限制是最低保证。这意味着,如果将log.retention.bytes
设置为1GB,则磁盘上将始终具有至少1GB的可用数据。这不包括分区可以占用的磁盘最大大小,仅覆盖下限。
日志清除器仅定期运行(默认情况下每5分钟运行一次),因此在最坏的情况下,最终可能会得到1GB + 5分钟内可写入的数据量。根据您的环境,可能会有很多数据。
除分区数据外,Kafka还将更多文件(主要是索引)写入磁盘。尽管这些文件通常很小(默认为10MB),但您可能不得不考虑使用它们。
忽略索引,可以用来估计分区的最大磁盘大小的一种启发式方法是:
SIZE = segment.bytes + retention.bytes
在正常环境中,很少有所有分区同时超过其限制的,因此通常可以忽略第二点。
如果要计算索引,则还需要为每个段添加两次segment.index.bytes
(有2个索引:offset和timestamp)。
具有3个代理和3个副本,每个代理将托管350个分区。由于Kafka不喜欢完整的磁盘,因此包含一个“忽悠因素”也可能更安全!因此,请删除磁盘总容量的5-10%,尤其是在不计算索引的情况下。
牢记所有这些陷阱,您应该能够找到所需的日志大小。