【问题标题】:kafka + how to avoid running out of disk storagekafka + 如何避免磁盘存储空间不足
【发布时间】:2018-11-04 06:45:25
【问题描述】:

我想描述以下在我们的一个生产集群上的案例

我们有 HDP 版本 2.6.4 的 ambari 集群

集群包括 3 台 kafka 机器——而每个 kafka 有 5 个 T 的磁盘

我们看到的是所有 kafka 磁盘都是 100% 大小的,所以 kafka 磁盘已满,这就是所有 kafka 代理失败的原因

df -h /kafka
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb         5T   5T   23M   100% /var/kafka

经过调查,我们看到log.retention.hours=7 days

所以似乎清除是在 7 天之后,也许这就是 kafka 磁盘已满 100% 的原因,即使它们很大 - 5T

我们现在要做的是——未来如何避免这种情况?

所以

我们想知道——如何避免 kafka 磁盘上的全部使用容量

我们需要在 Kafka 配置中设置什么,以便根据磁盘大小清除 kafka 磁盘 - 可以吗?

以及如何知道log.retention.hours 的正确值?根据磁盘大小还是其他?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    在 Kafka 中,有两种类型的日志保留; 大小时间保留。前者由log.retention.bytes 触发,后者由log.retention.hours 触发。

    在您的情况下,您应该注意有时很难配置的 size 保留。假设您需要delete 清理策略,您需要将以下参数配置为

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

    那么你需要考虑log.retention.byteslog.segment.byteslog.retention.check.interval.ms的配置。为此,您必须考虑以下因素:

    • log.retention.bytes主题的单个分区的最低保证,这意味着如果您将log.retention.bytes 设置为 512MB,则意味着您将始终拥有 512MB 的数据(每分区)在您的磁盘中。

    • 同样,如果您在任何给定时间将 log.retention.bytes 设置为 512MB 并将 log.retention.check.interval.ms 设置为 5 分钟(这是默认值),您将拥有至少 512MB 的数据+ 在触发保留策略之前的 5 分钟窗口内产生的数据大小。

    • 磁盘上的主题日志由段组成。段大小取决于log.segment.bytes 参数。对于log.retention.bytes=1GBlog.segment.bytes=512MB,磁盘上始终最多有3 个段(2 个达到保留段,第3 个将是当前写入数据的活动段)。

    最后,您应该进行数学运算并计算 Kafka 日志在任何给定时间可能在您的磁盘上保留的最大大小,并相应地调整上述参数。当然,我也建议设置时间保留策略并相应地配置log.retention.hours。如果 2 天后您不再需要您的数据,请设置 log.retention.hours=48

    【讨论】:

    • @Myrianthous 我没什么问题 - 假设我们有分区 - 称为 - jtr.avo.control.kolp-0 ,我们将 log.retention.bytes 设置为 512M 和 log.retention。 check.interval.ms 到 5 分钟,是否意味着如果这个主题分区大小将增加到 600M,那么 5 分钟后数据将被清除并且主题分区将恢复到大小 - 512M?我在吗?
    • 假设分区的segment已经关闭(即它已经超过log.segment.bytes)那么是的,该log segment将在5分钟内被删除。
    • @Myrianthous ,好吧,如果我的假设是正确的,那么实际上我们得到的是数据丢失,让我们举个例子,现在主题分区正好是 512M,这意味着将写入的每个额外数据此话题将被删除!!! ,那么我们怎么能除此之外,实际上我们这里有数据丢失?
    • 删除从尾部开始,因此较旧的消息将首先被删除。请注意,Kafka 不是数据库。您应该在删除它们之前使用这些消息。
    • 顺便说一句 - 在 ambari kafka 配置中我们有 - log.cleanup.interval.mins 所以我猜它实际上是 - log.retention.check.interval.ms
    【解决方案2】:

    我认为你有三个选择:

    1) 增加磁盘大小,直到您注意到由于您的增加和当前的 7 天保留政策,您有足够的可用空间。对我来说,一个舒适的免费量约为 40%(但这是个人喜好)。

    2) 将您的保留政策降低到例如 3 天,然后查看您的磁盘在一段时间后是否仍满。正确的保留期因不同的用例而异。如果您在出现问题时不需要备份 Kafka 上的数据,那么只需选择一个非常低的保留期。如果您需要这 7 天的数据至关重要,那么您不应该更改时间段,而是更改磁盘大小。

    3) 选项 1 和 2 的组合。

    有关最佳保留政策的更多信息Kafka optimal retention and deletion policy

    【讨论】:

    • 当磁盘使用大小超过 80% 时,是否可以清除 kafka 中的主题数据? (也许 kafka 配置中的某些参数会执行此操作,但我不确定此选项是否为真实选项)
    • 我认为您可以将 log.retention.bytes 设置为 4 TB。这是删除前日志的最大大小。
    • retention.bytes - 如果我们使用“删除”保留,此配置控制在我们丢弃旧日志段以释放空间之前分区(由日志段组成)可以增长到的最大大小政策。默认情况下没有大小限制,只有时间限制。由于此限制是在分区级别强制执行的,因此将其乘以分区数以计算主题保留(以字节为单位)。
    • log.retention.bytes 仅适用于单个日志文件,每个日志文件只是属于某个主题的单个分区。因此,除非每个代理只为单个主题的一个分区提供服务,否则这是行不通的。
    • 如您所见 log.retention.bytes ,是每个分区而不是部分 kafka 磁盘的大小
    猜你喜欢
    • 2021-08-04
    • 2016-06-08
    • 2013-10-09
    • 2015-12-04
    • 2015-12-30
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多