rocksdb
简介
- 起源于facebook
- 最初源码来源于leveldb 1.5,并借鉴了Apache HBase的想法
- 作为各种存储介质上的服务器工作负载的存储引擎
- 存储字节流中的键和值
- 平衡可定制和自适应,具备高定制化,提供各种自适应算法
- 被接纳为Mysql MongoDB等多种数据库的后端存储解决方案
LSM树
Log-Structed Merge Tree日志结构合并树
出现背景
对于传统的关系型数据库,大多使用B树这样的结构来将数据存储在磁盘,但是类似B树这样的结构只是逻辑上方便查找,到写磁盘时,在逻辑上相隔很近,映射到磁盘上的物理位置可能会相隔很远,导致大量的随机写,降低IO效率。LSM的出现即是为了将随机写转换为IO效率更高的顺序写。
简介
- 大多数NoSQL数据库使用的都是基于LSM树的结构存储数据
- LSM树结构不是一个具体的数据结构,只是一种思想,各家的具体实现都有不同
- 通过设置内存和文件两层,略微牺牲读性能,换来写性能的大提升
缺点
- 读放大:读数据的时候先读内存的memtable,没有再去sstable中查找
- 写放大:写数据的时候触发sstable合并操作,加上合并操作,实际的写操作原大于预期
- 空间冗余:单个key可能会对应多条操作,实际占用存储空间大于存储key-value所需空间
构成
active memtable
- 用于存储最近更新的数据
- 会按照key有序存储数据,但是对如何有序不做限制
- 存储在内存中,会有断电丢失的可能,所以在存入active memtable的同时会向磁盘写入WAL(write ahead log预写式日志)保证数据可靠性
immutable memtable
- 当active memtable的大小达到一定限度之后就会转化为immutable memtable,同时产生新的active memtable,不阻塞新数据产生操作
- immutable memtable是写入到磁盘的中间态
- 可以有多个,防止写入磁盘不及时导致堵塞
block cache
- 纯内存块数据
- 存储经常被访问的热点数据
sstable
- 将immutable memtable写入到磁盘后的状态,写入后会删除新数据产生时写入磁盘的预写式日志
- sstable中存储着对个key对应的值的操作,而不是key对应的值,这样就不用对之前的磁盘做修改删除等随机写操作
- 可以通过建立布隆过滤器或者key索引加快查找速度
缺点
- 同一个key可能存在多条操作记录,且之前的操作记录无用,可通过合并sstable达到去除冗余的效果
- 查找key时是从最新的sstable查找,存在最坏情况,需要查找的key在最旧的sstable,可以通过布隆过滤器或者key索引加快查找速度
Compact策略
日志压缩,也就是合并sstable操作
size-tiered策略
- 限制每层的数量为n
- 每一层的数量达到n之后就会出发compact操作
- 由此,越往底层,sstable越大
- 同时,同层多个sstable可能还是存在多条key的冗余存储
leveled策略
- 通过设置每一层的总文件大小来出发compact操作
- sstable实质上是将一个全局有序的key操作记录集合分为大小相近的几个文件,从而同层不存在key冗余
合并操作
- 某层文件大小超过限制,触发compact
- 选择至少一个文件并入下一层
- 文件是有序的,合并时查看上层文件包含的key的跨度,从而选择上层文件中包含的key需要并入下层的那几个文件中,保证合并之后下层文件仍然有序,缺点是可能选择的文件的跨度会包含下层的很多个文件,造成大量的随机写操作
- 多个不相关的合并操作可以并行执行
RocksDB子模块
- Basic Operation:基础操作
- Terminology:内部术语定义
- Tool:内部工具
- Logging/Monitoring:日志和监控
- System Behavior:内部系统行为
Basic Operation
- get:查询
- put:修改或新建
- Iteration:迭代查找
- Compaction Filter:在触发compact操作时对特定的key做删除、更新等操作
- Creating and ingesting SST file:通过SST文件做批量导入操作
- Delete Range:区间内的key删除
- Low priority write:降低批量load的优先级,防止影响系统的正常操作
- Read modify write:合并操作,依赖原有值进行更新的操作,即先读取后基于读取值进行更新的操作,类似Java的i++
- Transaction:事务,支持悲观和乐观事务锁
Terminology
即Rocksdb时的术语说明,包括sstable,memtable等
System Behavior
保障系统平稳运行的行为
- compression:压缩存储SST文件
- rate limite:用户可以借此限制写入速度,防止速度太快造成堵塞
- delete schedule:删除速度限制
- direct io:绕过系统page cache直接进行IO
- compaction:去除key冗余的行为
Logging/Monitoring
- loger:日志工具
- monitoring:监控操作执行时间以及事件触发情况等
参考
LSM树详解Rocksdb简介