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 存储.
来源: https://yq.aliyun.com/articles/610455