我已经阅读了有状态流处理概述,如果我理解正确的话,rocksdb被用作键值存储的默认实现的主要原因之一是,与内存集合不同,它可以处理大于可用内存的数据,因为它可以刷新到磁盘。这两种类型的存储都可以在应用程序重新启动后继续存在,因为数据是作为kafka主题备份的。
但还有其他区别吗?例如,我注意到我的持久状态存储为每个主题分区创建了一些.log文件,但它们都是空的。
简言之,我想知道用内存中的存储替换持久存储的性能优势和可能的风险是什么。
我已经阅读了有状态流处理概述,如果我理解正确的话,rocksdb被用作键值存储的默认实现的主要原因之一是,与内存集合不同,它可以处理大于可用内存的数据,因为它可以刷新到磁盘。这两种类型的存储都可以在应用程序重新启动后继续存在,因为数据是作为kafka主题备份的。
但还有其他区别吗?例如,我注意到我的持久状态存储为每个主题分区创建了一些.log文件,但它们都是空的。
简言之,我想知道用内存中的存储替换持久存储的性能优势和可能的风险是什么。
2条答案
按热度按时间busg9geu1#
我看不出有什么真正的理由去交换rocksdb商店。事实上rocksdb是最快的k,v商店之一:percona基准测试(基于rocksdb)
with in-memory ones
-rocksdb已经在内存中扮演了一些角色LRU
涉及的算法:rocksdb架构
The three basic constructs of RocksDB are memtable, sstfile and logfile. The memtable is an in-memory data structure - new writes are inserted into the memtable and are optionally written to the logfile.
但选择这种实现方式还有一个更明显的原因:rocksdb源代码
如果你看看源代码比率-有很多
Java
api暴露于C++
代码。因此,将此产品集成到现有系统中要简单得多Java - based
Kafka生态系统全面控制商店,使用暴露的api。nxowjjhe2#
我对kafka流的内部结构和状态存储的不同用例(特别是内存和持久性)的了解非常有限,但到目前为止,我设法了解到的是持久性状态存储是存储在磁盘上的状态存储(因此命名为持久性)
StreamTask
.这并不像内存vs persistent中的名称本身可能给出了相同的理解,但我发现非常令人振奋的是,当我了解到kafka streams尝试将分区分配给之前分配了分区的相同kafka streams示例时(重启或崩溃)。
也就是说,每次重新启动kafka streams应用程序并运行之前,只需重新创建(重放)内存中的状态存储,而持久状态存储已经在磁盘上具体化,kafka streams示例重新创建状态存储所需的唯一时间是从磁盘(而不是从服务器)加载文件需要更长时间的更改日志主题)。
我希望这会有帮助,如果我错了(或部分正确),我会很高兴被纠正的。