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

时间:2019-07-16 10:56:31

标签: apache-kafka apache-kafka-streams

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

  

Stores.persistenKeyValueStore(“ name”);

收件人

  

Stores.inMemoryKeyValueStore(“ name”);

我们是否要更改为内存中的几个问题

  1. 如果经纪人/消费者重启,我们会丢失任何数据吗?
  2. 如果从内存中清除了旧数据,消费者如何获取先前的数据,它是否从代理获取数据?
  3. 如果它可以从代理中获取数据,那么这对于网络调用来说不会对性能造成影响,而不是在持久状态存储的情况下在本地获取数据。

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

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

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

1 个答案:

答案 0 :(得分:1)

  

(8gb)空间不足,因此我们正在考虑移至内存状态存储区

似乎切换到内存存储会倒退一步? 8GB也相当小-为什么您有这么小的磁盘?

  

如果代理/消费者重启,我们是否会丢失任何数据?

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

  

如果从内存中清除了旧数据,消费者如何获取先前的数据,它是否从代理获取数据?

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

  

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

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