RocksDb 是什么?levelDB、LSM 树、SSTable又分别是什么?区别呢?
Git高速下载
程序员面试资料大全|各种技术书籍等资料-1000G
1. LSM 树 (Log-Structured Merge-Tree)
- 核心思想:用顺序写(高效)代替随机写(低效),通过后台合并操作处理数据更新和删除。
- 工作流程:
- 写入:先写入内存中的MemTable(有序数据结构,如跳表)。
- MemTable写满:转为只读的Immutable MemTable,并刷盘生成SSTable文件。
- 合并(Compaction):分层合并SSTable文件,丢弃旧数据/重复数据,生成新文件。
- 优势:高写入吞吐(尤其HDD/SSD)、适合写多读少场景。
- 代价:读操作可能需要查多层(需优化),写放大(Compaction带来额外I/O)。
2. SSTable (Sorted String Table)
- 定义:LSM树在磁盘上的数据存储格式。核心特点:
- 不可变(Immutable):文件生成后不再修改。
- 按键有序:数据按Key排序存储,支持高效范围查询。
- 分块索引:含索引块(快速定位Key)、布隆过滤器(加速Key不存在判断)。
- 合并机制:多个SSTable通过归并排序合并成更大的新文件,删除旧数据。
3. LevelDB
- 背景:Google开源的单机KV存储引擎(2011年),LSM树的经典实现。
- 设计特点:
- 分层存储(Leveled Compaction):
- Level 0:MemTable刷盘后的SSTable(文件间Key可能重叠)。
- Level 1+:每层内SSTable全局有序,文件间Key不重叠。
- 简单轻量:C++实现,无分布式功能,适合嵌入式场景。
- 分层存储(Leveled Compaction):
- 局限:
- 单线程Compaction可能阻塞写入。
- 功能较基础(如不支持多线程合并、压缩算法单一)。
4. RocksDB
- 背景:Facebook基于LevelDB深度优化的开源引擎(2013年),工业级增强版。
- 核心改进:
特性 LevelDB RocksDB Compaction 单线程 多线程并行 写入优化 单一MemTable 支持多MemTable(Pipeline写入) 压缩算法 仅Snappy Zlib, ZSTD, LZ4, BZip2等 事务支持 无 悲观/乐观锁、WriteBatch增强 增量备份 无 支持 布隆过滤器 单层 多层、格式可定制 SSD优化 基础 精细控制I/O、限速 - 应用场景:
- 数据库底层存储(MySQL的MyRocks、MongoDB、TiKV)。
- 消息队列(Apache Pulsar)、图数据库(Dgraph)。
关键关联总结
常见问题
Q: LSM树为何写快读慢?
A:写入只需顺序写MemTable;读取可能需要查MemTable + 多层SSTable(需BloomFilter/索引优化)。
Q: Compaction为何必要?
A:清理过期数据、合并碎片文件、减少读放大,但会引发写放大(I/O与CPU消耗)。
Q: LevelDB vs RocksDB如何选?
A:
- LevelDB:轻量级、代码易读、适合学习或简单场景。
- RocksDB:生产环境首选,高并发、SSD优化、企业级功能完备。
程序员面试资料大全|各种技术书籍等资料-1000G
Git高速下载