Fork me on GitHub

rocksdb

简介

  • 起源于facebook
  • 最初源码来源于leveldb 1.5,并借鉴了Apache HBase的想法
  • 作为各种存储介质上的服务器工作负载的存储引擎
  • 存储字节流中的键和值
  • 平衡可定制和自适应,具备高定制化,提供各种自适应算法
  • 被接纳为Mysql MongoDB等多种数据库的后端存储解决方案

LSM树

Log-Structed Merge Tree日志结构合并树

出现背景

对于传统的关系型数据库,大多使用B树这样的结构来将数据存储在磁盘,但是类似B树这样的结构只是逻辑上方便查找,到写磁盘时,在逻辑上相隔很近,映射到磁盘上的物理位置可能会相隔很远,导致大量的随机写,降低IO效率。LSM的出现即是为了将随机写转换为IO效率更高的顺序写。

简介

  • 大多数NoSQL数据库使用的都是基于LSM树的结构存储数据
  • LSM树结构不是一个具体的数据结构,只是一种思想,各家的具体实现都有不同
  • 通过设置内存和文件两层,略微牺牲读性能,换来写性能的大提升

缺点

  1. 读放大:读数据的时候先读内存的memtable,没有再去sstable中查找
  2. 写放大:写数据的时候触发sstable合并操作,加上合并操作,实际的写操作原大于预期
  3. 空间冗余:单个key可能会对应多条操作,实际占用存储空间大于存储key-value所需空间

构成

active memtable

  1. 用于存储最近更新的数据
  2. 会按照key有序存储数据,但是对如何有序不做限制
  3. 存储在内存中,会有断电丢失的可能,所以在存入active memtable的同时会向磁盘写入WAL(write ahead log预写式日志)保证数据可靠性

immutable memtable

  1. 当active memtable的大小达到一定限度之后就会转化为immutable memtable,同时产生新的active memtable,不阻塞新数据产生操作
  2. immutable memtable是写入到磁盘的中间态
  3. 可以有多个,防止写入磁盘不及时导致堵塞

block cache

  1. 纯内存块数据
  2. 存储经常被访问的热点数据

sstable

  1. 将immutable memtable写入到磁盘后的状态,写入后会删除新数据产生时写入磁盘的预写式日志
  2. sstable中存储着对个key对应的值的操作,而不是key对应的值,这样就不用对之前的磁盘做修改删除等随机写操作
  3. 可以通过建立布隆过滤器或者key索引加快查找速度

缺点

  1. 同一个key可能存在多条操作记录,且之前的操作记录无用,可通过合并sstable达到去除冗余的效果
  2. 查找key时是从最新的sstable查找,存在最坏情况,需要查找的key在最旧的sstable,可以通过布隆过滤器或者key索引加快查找速度

 Compact策略

日志压缩,也就是合并sstable操作

size-tiered策略

 

  1. 限制每层的数量为n
  2. 每一层的数量达到n之后就会出发compact操作
  3. 由此,越往底层,sstable越大
  4. 同时,同层多个sstable可能还是存在多条key的冗余存储

leveled策略

 

  • 通过设置每一层的总文件大小来出发compact操作
  • sstable实质上是将一个全局有序的key操作记录集合分为大小相近的几个文件,从而同层不存在key冗余

 合并操作

  1. 某层文件大小超过限制,触发compact
  2. 选择至少一个文件并入下一层
  3. 文件是有序的,合并时查看上层文件包含的key的跨度,从而选择上层文件中包含的key需要并入下层的那几个文件中,保证合并之后下层文件仍然有序,缺点是可能选择的文件的跨度会包含下层的很多个文件,造成大量的随机写操作
  4. 多个不相关的合并操作可以并行执行

RocksDB子模块

  1. Basic Operation:基础操作
  2. Terminology:内部术语定义
  3. Tool:内部工具
  4. Logging/Monitoring:日志和监控
  5. System Behavior:内部系统行为

 Basic Operation

  1. get:查询
  2. put:修改或新建
  3. Iteration:迭代查找
  4. Compaction Filter:在触发compact操作时对特定的key做删除、更新等操作
  5. Creating and ingesting SST file:通过SST文件做批量导入操作
  6. Delete Range:区间内的key删除
  7. Low priority write:降低批量load的优先级,防止影响系统的正常操作
  8. Read modify write:合并操作,依赖原有值进行更新的操作,即先读取后基于读取值进行更新的操作,类似Java的i++
  9. Transaction:事务,支持悲观和乐观事务锁

Terminology

即Rocksdb时的术语说明,包括sstable,memtable等

 System Behavior

保障系统平稳运行的行为

  1. compression:压缩存储SST文件
  2. rate limite:用户可以借此限制写入速度,防止速度太快造成堵塞
  3. delete schedule:删除速度限制
  4. direct io:绕过系统page cache直接进行IO
  5. compaction:去除key冗余的行为

Logging/Monitoring

  1. loger:日志工具
  2. monitoring:监控操作执行时间以及事件触发情况等

参考

LSM树详解
Rocksdb简介
posted @ 2023-06-09 11:59  LosHill  阅读(8)  评论(0编辑  收藏  举报
Live2D