本文主要是讲了一些RocksDB在分布式系统中大规模应用时的经验与教训。
RocksDB是一个高性能的持久键值存储引擎,由Facebook在2012年创建,基于谷歌的LevelDB代码。RocksDB是基于LSM的,对SSD进行了优化,被多个数据库当做存储引擎使用,并且被使用在流处理、日志队列服务以及索引服务和SSD缓存之上。
引擎架构
MemTable与WAL
RocksDB使用LSM作为主要的存储数据结构,每当数据写入到RocksDB之中,就会被添加到MemTable内存的写缓冲区,以及一个磁盘上的超前写入日志(WAL)。数据会被写入到WAL和MemTable,WAL是MemTable的易失性保护机制。
RocksDB中Memtable的数据结构有三种,分别是skiplist、hash-skiplist、hash-linklist,跳表的好处在于插入的时候可以保证数据的有序,并且支持二分查找、范围查询。插入和搜索的代价都是O(log n)。
在达到指定大小之后现有MemTable和WAL锁定变为不可变,新数据写入新的MemTable和WAL。
SSTable
SSTable是一种数据结构,当MemTable到达一定的上限之后,会flush到硬盘上Sorted String Table (SSTable),并放置在第0层(L0),对应的WAL空间回收;L0大小达到上限时,L0的SSTable经过compaction落到L1;Ln:以此类推完成上述操作。
在每一级中,都会使用二进制搜索;而布隆过滤器会消除SSTable文件中不必要的检索。