Column Family-RocksDB源码剖析(1)

自从RocksDB 3.0引入支持column family,每个KV数据对能够指定关联唯一的column family(默认为“default”),做到相对独立的隔离存储;column family提供了逻辑上划分数据库的能力,支持跨column family进行原子写操作(借助WriteBatch实现)等。

所有的column family共享WAL日志文件(write-head log),但是每个column family有独立的MemTable和SSTable。
共享WAL有利于原子操作实现,更高效的成组提交。
独立的MemTable和SSTable则更方便数据压缩,配置选项,快速的删除某个column family。

来看下column family在数据库读写数据流向中的具体操作,如何参与构造,与leveldb相比有哪些变化:
1. Put/Write/Delete操作以WriteBatch形式实现,先来看下格式:若指定column family则位于每条记录的ValueType之后,将由db分配的ID(uint32_t)以varint32编码形式存储于WriteBatch中;若无指定,则无需存储CFID;是否存储可由ValueType字段区分。
2. MemTable Add/Update操作并没有存储column family id的信息,因为MemTable本身隶属于Column Family,但是8字节的Sequence Number是包含ValueType信息的(低字节部分)。
3. 写WAL log文件基于WriteBatch,并不改变记录格式。
4. 写SSTable文件基于MemTable(或compaction操作,实质也是由MemTable而来),无需存储column family信息。

应用上可以利用column family实现如元数据存储、二级索引等。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注