rocksdb的基本原理以及应用

rocksDB是什么?

分布式领域的三架马车:GFS、BigTable、MapReduce。
高效发挥存储硬件性能的嵌入式KV存储引擎,是facebook基于google的leveldb发展而来的。

rocksDB解决了什么问题?

写多读少的场景需求,Mysql的InnoDb的B+树是为了解决读多写少的问题。

RockdsDB是怎么解决的?

LSM-Tree不是一个数据结构(Log Structure Merge),是数据的一种组织形式。内存顺序IO(100ns)>>内存随机IO~=磁盘顺序IO>>磁盘随机IO(10ms),LSM是采用追加写,也就是顺序IO的方式。
这样会造成数据冗余,如put(k1, v2),put(k2, v2),put(k1, v2),所以需要进行数据合并压缩,但是压缩的时候不能进行读写,为了尽可能的避免这种情况,需要对数据进行拆分,使影响的范围最小。
数据是按照数据块的形式进行存储,为了让块内的数据达到有序,需要先在内存里面排序好,但是内存里面存放数据是不安全的,如果进行崩溃了,那这部分数据由于没有存放在磁盘就丢失了。所以这里需要有一个wal日志,数据写在内存里前先写在wal里面,这也是顺序写的。
内存里面的数据达到一定阈值后就会落盘到磁盘的Level0层,在落盘时如果有新的读写怎么办?所以需要新开一个内存去做这些事情,正在落盘的内存去就只读了。
level0层文件间数据时有可能重复的。由于内存中的数据是就地更新,所以level0中单个文件是有序不重复的。内存->level0->level1->…->levelN的数据热度是依次下降的,也就是说越往上,数据越新,有点和时间轮的一样。
多路归并的方式形成下一层,levelN层保存了90%的数据量。

  • WAL(Write-Ahead Logging)是一种高效的日志文件,记录了所有数据库的更新操作。RocksDB 中采用了 WAL 技术来确保数据的持久化和高可靠性。具体来说,RocksDB 在每次更新数据之前,先将更新操作写入 WAL,然后再将更新操作写入 Memtable。这样即使程序异常退出,也可以通过重放 WAL 日志来恢复数据的一致性。
  • LSM(Log-Structured Merge)树是一种优化的数据结构,它可以高效地读取和写入大量数据。RocksDB 的数据结构基于 LSM 树,将所有数据分布在多个级别的 SSTable 文件中,每个级别的大小是固定的,并通过后台合并操作来保证数据的有序性和可靠性。通过 LSM 树技术,RocksDB 可以高效地处理大量数据,同时保持高性能和可靠性。
  • SSTable(Sorted String Table)是一种按字符串排序存储的数据文件,它通过简单的二分查找算法可以快速查找、插入、删除数据。在 RocksDB 中,所有数据都被分布在多个级别的 SSTable 文件中,每个文件都包含多个数据块,每个数据块都有一个索引用于快速定位数据。通过多级别的 SSTable 文件以及合并策略,RocksDB 可以高效地管理海量数据。
  • Bloom Filter 是一种基于哈希函数的数据结构,用于快速过滤出不可能存在的数据,这样可以提高查找效率和减少不必要的磁盘访问。在 RocksDB 中,Bloom Filter 被用来判断某个数据是否存在于 SSTable 文件中,从而可以减少在 SSTable 文件中进行无谓的磁盘读取操作。
  • 在 RocksDB 中,Block Cache 是一个用于高效缓存 SSTable 数据块的组件。Block Cache 可以提高数据库的读取性能,尤其是在访问大量随机数据时。在读取数据时,RocksDB 首先查找 Block Cache 中是否已缓存所需的数据块,如果命中缓存,则可以直接从内存中读取数据,否则需要从磁盘中读取数据块,然后放入 Block Cache 中。
    Block Cache 使用 LRU(Least Recently Used)算法来管理缓存的数据块。具体来说,在 Block Cache 中,每个数据块都被包装在一个 BlockHandle 对象中,并按照最近使用的时间排序。当 Block Cache 被填满时,BlockCache 会移除最久未使用的数据块,以便为新的数据块腾出空间。

内存中的数据说怎么保持一个有序的结构的?
RocksDB需要提供并发读写,如果采用红黑树,由于插入数据后需要对整个树重新着色和旋转,所以需要对整个树做互斥,不太合适。如果树B/B+树,这种适合于磁盘,需要O(m*logn)的时间复杂度。
在内存部分,LSM-Tree通常会使用跳表等高效数据结构,以保证数据的快速访问和高速排序。

RocksDB解决了哪些具体的问题?

Pika(redis)重启后可以更快的加载数据、MyRocks(Mysql)存储效率要高,磁盘填充率要高、TiDB(分布式关系型数据库),不需要分库分表,节约时间。

nephen wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!