表(Table)

最基本的数据库对象,OceanBase 数据库的表都是关系表。

每个表由若干行记录组成,每一行有相同的预先定义的列。用户通过 SQL 语句对表进行增、删、查、改等操作。通常,表的若干列会组成一个主键,主键在整个表的数据集合内唯一。

分区(Partition)

分区是物理数据库设计技术,它的操作对象是表。实现分区的表,我们称之为分区表。

表分布在多个分区上。当一个表很大的时候,可以水平拆分为若干个分区,每个分区包含表的若干行记录。根据行数据到分区的映射关系不同,分为 hash 分区、range 分区(按范围)、key 分区等。每一个分区,还可以用不同的维度再分为若干分区,叫做二级分区。例如,交易记录表,按照用户 ID 分为若干 hash 分区,每个一级 hash 分区再按照交易时间分为若干二级 range 分区。

表组(TableGroup)

表格组。每个表都可能有自己所属的表格组。

TableGroup 是一个逻辑概念,它和物理数据文件没有关联关系,Table Group 只影响表分区的调度方法,OceanBase 数据库会优先把属于同一个 Table Group 的相同分区号的分区,调度到同一台节点上,以减少跨节点分布式事务。

Table Group 不是一个物理对象,它是一个逻辑概念,表示一组表,或者说是表的集合。属于这样一个集合的表,需要满足一定的约束:所有表必须拥有相同的 Locality(副本类型、个数及位置),相同的 Primary Zone(leader 位置及其优先级),以及相同的分区方式。

Partition Group

通过定义 TableGroup,用户可以控制一组表在物理存储上的临近关系。对于包含分区表的 TableGroup,它由若干个 Partition Group 组成。称 TableGroup 的每个分区表中下标相同的一组分区为 Partition Group。属于同一个 Partition Group 的所有 Partition,系统会通过自动调度使它们位于同一台 OBServer 服务器上,且这些分区副本的 leader 也位于一台 OBServer 上。

除了用来定义“临近”关系,分区表本身隐含有“分片”的作用,要求系统在调度时,还会把同一个TableGroup 的不同 Partition Group 尽量在多个可用的机器间分散来开,以支持水平自动扩展。同时 Partition Group 是负载均衡和leader切换等操作的最小执行单元。

对于属于一个 TableGroup 的不同 Partition Group,TableGroup 的概念无法定义和表达 Partition Group 之间的临近关系;也就是说,用户无法控制一个分区表的多个分区间是否聚集在一起。相反,RS 会让他们尽可能分散开。