假设我有一个多代理(在同一主机上运行)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个索引:offset和timestamp)。

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

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

关于apache-kafka - Kafka保留政策,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51823569/

10-16 16:33