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