Granite 键值封装与工作流
Granite 数据库初始化
Granite 封装了 RocksDB,以统一的方式管理数据库初始化及列族(CF)相关操作。
配置输入:
- 数据库路径
- 列族定义
- 重置现有数据库或创建目录的相关选项
初始化流程:
- 重置(可选):如需重置则删除旧数据。
- 目录创建(可选):确保父目录存在。
- 数据库存在性检查:
- 已存在:打开数据库并获取现有列族句柄。
- 不存在:创建新数据库并初始化所有必需的列族。
- 列族句柄管理:自动跟踪列族句柄及用于监控的监听器或回调钩子。
Granite 键封装
Granite 引入 KeyBuilder 和 ElementValue,标准化键的构建与解码流程。
ElementValue
支持多种数据类型:
- 整数类型:
int8、int16、int32、int64 - 字符串类型:变长字符串
- 固定字符串类型:固定长度字符串
KeyBuilder
- 支持前缀与后缀分离设计:
- 前缀(Prefix):用于 RocksDB 前缀查找或切片转换
- 后缀(Suffix):额外的键元素,可用于二级索引或排序
- 核心方法:
build_key(values)——构建完整键build_prefix_key(values)——仅构建前缀build_suffix_key(values)——仅构建后缀decode_key(key)——解析完整键decode_prefix_key(key)——解析前缀decode_prefix_key_with_filter(key)——解析前缀和后缀(支持可选过滤)
多前缀/可扩展性
_schema.prefix()支持多前缀字段_schema.suffix()允许扩展额外字段_key_filter可对前缀+后缀进行自定义筛选- 兼容 RocksDB 固定前缀转换或自定义切片转换
- 自动计算固定和可变前缀长度(
_fixed_prefix、_var_fixed_prefix) - 支持大端/小端转换,确保 RocksDB 的前缀排序顺序
优势:
- 封装键的序列化/反序列化逻辑
- 在多列族和多前缀场景中无缝工作
- 确保 SST 导入及快照/备份流程的一致性与正确性
SST 文件处理
- Granite 封装了 RocksDB 的
SstFileWriter: - 每个 SST 文件对应单个列族
- 多列族场景下会生成多个 SST 文件
- 导入时必须遵循 SST 文件的生成顺序,以维持数据一致性
- 恢复与复制:
- 从节点可通过主节点快照追平数据
- SST 导入为顺序操作
- 导入后可继续重放预写日志(WAL),恢复正常复制流程
KeyBuilder保障:- 符合 RocksDB 的前缀排序要求
- 后缀字段保留查询所需的完整业务逻辑
备份/检查点
Granite 支持两种备份方式:
1. 快照备份(基于 SST 文件)
- 按列族生成 SST 文件
- 恢复时按正确顺序导入 SST 文件
- 支持增量备份和副本追平
2. 检查点备份(基于目录)
- 创建 RocksDB 检查点目录
- 恢复时直接打开检查点目录即可
Granite 优势:
- 自动管理列族句柄
- 跟踪 SST 文件及导入顺序
- 提供导入、刷盘、压缩及事务操作的统一 API
- 完全兼容多前缀和多列族 schema
与原生 RocksDB 的对比
| 特性 | 原生 RocksDB | Granite |
|---|---|---|
| 列族初始化 | 用户手动管理 | 自动管理,缺失时自动创建 |
| 键构建 | 用户自行处理 | KeyBuilder 支持多类型、多前缀、多后缀 |
| 前缀转换 | 手动配置 | 支持自定义切片转换,可选过滤功能 |
| SST 写入 | 手动实现 | 封装实现,自动处理多列族排序 |
| 备份/恢复 | 手动操作,需维护列族顺序 | 自动导入/刷盘/压缩/事务 API |
| 多前缀/多列族 | 配置复杂 | 通过前缀+后缀+过滤机制全面支持 |
| 监听器/钩子 | 手动集成 | 内置支持 |
| 事务/刷盘/压缩 | 直接调用 DB API | Granite 统一 API |
总结
Granite 提供了基于 RocksDB 的统一封装层,核心管理以下能力:
- 数据库与列族初始化
- 支持多类型、多前缀的键构建与解析
- SST 文件生成与导入
- 备份、检查点及副本追平
KeyBuilder + ElementValue 机制确保:
- 全面支持多前缀场景
- 保留 RocksDB 基于前缀的排序特性
- 保障导入和恢复过程中的列族一致性
- 无缝集成键过滤与扩展能力
Granite 抽象了大量重复的 RocksDB 底层逻辑,同时为生产级工作负载提供高可靠性、可扩展性和正确性保障。