美文网首页
理解rocksdb

理解rocksdb

作者: 谭英智 | 来源:发表于2022-08-09 22:54 被阅读0次

    rocksdb是一个持久化kv的数据库。它充分发挥flash和ram作为存储的性能。

    它还支持硬盘和HDFS来作为存储介质。

    rocksdb是在leveldb的基础上发展起来的。

    rocksdb vs leveldb

    • rocksdb支持多线程合并文件,避免文件合并期间引起系统停顿
    • rocksdb支持存在多个memtable,减少memtable没来得及持久化引起系统停顿
    • rocksdb支持备份
    • rocksdb增加前缀bloom过滤器
    • rocksdb增加memtable bloom过滤器
    • rocksdb增加全局bloom过滤器
    • rocksdb使用大页来申请memtable的内存

    介绍

    rocksdb-overview

    常用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

    原子批量写入

    相关文章

      网友评论

          本文标题:理解rocksdb

          本文链接:https://www.haomeiwen.com/subject/dgrowrtx.html