初识Pebble

Pebble 来源

Pebble 是 Cockroach 参考 RocksDB 并用 Go 语言开发的高性能 KV 存储引擎。一直以来 CockroachDB 以 RocksDB 作为底层存储引擎,虽然 RocksDB 是一款非常优秀的 KV 内嵌式数据库,但是在 Cockroach 的使用过程中,也遇到了一些使用上的缺陷及性能问题(参考: Cockroach 官方文档 )。由于存储引擎是数据库中非常核心的组件,为了更好的把控核心技术,Cockroach 打算自研底层存储引擎,于是乎,Pebble 呼之欲出。

Pebble 功能点

Pebble 在功能及存储结构上参考了 RocksDB,但是并未完全实现 RocksDB 的功能点,从功能上来看 Pebble 相当于 RocksDB 的子集。Pebble 具备的功能点如下(来源于 官方wiki ):

  • Block-based tables
  • Checkpoints
  • Indexed batches
  • Iterator options (lower/upper bound, table filter)
  • Level-based compaction
  • Manual compaction
  • Merge operator
  • Prefix bloom filters
  • Prefix iteration
  • Range deletion tombstones
  • Reverse iteration
  • SSTable ingestion
  • Single delete
  • Snapshots
  • Table-level bloom filters

RocksDB 具备但是 Pebble 不具备的功能点:

  • Backups
  • Column families
  • Delete files in range
  • FIFO compaction style
  • Forward iterator / tailing iterator
  • Hash table format
  • Memtable bloom filter
  • Persistent cache
  • Pin iterator key / value
  • Plain table format
  • SSTable ingest-behind
  • Sub-compactions
  • Transactions
  • Universal compaction style

Pebble 存储结构

Pebble 和 RocksDB 一样底层的数据存储结构使用的是经典的分层结构的 LSM-Tree。熟悉数据库的同学应该比较清楚,在 NoSql 领域,LSM 被广泛使用,如 HBase、LevelDB、InfluxDB、Elasticsearch 等都使用类似的结构,可见,该结构在工程实践上还是非常靠谱的。下面简单介绍下 LSM。

LSM 结构

如上图,LSM 的结构主要由内存中的 Memtable(含 Immutable)和磁盘中的 sstable 构成,另外,磁盘上还有其他三种比较重要的文件:Wal(预写日志)、Mainifest(sst 的元数据,记录 sst 集合的状态变化)、Current(指向当前版本的 Mainifest)。数据写入时,首先写到 Wal,保证数据的可靠性;然后再写 Memtable,待 Memtable 写满后转化为只读的 Immutable Memtable,等满足一定条件后刷到磁盘形成 sst 文件。这是 LSM 构成的大体流程,这里不具体展开,详细的读写流程后面会根据源码深入剖析。

性能对比

Pebble 是受 RocksDB 启发的 KV 存储引擎,作为后起之秀,具备极高的性能。官方利用 YCSB (由雅虎开发的通用数据库测试工具)对Pebble 和 RocksDB 进行了测试对比,测试了六种工作负载:工作负载 A 是 50% reads 和 50% updates 混合;工作负载 B 是 95% reads 和 5% updates 混合;工作负载 C 是 100% reads;工作负载 D 是 95% 的reads 和 5% 的 inserts。工作负载 E 是 95% scans 和 5% inserts;工作负载 F 是 50% 的 reads 和 50% 的 read-modify-writes.。Pebble 和 RocksDB 的配置选项类似。测试结果如下(来源 官方文档 ):

ycsb-pebble-rocksdb

从上面的结果可以看出,pebble 的表现非常出色,即使和性能极致的 RocksDB 对比也不逊色。笔者目前尚未对最新版的 Pebble 和 RocksDB 做过测试,后面会将最新版测试结果附上。

总结

本章主要介绍了 Pebble 诞生的来源,并介绍了 Pebble 具备的功能点,然后大致讲解了 LSM 的整体结构,并未详细解决其中的技术细节,后面会根据 Pebble 源码针对每块技术点详细展开。最后给大家附上了官方的测试结果,整体看来 Pebble 表现不俗,值得我们继续深入学习和探索。