美文网首页
理解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