Kafka 持久状态存储与内存状态存储

Abh*_*hek 5 apache-kafka apache-kafka-streams

我们面临一个问题,我们正在使用 kafka 持久状态存储,并且它经常耗尽空间(8GB),因此我们正在考虑迁移到内存状态存储

Stores.persistenKeyValueStore(“名称”);

Stores.inMemoryKeyValueStore(“名称”);

如果我们更改为内存,则有几个问题

  1. 如果经纪人/消费者重新启动,我们会丢失任何数据吗?
  2. 如果内存中的旧数据被刷新,消费者如何获取以前的数据,它是否从代理获取该数据?
  3. 如果它可以从代理获取数据,那么它不会对性能产生影响,因为它是网络调用,而不是在持久状态存储的情况下在本地获取数据。

切换到内存中还有其他缺点吗?

请注意,我们有流应用程序 (KTable) 并拥有大约 200 万条唯一消息。

每个消息的大小约为 2kb 频率 平均 500 消息/秒

Mat*_*Sax 5

空间不足(8GB),因此我们正在考虑转移到内存状态存储

切换到内存存储似乎是一种倒退?8GB也比较小——为什么你有这么小的磁盘?

如果经纪人/消费者重新启动,我们会丢失任何数据吗?

不。持久存储只是对增加启动时间和保存更大状态的能力(因为它们可能溢出到磁盘)的优化。持久存储和内存存储都由 Kafka 集群中的变更日志主题支持,以实现容错。为了获得适当的容错能力,您需要在 Kafka Streams 上应用相同的配置以及独立于存储类型的变更日志主题。

如果内存中的旧数据被刷新,消费者如何获取以前的数据,它是否从代理获取该数据?

如果您使用内存存储,客户端始终保留数据集的完整副本。因此,您的数据集必须适合主内存。对 Kafka 集群的写入仅用于容错。在正常操作期间,Kafka Streams 仅写入变更日志主题。仅当迁移任务并且需要重建存储时才会读取更改日志主题。

切换到内存中还有其他缺点吗?

如前所述,缺点是: - 您丢失了滚动重启的本地状态,并且需要从更改日志主题恢复状态,从而增加了启动时间 - 您的状态必须适合主内存