0 引言
RocksDB 是 Facebook 基于 Google 的 LevelDB 代码库于 2012 年创建的高性能持久化键值存储引擎。它针对 SSD 的特定特性进行了优化,目标是大规模(分布式)应用,并被设计为嵌入在更高层次应用中的库组件。RocksDB应用范围很广,比如:
- 流处理:RocksDB 用于在 Apache Flink、Kafka Stream、Samza 和 Facebook 的 Stylus 中存储暂存数据。
- 日志/队列服务:RocksDB 被 Facebook 的 LogDevice(使用 SSD 和 HDD)、Uber 的 Cherami 和 Iron.io 使用。
- 索引服务:RocksDB 被 Facebook 的 Dragon 和 Rockset 使用。
- SSD 上的缓存:像 Netflix 的 EVCache 、360 的 Pika 和 Redis 这样的内存缓存服务,使用 RocksDB 将从 DRAM 的数据存储在 SSD 上
- 数据库:比如MySQL、TiDB
本文首先介绍一些基本概念。
一、重点概念
LSM tree
LSM-Tree(Log-Structured-Merge-Tree)个人认为更是一种设计思想,而非一个具体的数据结构,如下图所示:

核心点:
- 不支持磁盘原地修改,避免磁道随机访问, 提高写入能力
- 写入不可变文件,随着时间再做merge处理
工作原理如下:
-
数据写入
- 数据首先写入到内存中的 MemTable(内存表),通常使用跳表、平衡树或哈希表等数据结构实现。
- MemTable 支持快速的写入操作,以处理高吞吐量的写入请求。
-
数据刷新
- 当 MemTable 达到一定大小或条件时,它会被写入到磁盘,成为一个不可变的 SSTable(Sorted String Table)文件。
- MemTable 刷新后会被清空,并准备接收新的写入操作。
-
合并compation
- 磁盘上会有多个层次的 SSTable 文件。为了保持查询性能和存储效率,LSM-Tree 定期进行合并操作。
- 合并操作将多个 SSTable 文件的数据合并到一个新的、更大的 SSTable 文件中,通常分为多个层次,每一层的大小递增。
-
读取操作
- 读取数据时,首先在 MemTable 中查找,如果未找到,再在最近的 SSTable 文件中查找。
- 如果需要,还会查找更早的 SSTable 文件。通常会使用布隆过滤器(Bloom Filter)来快速判断某个键是否在特定的 SSTable 文件中。
-
删除和更新
- 删除操作通过插入删除标记(如删除标记的条目)来标记数据已被删除。
- 更新操作通过插入新版本的数据来覆盖旧的数据。最终,这些删除和更新会在合并过程中得到处理。
memtable
MemTable 是一种在内存中保存数据的数据结构,用于提高写入性能和减少对磁盘的频繁访问。MemTable 在数据达到一定量时,会将其内容 flush(刷新)到磁盘上的 SST (Sorted String Table) 文件中。MemTable 支持读写操作,并且可以使用不同的数据结构实现,具体包括:
- 跳表(Skip List):支持并发操作,适合高并发场景。它通过多层索引实现高效的插入、删除和查找操作。
- 平衡树(如 AVL 树或红黑树):支持高效的查找、插入和删除操作,但并不一定适合高并发场景。
- 数组(Vector):提供简单的顺序访问,但对于查找和插入的效率可能较低。
- 哈希表(Hash Table):提供高效的查找操作,但可能不支持范围查询。
选择不同的数据结构作为 MemTable 实现,取决于系统的性能需求和使用场景。
Flush
Flush 时机:
以RocksDB为例:
-
内存表大小超过阈值:
- 当内存表的大小超过了
write_buffer_size时,会触发 flush 操作。
- 当内存表的大小超过了
-
全部列族的内存表总大小超过阈值:
- 当所有列族的内存表总大小超过了
db_write_buffer_size,或者write_buffer_manager发出了 flush 指令时,会触发 flush 操作。在这种情况下,会选择最大的memtable进行 flush 操作。
- 当所有列族的内存表总大小超过了
-
WAL 文件总大小超过阈值:
- 当全部的 Write-Ahead Logging(WAL)文件的大小超过了
max_total_wal_size时,会触发 flush 操作。在这种场景下,内存中数据最老的memtable会被选择执行 flush 操作,并且对应的 WAL 文件会被回收。
- 当全部的 Write-Ahead Logging(WAL)文件的大小超过了
Write-Ahead Log (WAL)
概述:
Write-Ahead Log(WAL)是一种类似于数据库日志的机制,用于故障和异常恢复。在 RocksDB 中,每次数据写入都会写入到两个位置:
-
内存表(MemTable):

最低0.47元/天 解锁文章
4443

被折叠的 条评论
为什么被折叠?



