RocksDB
什么是 RocksDB?
根据维基百科的定义,RocksDB 是高性能的嵌入式 KV 数据库,但实际上,我们现在所熟悉的 redis、mysql、mongo 都可以用 RocksDB 来替换,其中 redis 的替换版本就是 pika、mysql 的替换版本是 myrocks,mongo 同样可以选择用 RocksDB 来替换其存储引擎,所以,我更愿意称 RocksDB 为高效发挥存储硬件性能的嵌入式 KV 存储引擎。RocksDB 是基于谷歌 LevelDB 的一个分支进行开发的,使用 LSM 树来存储数据,现由 Facebook 公司进行维护。RocksDB 的作者也是 BigTable(和 GFS、MapReduce 并称为分布式领域的三驾马车) 的作者。
RocksDB 解决了什么问题?
在高并发的写多读少的场景下性能更高。相较于传统的 redis,重新加载时速度更快(大部分数据在磁盘中),相较于传统的 mysql innodb 存储引擎,存储空间更小(顺序写,磁盘的填充率更高)。
RocksDB 是怎么解决的?
RocksDB 使用 LSM 树来存储数据。首先,需要明确的是,LSM 树和 B+ 树不同,它不是一种数据结构, 而是数据的一种组织方式;其次,它通过分层的方式,使数据在写的过程中,避免磁盘随机 I/O,只进行内存随机 I/O 和磁盘顺序 I/O,从而大大增加了数据写的速度。
RocksDB 在写的过程中,采用分治的思想,首先,按冷热数据进行分层,热数据直接在内存中进行原地操作,在数据量达到一定值之后,将当前写内存变为读内存,同时开辟出一块儿新的写内存处理新的数据,此时,再将读内存中的数据顺序写入磁盘,并利用分层的逻辑,对数据进行多路归并,也是因为这个原因,磁盘中的最后一层越占有数据总量的百分之九十。为了防止数据在写内存中丢失,RocksDB 在写内存操作时,会先在磁盘中写入 WAL LOG,在数据丢失时进行数据恢复。
RocksDB 在内存中的数据结构和在磁盘中的数据结构是不同的,在磁盘中的数据结构一般为 B+ 树, 在内存中,为了提高并发读写的性能,一般会使用跳表。