问题: 三个节点,三台节点的容量不一致,一个 1T,一个 500G,一个 128G,数据存储打散到各个节点,规则是怎么样的?
答: OceanBase 数据库中数据存储打散到各个节点的规则主要通过 表组(Table Group) 和 分区策略(Partition Strategy) 来实现负载均衡。
表组(Table Group)。
表组是用于控制多个表数据分布的一种逻辑结构。它决定了这些表的分区是否被打散到不同的节点上。表组有一个 SHARDING 属性,用来定义如何将表的分区分布到不同的机器上。
SHARDING 属性值说明:
NONE:表组内的所有表的所有分区均聚集在同一台机器上,并且对加入表组的表没有任何限制。
PARTITION:表组内每一张表的数据按一级分区打散;如果是二级分区表,则一级分区下的所有二级分区聚集在一起。
ADAPTIVE:表组内每一张表的数据根据自适应方式打散。即,如果表组内的表是一级分区表,则按一级分区打散;如果表组内的表是二级分区表,则按每个一级分区下的二级分区打散。
分区策略(Partition Strategy)。
OceanBase 支持多种分区策略,包括范围(Range)、列表(List)、哈希(Hash)和 Key 分区等。其中,哈希分区 是最常用于打散数据的策略。
分区均衡策略的优先级顺序如下:分区属性对齐(table group对齐) > 分区数量均衡 > 分区磁盘均衡
常见分区类型:
范围分区(Range Partitioning):按照某一列的值范围划分数据,适用于时间序列等场景。
列表分区(List Partitioning):将某些特定值划分为一个分区。
哈希分区(Hash Partitioning):通过对分区键做哈希运算,将数据均匀分布到多个分区中,适合负载均衡的需求。
Key 分区:类似于哈希分区,但使用数据库内部算法来计算分区。
Unit Group 和日志流组(Log Stream Group)。
在物理资源调度层面,OceanBase 使用 Unit 来抽象节点上的资源,而多个 Unit 组成 Unit Group。Unit Group 决定了哪些 Unit 可以承载某个租户的数据。
每个 Unit Group 对应一个日志流组(Log Stream Group),日志流组中的每个日志流对应一个数据分区。系统通过调整 Unit 在不同节点之间的分布来实现负载均衡和容灾。
示例配置: 假设租户配置为 unit_num = 2,primary_zone = 'Z1,Z2,Z3',则该租户定义了 2 个 Unit Group、2 个日志流组和 6 个日志流。
所以根据存储打散规则判断:
三个节点如果是三个 Zone 那么集群可用最大容量就是 128G,每个 Zone 都会有租户的一个副本集存在。
如果为一个 Zone,则需要看租户的 unit_num 设置个数了。存在 Unit 的节点承载着租户的数据。
单个 Zone 三个节点存储不同的话,OceanBase 数据库 V4.x 的数据均衡都是按相同规格搞的,后面有可能大磁盘没法充分利用。
适用版本
OceanBase 数据库 V4.x 版本。