Project Icon

pebble

CockroachDB采用的高性能键值存储引擎

Pebble是一款受LevelDB和RocksDB启发的高性能键值存储引擎,专为CockroachDB内部使用而优化。它采用RocksDB的文件格式,并实现了范围删除墓碑和表级布隆过滤器等扩展功能。Pebble通过改进反向迭代速度、引入并发提交管道和L0子层级等创新,显著提升了性能。自2020年5月在CockroachDB中投入使用以来,Pebble已证明其在生产环境中的稳定性和可靠性。

Pebble 构建状态 GoDoc 覆盖率

每日基准测试

Pebble 是一个受 LevelDB/RocksDB 启发的键值存储系统,专注于性能和 CockroachDB 的内部使用。Pebble 继承了 RocksDB 的文件格式和一些扩展,如范围删除墓碑、表级布隆过滤器以及对 MANIFEST 格式的更新。

Pebble 有意不追求包含 RocksDB 的每一个功能,而是专门针对 CockroachDB 所需的用例和功能集:

  • 基于块的表
  • 检查点
  • 索引批处理
  • 迭代器选项(上下界、表过滤器)
  • 基于层级的压缩
  • 手动压缩
  • 合并操作符
  • 前缀布隆过滤器
  • 前缀迭代
  • 范围删除墓碑
  • 反向迭代
  • SSTable 摄入
  • 单一删除
  • 快照
  • 表级布隆过滤器

RocksDB 有大量未在 Pebble 中实现的功能:

  • 备份
  • 列族
  • 范围内删除文件
  • FIFO 压缩风格
  • 前向迭代器 / 尾部迭代器
  • 哈希表格式
  • 内存表布隆过滤器
  • 持久缓存
  • 固定迭代器键 / 值
  • 普通表格式
  • SSTable 后台摄入
  • 子压缩
  • 事务
  • 通用压缩风格

警告:如果将 Pebble 用于使用了 Pebble 不支持功能的 RocksDB 数据库,可能会导致数据静默损坏或行为异常。请谨慎使用!

生产就绪

Pebble 在 CockroachDB v20.1(2020 年 5 月发布)中作为 RocksDB 的替代存储引擎引入,并在当时成功用于生产环境。在 CockroachDB v20.2(2020 年 11 月发布)中,Pebble 成为默认存储引擎。Pebble 目前被 CockroachDB 的用户大规模用于生产环境,被认为是稳定且可用于生产的。

优势

Pebble 相比 RocksDB 提供了几项改进:

  • 通过内存表跳表中的向后链接实现更快的反向迭代。
  • 更快的提交流水线,实现更好的并发性。
  • 无缝合并索引批处理的迭代。批处理中的修改在概念上占据另一个内存表层级。
  • L0 子层级和刷新拆分,用于 L0 层的并发压缩和在高写入负载期间减少读放大。
  • 通过使用写时复制 B 树来保存文件元数据,在具有大量 SSTable 的 LSM 中实现更快的 LSM 编辑。
  • 删除仅压缩,可以删除完全落在范围删除边界内的整个 SSTable。
  • 块属性收集器和过滤器,使迭代器能够根据用户定义的键值对属性跳过不相关的表、索引块和数据块。
  • 范围键 API,允许在键空间范围内定义具有用户定义语义的 KV 对,并在迭代过程中交错。
  • 更小、更易于理解的代码库。

有关实现差异的更多详细信息,请参阅 Pebble 与 RocksDB:实现差异 文档。

RocksDB 兼容性

Pebble 致力于与 RocksDB 6.2.1(CockroachDB 使用的最新版本 RocksDB)实现前向兼容。前向兼容意味着由 RocksDB 6.2.1 生成的数据库可以升级以供 Pebble 使用。v1 系列的 Pebble 版本可以打开由 RocksDB 6.2.1 生成的数据库。自引入以来,Pebble 采用了各种向后不兼容的格式更改,这些更改通过新的"格式主版本"进行控制。Pebble 的 master 分支不支持打开由 RocksDB 生成的数据库。由 RocksDB 生成的数据库只能在使用之前的 Pebble 版本进行格式主版本升级后,才能与最新版本的 Pebble 一起使用。请参阅下面关于格式主版本的部分。

