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

Kafka persistent statestore vs in memory state store

我们面临一个问题,我们正在使用 kafka 持久状态存储,它经常用完 space (8gb),所以我们正在考虑转移到内存状态存储

Stores.persistenKeyValueStore("name");

Stores.inMemoryKeyValueStore("name");

如果我们改成内存就没什么问题了

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

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

请注意,我们有流式应用程序 (KTable),并且有大约 200 万条独立消息。

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

runs out of space (8gb) so we are thinking of moving to in memory state store

切换到 in-memory 商店似乎是一种倒退? 8GB 也比较小 -- 为什么你有这么小的磁盘?

Do we loose any data in case of broker/consumer restart?

没有。持久存储只是为了增加启动时间和保持更大状态(因为它们可以溢出到磁盘)的能力而进行的优化。持久存储和 in-memory 存储都由 fault-tolerance 的 Kafka 集群中的变更日志主题支持。为了正确 fault-tolerance 您需要在 Kafka Streams 上应用相同的配置以及独立于商店类型的更新日志主题。

How does consumer get the previous data in case the old data from memory is flushed, does it get that data from broker?

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

Is there any other disadvantage of switching to in memory.

如前所述,缺点是: - 你失去了滚动重启的本地状态,状态需要从变更日志主题中恢复,增加了启动时间 - 你的州必须符合 main-memory