OceanBase数据分为基线数据和增量数据两个部分,基线数据分布在多台ChunkServer上,增量数据全部存放在一台UpdateServer上。如下图所示,系统中有5个子表,每个子表有3个副本,所有的子表分布到4台ChunkServer 上。RootSever中维护了每个子表所在的ChunkServer的位置信息,UpdateServer存储了这5个子表的增量更新。
不考虑数据复制,各模块的数据结构如下:
基线数据的数据结构
- 每个表格按照主键组成一棵分布式B+树,主键由若干列组成;
- 每个叶子节点包含表格一个前开后闭的主键范围(rk1,rk2]内的数据;
- 每个叶子节点称为一个子表(tablet),包含一个或者多个SSTable;
- 每个SSTable内部按主键范围有序划分为多个块(block)并内建块索引(block index);
- 每个块的大小通常在4~64KB之间并内建块内的行索引;
- 数据压缩以块为单位,压缩算法由用户指定并可随时变更;
- 叶子节点可能合并或者分裂;
- 所有叶子节点基本上是均匀的,随机地分布在多台ChunkServer机器上;
- 通常情况下每个叶子节点有2-3个副本;
- 叶子节点是负载平衡和任务调度的基本单元;
- 支持布隆过滤器的过滤。
增量数据的数据结构
- 增量数据按照时间从旧到新划分为多个版本;
- 最新版本的数据为一棵内存中的B+树,称为活跃MemTable;
- 用户的修改操作写入活跃MemTable,到达一定大小后,原有的活跃MemTable将被冻结,并开启新的活跃MemTable接受修改操作;
- 冻结的MemTable 将以SSTable的形式转储到SSD中持久化;
- 每个5STable内部按主键范围有序划分为多个块并内建块索引,每个块的大小通常为4~8KB并内建块内行索引,一般不压缩;
- UpldateScver支持主备,增量数据通常为2个副本,每个副本支持RAID1存储。