即使是与 RocksDB 兼容的 Pebble 版本,也只提供与 CockroachDB 使用的功能子集和配置的兼容性。RocksDB 的功能和配置范围太广,无法充分测试和记录所有的不兼容性。以下列表包含已知的不兼容性:

  • Pebble 对 WAL 回收的使用仅与 RocksDB 的 kTolerateCorruptedTailRecords WAL 恢复模式兼容。旧版本的 RocksDB 会自动将不兼容的 WAL 恢复模式映射到 kTolerateCorruptedTailRecords。新版本的 RocksDB 将禁用 WAL 回收。
  • 列族。Pebble 不支持列族,也不会在打开可能包含列族的数据库时尝试检测其使用情况。
  • 哈希表格式。Pebble 不支持哈希表 SSTable 格式。
  • 普通表格式。Pebble 不支持普通表 SSTable 格式。
  • SSTable 格式版本 3 和 4。Pebble 不支持版本 3 和版本 4 格式的 SSTable。SSTable 格式版本由 BlockBasedTableOptions::format_version 选项控制。请参阅 #97

格式主版本

随着时间的推移,Pebble 引入了新的物理文件格式。向后不兼容的更改是通过引入"格式主版本"来实现的。默认情况下,当 Pebble 打开数据库时,它会默认使用支持的最低版本。在 v1 中,这是 FormatMostCompatible,它与 RocksDB 6.2.1 双向兼容(有上述注意事项)。 RocksDB或Pebble版本v1及更早版本创建的数据库必须升级到兼容的格式主版本,才能运行较新的Pebble版本。较新的Pebble版本将拒绝打开不再支持的格式的数据库。

要选择使用新格式,用户可以在提供给OpenOptions中设置FormatMajorVersion,或在运行时使用DB.RatchetFormatMajorVersion升级格式主版本。格式主版本升级是永久性的;无法回退到早期格式。

下表概述了格式主版本的历史,以及支持该格式的Pebble版本范围。

名称迁移Pebble支持
FormatMostCompatible1v1
FormatVersioned3v1
FormatSetWithDelete4v1
FormatBlockPropertyCollector5v1
FormatSplitUserKeysMarked6后台v1
FormatSplitUserKeysMarkedCompacted7阻塞v1
FormatRangeKeys8v1
FormatMinTableFormatPebblev19v1
FormatPrePebblev1Marked10后台v1
FormatSSTableValueBlocks12v1
FormatFlushableIngest13v1, master
FormatPrePebblev1MarkedCompacted14阻塞v1, master
FormatDeleteSizedAndObsolete15v1, master
FormatVirtualSSTables16v1, master

升级到迁移列中标有"后台"的格式主版本可能会触发后台活动,通常通过压缩来重写物理文件格式。升级到迁移列中标有"阻塞"的格式主版本将阻塞直到迁移完成。如果通过RatchetFormatMajorVersion升级运行中的数据库,数据库可能会继续提供读写服务,但方法调用直到迁移完成才会返回。

以下表格列出了CockroachDB发布版本支持的Pebble格式主版本范围,供参考。

CockroachDB版本最早支持最新支持
20.1至21.1FormatMostCompatibleFormatMostCompatible
21.2FormatMostCompatibleFormatSetWithDelete
21.2FormatMostCompatibleFormatSetWithDelete
22.1FormatMostCompatibleFormatSplitUserKeysMarked
22.2FormatMostCompatibleFormatPrePebblev1Marked
23.1FormatSplitUserKeysMarkedCompactedFormatFlushableIngest
23.2FormatSplitUserKeysMarkedCompactedFormatVirtualSSTables

血统

Pebble基于不完整的Go版本LevelDB:

https://github.com/golang/leveldb

Go版本的LevelDB基于C++原版:

https://github.com/google/leveldb

优化和灵感来源于RocksDB:

https://github.com/facebook/rocksdb

入门

示例代码

package main

import (
	"fmt"
	"log"

	"github.com/cockroachdb/pebble"
)

func main() {
	db, err := pebble.Open("demo", &pebble.Options{})
	if err != nil {
		log.Fatal(err)
	}
	key := []byte("hello")
	if err := db.Set(key, []byte("world"), pebble.Sync); err != nil {
		log.Fatal(err)
	}
	value, closer, err := db.Get(key)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s %s\n", key, value)
	if err := closer.Close(); err != nil {
		log.Fatal(err)
	}
	if err := db.Close(); err != nil {
		log.Fatal(err)
	}
}
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号