rocksdb是一个持久化kv的数据库。它充分发挥flash和ram作为存储的性能。
它还支持硬盘和HDFS来作为存储介质。
rocksdb是在leveldb的基础上发展起来的。
rocksdb vs leveldb
- rocksdb支持多线程合并文件,避免文件合并期间引起系统停顿
- rocksdb支持存在多个memtable,减少memtable没来得及持久化引起系统停顿
- rocksdb支持备份
- rocksdb增加前缀bloom过滤器
- rocksdb增加memtable bloom过滤器
- rocksdb增加全局bloom过滤器
- rocksdb使用大页来申请memtable的内存
介绍
![](https://img.haomeiwen.com/i24077087/213088bbe844878f.png)
常用API
-
Get
-
NewIterator
-
Put
-
Delete
-
SingleDelete
-
merge
实现原子read-modify-write
memtable
- skiptable (sorted)
- vertor (unsorted)
- hash (unsorted)
排序
memtable之间无序
sst相同层之间有序
WAL
每个写入会让一个主线程写入WAL
然后各子线程并发写入memtable
当memtable持久化后,相应的WAL会被清理掉
并生成一个新的WAL给后面的写入使用
checksum
每一块SST都有一个checksum,全局也有一个checksum
用于检查程序异常时数据的一致性
合并策略
-
Level style合并
当Ln的文件个数超过阀值
Ln的文件会合并到Ln+1中
-
Universal Style合并
把若干层的数据一次性合并到L n+1层,用读放大来减少写放大
-
FIFO style合并
用户缓存数据。
所有的文件都位于L0
当L0文件超过阀值,则删除最老的文件
事务
-
悲观模式
在写入时,对key加入细粒度锁
-
乐观模式
在写入时,不加锁,在提交时,检查是否发生冲突,如果冲突则返回失败
read
在事务内,未被提交的数据,其他事务不可见,自己事务内可见
事务类型
读已提交
快照
解决不可重复读和幻读
避免停顿
持久化memtable和合并操作是共用线程的。
当所有后台线程都忙与合并,导致没有线程可以用来持久化,而此时memtable都满了。
这会导致新写入会卡顿。
为了避免这种情况,可以通过配置一组独立的线程,专门服务于持久化。
只读模式
只读模式下,可以避开锁的开销,得到更高的读性能
数据压缩
在浅层使用低压缩而快的算法
在深层使用高压缩算法
块缓存
使用LRU缓存来加快读
表缓存
用于缓存sst文件的文件描述符
IO
-
直接IO
让应用来控制cache,避免数据在用户态和内核态之间多次拷贝
-
pagecache io
-
强同步IO
-
设置限流
前缀迭代器
通过加入前缀bloom过滤器,来实现
WriteBatch
原子批量写入
网友评论