【问题标题】:Kafka optimal retention and deletion policyKafka最优保留和删除策略
【发布时间】:2017-07-07 18:10:18
【问题描述】:

我对 kafka 还很陌生,所以如果这个问题是微不足道的,请原谅我。为了计时测试,我有一个非常简单的设置,如下所示:

机器 A -> 写入主题 1(代理)-> 机器 B 从主题 1 读取 机器 B -> 将刚刚读取的消息写入主题 2(代理)-> 机器 A 从主题 2 读取

现在我正在无限循环中发送大约 1400 字节的消息,很快就填满了我的小型代理上的空间。我正在尝试为 log.retention.ms、log.retention.bytes、log.segment.bytes 和 log.segment.delete.delay.ms 设置不同的值。首先,我将所有值设置为允许的最小值,但这似乎降低了性能,然后我将它们设置为我的代理在完全填满之前可以采用的最大值,但是当删除发生时性能再次下降。是否有设置这些值以获得绝对最小延迟的最佳做法?

感谢您的帮助!

【问题讨论】:

    标签: apache-kafka kafka-consumer-api kafka-producer-api kafka-python


    【解决方案1】:

    Apache Kafka 使用 Log 数据结构来管理其消息。日志数据结构基本上是一组有序的 Segment,而 Segment 是消息的集合。 Apache Kafka 在 Segment 级别而不是 Message 级别提供保留。因此,Kafka 不断从其末端删除 Segment,因为这些违反了保留政策。

    Apache Kafka 为我们提供了以下保留政策 -

    1. 基于时间的保留

    根据此政策,我们配置了 Segment(因此是消息)可以存活的最长时间。一旦一个 Segment 跨越了配置的保留时间,它就会根据配置的清理策略被标记为删除或压缩。细分的默认保留时间为 7 天。

    以下是您可以在 Kafka 代理属性文件中设置的参数(按优先级降序排列):

    以毫秒为单位配置保留时间

    log.retention.ms=1680000

    在未设置 log.retention.ms 时使用

    log.retention.minutes=1680

    在未设置 log.retention.minutes 时使用

    log.retention.hours=168

    1. 基于大小的保留

    在此策略中,我们为 Topic 分区配置了 Log 数据结构的最大大小。一旦 Log 大小达到此大小,它就会开始从其末尾删除 Segments。此策略不受欢迎,因为它不能提供有关消息过期的良好可见性。但是,在由于磁盘空间有限而需要控制日志大小的情况下,它可以派上用场。

    以下是您可以在 Kafka 代理属性文件中设置的参数:

    配置日志的最大大小

    log.retention.bytes=104857600

    因此,根据您的用例,您应该配置 log.retention.bytes,这样您的磁盘就不会被填满。

    【讨论】:

    • 但是在 Kafka 代理上发生的删除是否会增加发送和接收消息之间的延迟?如果是这样,有没有办法避免这种情况?
    • 如果在配置中同时设置了基于大小和时间的设置,那么会发生什么,哪个配置优先运行?
    猜你喜欢
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2020-01-19
    相关资源
    最近更新 更多