文章目录PebbleCockroachDB 自研的键值存储引擎为什么 CockroachDB 要自己造轮子相比 RocksDBPebble 快在哪和 RocksDB 的兼容性快速上手PebbleCockroachDB 自研的键值存储引擎Pebble 在 GitHub 上有 5.9K Star。这是 CockroachDB 团队用 Go 写的键值存储引擎基于 LevelDB 和 RocksDB 的设计理念专门为 CockroachDB 的使用场景定制。2020 年 5 月随 CockroachDB v20.1 首次上线同年 11 月在 v20.2 中成为默认存储引擎。到今天已经在生产环境跑了六年。为什么 CockroachDB 要自己造轮子RocksDB 功能多配置项也多。但 CockroachDB 实际用到的只是其中一部分。维护一个庞大的 C 项目里面有一半功能用不上团队觉得不划算。Pebble 的思路很明确只实现 CockroachDB 需要的特性其他的不碰。这样代码库更小更容易理解和维护性能优化也可以针对实际负载来做。具体支持的特性包括基于块的表格式、检查点、索引批处理、迭代器选项上下界、表过滤器、层级压缩、手动压缩、合并操作、前缀布隆过滤器、前缀迭代、范围删除墓碑、反向迭代、SSTable 导入、单删除、快照、表级布隆过滤器。不支持的也列得很清楚备份、列族、范围删文件、FIFO 压缩、前向迭代、哈希表格式、Memtable 布隆过滤器、持久化缓存、Pin 迭代键值、Plain 表格式、SSTable 后置导入、子压缩、事务、通用压缩。这个取舍很务实。把精力花在 20% 高频场景上而不是追求功能全覆盖。相比 RocksDBPebble 快在哪Pebble 在几个关键路径上做了优化。反向迭代更快。Memtable 的跳表里加了后向链接反向遍历不用从头再走一遍。提交流水线的并发能力更强。多线程写入时锁竞争更少吞吐量更高。索引批处理的合并迭代做了无缝整合。批处理里的数据在逻辑上占据一个额外的 Memtable 层级和正常的 LSM 层级一起参与迭代不需要额外的合并步骤。L0 子层级和刷写分裂让高写入负载下的读放大显著降低。传统 LSM 在 L0 堆积大量 SSTable 时读操作要逐层扫描。Pebble 把 L0 拆成多个子层级压缩可以并行进行读路径上的负担轻很多。LSM 编辑操作用了写时复制 B 树来存文件元数据。当 SSTable 数量很大时这个改动让元数据操作快了不少。删除专用压缩能直接丢掉整个落在范围删除边界内的 SSTable不用逐条处理。块属性收集器和过滤器让迭代器可以跳过不相关的表、索引块和数据块。用户自定义的属性规则在遍历时起作用减少无效读取。还有一套范围键 API允许在一段键空间上定义带有自定义语义的 KV 对在迭代时交叉返回。和 RocksDB 的兼容性Pebble v1 系列兼容 RocksDB 6.2.1 生成的数据库可以平滑升级。但从 v2 开始引入了不兼容的格式变更旧的 RocksDB 数据库需要先通过中间版本的 Pebble 做格式升级。已知的不兼容点WAL 回收只兼容 RocksDB 的kTolerateCorruptedTailRecords模式不支持列族、哈希表格式、Plain 表格式、SSTable 格式 v3 和 v4。格式版本通过FormatMajorVersion控制升级是单向的不能回退。每次引入新格式时有些需要后台迁移通过压缩重写文件有些会阻塞直到迁移完成。在迁移期间数据库仍然可以正常读写。快速上手packagemainimport(fmtloggithub.com/cockroachdb/pebble)funcmain(){db,err:pebble.Open(demo,pebble.Options{})iferr!nil{log.Fatal(err)}key:[]byte(hello)iferr:db.Set(key,[]byte(world),pebble.Sync);err!nil{log.Fatal(err)}value,closer,err:db.Get(key)iferr!nil{log.Fatal(err)}fmt.Printf(%s %s\n,key,value)iferr:closer.Close();err!nil{log.Fatal(err)}iferr:db.Close();err!nil{log.Fatal(err)}}代码不多。Open 打开数据库Set 写入Get 读取Close 关闭。API 设计干净没有多余的概念。如果你在做 Go 项目需要一个可靠的嵌入式键值存储Pebble 值得考虑。代码库不大文档齐全背后有 CockroachDB 团队维护在大规模生产环境里验证过。如果你在做 Go 项目需要一个可靠的嵌入式键值存储Pebble 值得考虑。代码库不大文档齐全背后有 CockroachDB 团队维护在大规模生产环境里验证过。