【问题标题】:Permanent Kafka Streams/KSQL retention policy永久 Kafka Streams/KSQL 保留策略
【发布时间】:2020-06-17 00:20:04
【问题描述】:

我目前正在研究一个用例,其中跟踪用户与平台的交互,从而生成一个事件流,该事件流存储到 kafka 中,随后将在 Kafka Streams/KSQL 中进行处理。

但我遇到了关于状态存储和变更日志主题保留政策的问题。用户会话可能会在一段时间内无限期地发生,因此我必须保证状态将在这段时间内持续存在,并在节点和集群范围内发生故障时恢复。在搜索过程中,我们发现了以下信息:


https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Streams+Internal+Data+Management

Kafka Streams 允许有状态的流处理,即具有内部状态的操作符。 (...)。 Kafka Streams DSL 使用的默认实现是容错状态存储,使用 1. 内部创建和压缩的变更日志主题(用于容错)和 2. 一个(或多个)RocksDB 实例(用于缓存键值查找)。因此,在启动/停止应用程序和倒带/重新处理的情况下,需要正确管理这些内部数据。

(...) 因此,RocksDB 内存需求不会无限增长(与更改日志主题相反)。 (KAFKA-4015 已在 0.10.1 版本中修复,窗口化的变更日志主题不会无限增长,因为它们应用了额外的保留时间参数)。


Retention time in kafka local state store / changelog

"对于windowed KTables有一个本地保留时间,还有一个changlog保留时间。可以通过Materialized.withRetentionTime(...)设置本地存储保留时间——默认值为24h。

如果创建了新应用程序,则会创建更改日志主题,其保留时间与本地存储保留时间相同。”


https://docs.confluent.io/current/streams/developer-guide/config-streams.html

windowstore.changelog.additional.retention.ms 参数说明:

添加到 windows 维护以确保数据不会过早地从日志中删除。允许时钟漂移。


似乎 Kafka Streams 维护了一个(复制的)本地状态存储和一个用于容错的变更日志主题,两者都有一个有限的、可配置的保留期,并且一旦保留时间到期,显然会删除记录。这将导致我们平台中出现不可接受的数据丢失,从而引发以下问题:

  1. Kafka Streams 真的会随着时间的推移清理默认状态存储还是我误解了什么?是否存在数据丢失的实际风险?

  2. 在这种情况下,为状态存储设置无限保留策略是否可取甚至可能?或者也许还有另一种方法来确保状态将被持久化,例如使用更传统的数据库作为状态存储,如果这有意义的话?

  3. 保留策略是否适用于备用副本?

  4. 如果无法永久保存状态,是否还有另一个更适合我们用例的流处理框架?

任何澄清将不胜感激。

【问题讨论】:

    标签: apache-kafka apache-kafka-streams stream-processing ksqldb


    【解决方案1】:

    您似乎在问两个不同的事情。会话窗口和更新日志主题...

    压缩主题永远保留唯一的密钥对。会话窗口持续时间可能应该随着时间的推移而关闭;从今天开始的一周/月/年的用户会话可以说是一个新会话,您应该将每个单独的会话窗口作为 userId 的 集合 联系在一起,而不仅仅是存储最近的会话(其中意味着从状态存储中删除以前的会话)

    【讨论】:

    • 感谢您的回复。是的,所以如果我理解正确,因为 changelog 主题是一个压缩主题,这意味着聚合结果将永远保留。现在我可能弄错了,但是 Kafka Streams 是否也为每个任务在 RocksDB 实例中保留了一个内部状态存储,它也会被复制?我应该担心这种形式的状态存储最终会过期吗?
    • 会话存储既紧凑又经过重新处理,根据issues.apache.org/jira/browse/KAFKA-4015 但如果应用程序甚至没有重新启动或移动到新机器,RocksDB 可能会变得很大......当然,这只是默认设置,并且可以实现 StateStore 接口以支持其他非实例远程数据库。
    • 明白了,所以我们将更深入地了解在我们的平台中使用 Kafka Streams。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2016-09-23
    • 2017-07-07
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多