Author: 张远
本文简要介绍了一些存储引擎存储结构,包括InnoDB, TokuDB, RocksDB, TiDB, CockroachDB, 供大家对比分析
InnoDB 底层存储结构为B+树,结构如下
B树的每个节点对应innodb的一个page,page大小是固定的,一般设为16k。
其中非叶子节点只有键值,叶子节点包含完整数据。
InnoDB按segment, extent, page方式管理page
每个数据节点page结构如下
数据记录record按行存储,record具体格式由row_format决定. 详情可以参考数据内核月报
TokuDB 底层存储结构为Fractal Tree
Fractal Tree的结构与B+树有些类似, 在Fractal Tree中,每一个child指针除了需要指向一个child节点外,还会带有一个Message Buffer ,这个Message Buffer 是一个FIFO的队列,用来缓存更新操作。
例如,一次插入操作只需要落在某节点的Message Buffer就可以马上返回了,并不需要搜索到叶子节点。这些缓存的更新会在查询时或后台异步合并应用到对应的节点中。
RockDB的存储结构如下
RocksDB写入数据时,先写到memtable中,memtable一般为skiplist, memtable写满时转为immutable memtable并刷入Level 0.
Level0中的SST文件中的数据都是有序的,Level0中SST文件之间的数据范围可能存在重叠。 其他Level中的SST文件之间的数据范围不重叠。
RocksDB会以一定的机制从低level compact数据到高level中。
RocksDB中SST文件的结构如下
MyRocks使用的存储引擎就是RocksDB, MyRocks的中RocksDB的数据映射关系参考 之前的月报
TiDB的存储结构
TiDB是分布式存储,分为两个部分TiKV和Placement Driver server。
TiKV用于存储真正的数据,TiKV由分布在不同机器上的RocksDB实例组成。
数据按范围划分为一个个Region. 并且会尽量保持每个 Region 中保存的数据不超过一定的大小(这个大小可以配置,目前默认是 64MB). 同一Region分布在不同的RocksDB实例中,一个RocksDB实例包含多个Region.
图中,Region4有三个副本分布在三个RocksDB实例中,这三个Region副本组成一个RaftGroup,副本间通过Raft协议保证一致性。
Placement Driver server(PD), 也是一个集群,也通过Raft协议保证一致性。PD主要有以下作用:
TiDB的数据映射关系
以下表为例
create table user(user_id int primary key, name varchar(100), email varchar(200));
INSERT INTO user VALUES (1, “bob”, “huang@pingcap.com”);
INSERT INTO user VALUES (2, “tom”, “tom@pingcap.com”);
对应到RocksDB中的KV结构如下
Key | Values |
---|---|
user/1 | bob huang@pingcap.com |
user/2 | tom tom@pingcap.com |
CockroachDB的存储结构
CockroachDB的也是分布式存储,其结构和TiDB类似。CockroachDB按范围划分为Range,Range默认为64M,Range的存储为RocksDB, CockroachDB的一个node包含多个RocksDB实例。 Range副本分布在不同的node中,通过Raft协议保证一致。
Range的元数据信息也保存在Range中(靠前的Range中).
System keys come in several subtypes:
CockroachDB的数据映射关系
以下表为例
create table mydb.customers(name varchar(100) primary key, address varchar(100) , URL varchar(100));
insert into mydb.customers values('Apple','1 Infinite Loop, Cupertino, CA','http://apple.com/');
表结构信息
Key | Values |
---|---|
/system/databases/mydb/id | 51 |
/system/tables/customer/id | 42 |
/system/desc/51/42/address | 69 |
/system/desc/51/42/url | 66 |
表中的数据
Key | Values |
---|---|
/51/42/Apple/69 | 1 Infinite Loop, Cupertino, CA |
/51/42/Apple/66 | http://apple.com/ |
本文简要介绍了各存储引擎的结构,供大家参考,有错误之处请指正.