RocksDB简介 #
一、什么是RocksDB #
1.1 键值存储概述 #
键值存储(Key-Value Store)是最简单的数据存储模型,通过唯一的键来存储和检索值。
text
应用程序
↓
键值存储引擎
↓
┌─────────────────┐
│ Key │ Value │
├───────┼─────────┤
│ key1 │ value1 │
│ key2 │ value2 │
│ key3 │ value3 │
└───────┴─────────┘
1.2 RocksDB定义 #
RocksDB 是由 Facebook 开发的开源嵌入式键值存储引擎,基于 Google 的 LevelDB 进行了深度优化和扩展。
| 特性 | 说明 |
|---|---|
| 嵌入式 | 作为库嵌入应用程序,无需独立服务进程 |
| LSM-Tree | 采用LSM树存储结构,写入性能优异 |
| 高性能 | 针对SSD等快速存储设备优化 |
| 可配置 | 提供丰富的配置选项 |
| 跨平台 | 支持Linux、macOS、Windows |
二、RocksDB发展历史 #
2.1 诞生背景 #
text
2011年 Google发布LevelDB
↓
2012年 Facebook开始基于LevelDB开发RocksDB
↓
2013年 RocksDB开源
↓
2015年 MyRocks项目启动
↓
2017年 RocksDB成为CNCF项目
↓
至今 RocksDB 8.x版本
2.2 为什么基于LevelDB开发 #
| LevelDB特点 | RocksDB改进 |
|---|---|
| 单线程Compaction | 多线程Compaction |
| 单一层压缩策略 | 多种压缩策略 |
| 无列族支持 | 支持列族 |
| 配置选项有限 | 丰富的配置选项 |
| 无事务支持 | 支持事务 |
2.3 版本演进 #
| 版本 | 年份 | 主要特性 |
|---|---|---|
| 2.x | 2013 | 基础功能完善 |
| 3.x | 2014 | 列族、事务支持 |
| 4.x | 2015 | 单删除、合并操作符 |
| 5.x | 2016 | 写入性能优化 |
| 6.x | 2018 | SstFileWriter、备份改进 |
| 7.x | 2021 | BlobDB、Tiered Compaction |
| 8.x | 2023 | 性能优化、新压缩算法 |
三、RocksDB核心特点 #
3.1 LSM-Tree存储结构 #
LSM-Tree(Log-Structured Merge-Tree)是一种写入优化的数据结构。
text
写入流程
↓
┌─────────────┐
│ MemTable │ ← 内存中的有序表
│ (跳表) │
└──────┬──────┘
│ 写满后刷盘
↓
┌─────────────┐
│ Immutable │ ← 不可变内存表
│ MemTable │
└──────┬──────┘
│ 后台刷盘
↓
┌─────────────┐
│ Level 0 │ ← SST文件
├─────────────┤
│ Level 1 │
├─────────────┤
│ Level 2 │
├─────────────┤
│ ... │
└─────────────┘
3.2 高性能写入 #
cpp
// 顺序写入,性能极高
for (int i = 0; i < 1000000; i++) {
db->Put(WriteOptions(), "key" + std::to_string(i), "value");
}
// 批量写入,原子性保证
WriteBatch batch;
for (int i = 0; i < 1000; i++) {
batch.Put("key" + std::to_string(i), "value");
}
db->Write(WriteOptions(), &batch);
3.3 列族支持 #
cpp
// 创建多个列族
ColumnFamilyHandle* cf1;
ColumnFamilyHandle* cf2;
db->CreateColumnFamily(ColumnFamilyOptions(), "cf1", &cf1);
db->CreateColumnFamily(ColumnFamilyOptions(), "cf2", &cf2);
// 不同列族数据隔离
db->Put(WriteOptions(), cf1, "key", "value_in_cf1");
db->Put(WriteOptions(), cf2, "key", "value_in_cf2");
3.4 丰富的配置选项 #
cpp
Options options;
// 压缩配置
options.compression = CompressionType::kLZ4Compression;
// 块缓存配置
options.block_cache = NewLRUCache(1024 * 1024 * 1024); // 1GB
// 写缓冲区配置
options.write_buffer_size = 64 * 1024 * 1024; // 64MB
// Compaction配置
options.max_background_compactions = 4;
四、RocksDB应用领域 #
4.1 数据库存储引擎 #
text
┌─────────────────────────────────────┐
│ 数据库架构 │
├─────────────────────────────────────┤
│ SQL层 → 存储引擎接口 → RocksDB │
│ ↓ │
│ LSM-Tree │
└─────────────────────────────────────┘
典型应用:
| 数据库 | 用途 |
|---|---|
| MyRocks | MySQL存储引擎 |
| TiKV | 分布式事务KV |
| CockroachDB | 分布式SQL数据库 |
| YugabyteDB | 分布式SQL数据库 |
4.2 流处理系统 #
| 系统 | 用途 |
|---|---|
| Apache Flink | 状态后端存储 |
| Kafka Streams | 流处理状态存储 |
| Samza | 状态管理 |
4.3 区块链存储 #
text
区块链节点
├── 区块数据 → RocksDB
├── 交易数据 → RocksDB
├── 状态数据 → RocksDB
└── 索引数据 → RocksDB
典型应用:
- Ethereum
- Hyperledger Fabric
- Celo
4.4 时序数据库 #
| 系统 | 用途 |
|---|---|
| InfluxDB | 时序数据存储 |
| TimescaleDB | 时序扩展 |
| QuestDB | 高性能时序数据库 |
五、RocksDB架构概览 #
5.1 整体架构 #
text
┌─────────────────────────────────────────┐
│ 应用层 │
├─────────────────────────────────────────┤
│ API层 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ DB │ │Iterator │ │Snapshot │ │
│ └─────────┘ └─────────┘ └─────────┘ │
├─────────────────────────────────────────┤
│ 核心组件 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │MemTable │ │ WAL │ │ Version │ │
│ └─────────┘ └─────────┘ └─────────┘ │
├─────────────────────────────────────────┤
│ 存储层 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ SST │ │ Block │ │ Filter │ │
│ │ Files │ │ Cache │ │ Block │ │
│ └─────────┘ └─────────┘ └─────────┘ │
├─────────────────────────────────────────┤
│ 文件系统 │
└─────────────────────────────────────────┘
5.2 核心组件 #
| 组件 | 功能 |
|---|---|
| MemTable | 内存中的有序表,接收写入 |
| Immutable MemTable | 不可变内存表,等待刷盘 |
| WAL | Write-Ahead Log,保证持久性 |
| SST Files | 磁盘上的排序文件 |
| Block Cache | 数据块缓存 |
| Version Set | 版本管理 |
六、RocksDB与其他存储对比 #
6.1 与LevelDB对比 #
| 特性 | RocksDB | LevelDB |
|---|---|---|
| Compaction | 多线程 | 单线程 |
| 列族 | 支持 | 不支持 |
| 事务 | 支持 | 不支持 |
| 压缩算法 | 多种 | Snappy |
| 配置选项 | 丰富 | 有限 |
| 性能 | 更高 | 一般 |
6.2 与传统数据库对比 #
| 特性 | RocksDB | MySQL(InnoDB) |
|---|---|---|
| 数据模型 | 键值 | 关系型 |
| 存储结构 | LSM-Tree | B+Tree |
| 写入性能 | 极高 | 中等 |
| 读取性能 | 高 | 高 |
| 范围查询 | 支持 | 支持 |
| 事务 | 简单事务 | 完整ACID |
| SQL支持 | 无 | 完整 |
6.3 与Redis对比 #
| 特性 | RocksDB | Redis |
|---|---|---|
| 存储 | 磁盘持久化 | 内存为主 |
| 容量 | 受磁盘限制 | 受内存限制 |
| 速度 | 快 | 极快 |
| 数据结构 | 键值 | 丰富 |
| 持久化 | 原生支持 | 需配置 |
| 分布式 | 不支持 | 集群模式 |
七、为什么学习RocksDB #
7.1 市场需求 #
text
存储引擎技能需求(2024)
┌─────────────────────┐
│ 1. RocksDB ████ │
│ 2. LevelDB ██ │
│ 3. LMDB █ │
│ 4. BoltDB █ │
└─────────────────────┘
7.2 学习价值 #
1. 技能基础
text
RocksDB学习
├── LSM-Tree原理
├── 键值存储设计
├── 性能优化
└── 存储引擎开发
2. 职业发展
| 职位 | RocksDB技能要求 |
|---|---|
| 存储工程师 | 精通 |
| 数据库内核开发 | 精通 |
| 后端开发 | 熟练 |
| 大数据工程师 | 了解 |
| 运维工程师 | 熟练 |
7.3 学习路线 #
text
入门阶段
├── 了解LSM-Tree原理
├── 安装编译RocksDB
├── 基本API使用
└── 简单读写操作
进阶阶段
├── 迭代器和快照
├── 列族管理
├── 批量操作
└── 事务处理
高级阶段
├── 存储引擎原理
├── Compaction策略
├── 性能调优
└── 故障排查
专家阶段
├── 源码分析
├── 自定义扩展
├── 生产优化
└── 最佳实践
八、学习资源 #
8.1 官方资源 #
| 资源 | 地址 |
|---|---|
| GitHub | https://github.com/facebook/rocksdb |
| 官方文档 | https://rocksdb.org/ |
| Wiki | https://github.com/facebook/rocksdb/wiki |
8.2 学习建议 #
- 理解原理:深入理解LSM-Tree存储结构
- 动手实践:编译源码,编写示例程序
- 性能测试:使用db_bench进行性能测试
- 源码阅读:阅读核心模块源码
- 生产应用:结合实际项目应用
九、总结 #
RocksDB核心特点:
| 特点 | 说明 |
|---|---|
| 高性能 | 针对SSD优化,写入性能极高 |
| 可靠性 | WAL保证数据持久性 |
| 灵活性 | 丰富的配置选项 |
| 可扩展 | 支持列族、事务等高级特性 |
| 开源 | Apache 2.0许可证 |
下一步,让我们开始安装RocksDB!
最后更新:2026-03-27