首批通过分布式安全可靠测评,为关键业务系统打造
数据负载均衡概述
更新时间:2026-03-31 13:11:53
OceanBase 数据库提供了水平扩缩容和数据动态均衡等负载均衡能力。
水平扩缩容能力指的是通过调整服务节点的数量来实现服务能力的扩缩容,例如,从单个服务节点扩展为两个服务节点,即可实现服务能力的扩容。同时,水平扩缩容还需要支持数据的重分布,例如从单个服务节点扩展为两个服务节点,需要让数据均衡的分布在两个服务节点上;反之,当两个服务节点缩容为单个服务节点时,需要让数据重分布到单个服务节点上。
数据动态均衡能力指的是服务节点不变的情况下,通过调整数据分布,以实现各个服务节点负载动态均衡的能力。例如,随着表和分区的动态创建和删除,不同服务节点上服务的分区个数会有很大差异,导致服务节点的负载不均衡,基于分区动态均衡能力,可以实现分区在各个服务节点上均衡分布,从而实现负载均衡。
水平扩缩容
OceanBase 数据库中租户的存储容量和读写服务能力主要受以下两方面的影响:
Unit Number,即每个 Zone 上提供服务的 Unit 个数
通过增加或减少 Unit Number,从而增加或减少服务节点,实现读写服务和存储容量的水平扩缩容。
通过调整 Unit Number 实现租户扩缩容的详细操作,请参见 通过调整 Unit Number 实现租户扩缩容。
Primary Zone,即提供读写服务的 Zone 列表
通过增加或减少第一优先级的 Primary Zone 的个数,从而增加或减少提供读写服务的 Zone,实现读写服务在 Zone 间的水平扩缩容。
通过调整 Primary Zone 实现租户扩缩容的详细操作,请参见 通过调整 Primary Zone 实现租户扩缩容。
用户通过动态调整 Unit Number 和 Primary Zone,可以实现租户的读写服务能力在 Zone 内和 Zone 间的水平扩缩容。负载均衡功能将根据用户服务能力的配置自适应调整日志流和分区分布。
分区均衡
分区均衡是指在表和分区动态变化的情况下,通过动态调整分区分布,实现分区个数、分区权重、表组权重以及存储空间在服务节点上的均衡。
OceanBase 数据库支持多种表类型,包括非分区表、一级分区表和二级分区表。不同类型的表的均衡策略不一样。为了方便描述均衡效果,OceanBase 数据库为不同的表分区划分了均衡组,在各个均衡组内要实现分区个数均衡和存储空间均衡。均衡组之间没有关系,内部自适应调整均衡组之间的分布关系。默认情况下,OceanBase 数据库的分区均衡策略如下:
一级分区表:每个一级分区表是一个独立的均衡组,表的所有一级分区打散分布在各个服务节点上。
二级分区表:每个一级分区下的所有二级分区形成一个独立的均衡组,每个一级分区下的所有二级分区打散分布在各个服务节点上。
非分区表:所有的非分区表统一考虑,有且仅有一个均衡组,所有的非分区表打散分布在各个服务节点上。
为了更加灵活描述不同表数据之间的聚集和打散关系,OceanBase 数据库引入了表组(Table Group)的概念。
表组是一个逻辑概念,表示一组表的集合。表组内的表在物理存储上有临近关系,而多张具有关联关系的表往往具有相同的分区规则,通过将相同规则的分区聚集分布在一起,可以实现 Partition Wise Join,大大优化读写性能。
从 OceanBase 数据库 V4.2.0 版本开始,引入了表组的 SHARDING 属性来控制表组内表数据的聚集和打散关系。表组的 SHARDING 属性有三种取值:NONE、PARTITION 和 ADAPTIVE。
用户可以根据自己的使用场景,选择合适的 SHARDING属性值。
场景 1:表组内所有表聚集在一起
如果用户希望将任意类型的表聚集在一台机器上,以满足业务单机访问的需求,可以采用 SHARDING = NONE 的表组,将任意类型的表聚集在一起。
SHARDING = NONE 的表组的含义如下:
- 支持加入任意分区类型的表,包括非分区表、一级分区表和二级分区表。
- 将表组内所有表的所有分区聚集在一起,系统保证调度在一台机器上。
场景 2:表组内表数据水平打散
当单机承载不下单个业务的数据时,用户希望将数据打散分布在多台机器,以实现水平扩展,可以采用 SHARDING = PARTITION 或 SHARDING = ADAPTIVE 的表组来满足该需求。
SHARDING = PARTITION 的表组的含义如下:
支持加入一级分区表和二级分区表。
- 分区方式要求:一级分区的分区方式相同;对于二级分区表,系统仅校验一级分区的分区方式。因此,一级分区表和二级分区表可以同时存在,仅要求其一级分区的分区方式相同即可。
- 分区对齐规则:相同一级分区值的分区聚集在一起,包括一级分区表的一级分区和二级分区表的对应一级分区下的所有二级分区。
将表组内所有表按一级分区打散。同时,对于二级分区表,其一级分区下的所有二级分区聚集在一起。
SHARDING = ADAPTIVE 的表组的含义如下:
支持加入的表为一级分区表或二级分区表。
分区方式要求:全部为一级分区表,或者全部为二级分区表。如果是一级分区表,则要求一级分区的分区方式相同;如果是二级分区表,则要求一级分区和二级分区的分区方式均相同。
分区对齐规则:
- 一级分区表:一级分区值相同的分区聚集在一起
- 二级分区表:一级分区值相同,并且二级分区值也相同的分区聚集在一起
自适应打散方式。如果表组内的所有表均为一级分区表,则按一级分区打散;如果表组内的所有表均为二级分区表,则按每个一级分区下的二级分区打散。
更多表组的详细介绍及操作,请参见 创建和管理表组(MySQL 模式) 和 创建和管理表组(Oracle 模式)。
基于表组权重的均衡
OceanBase 数据库的 MySQL 模式通过将 Database 绑定到一个 Sharding = 'NONE' 的表组上来实现用户表的聚合。当前支持同一个 Database 下的用户表的自动聚合和多个 Database 下的用户表聚合。
通过为 Sharding = 'NONE' 的表组设置权重实现表组权重均衡,可以帮助自动聚合的 Database 下的用户表按权重分布。表组权重均衡是分区均衡(PARTITION_BALANCE)任务中的一个过程,用户租户可以通过手动触发,或者等待定时分区均衡任务触发。
基于分区权重的均衡
为了进一步解决分区表内分区热点、表间分区热点等问题,OceanBase 数据库提供了基于权重的分区均 衡策略。分区权重,即分区之间占用的 CPU、内存、磁盘等资源的相对比重。分区权重均衡是分区均衡(PARTITION_BALANCE)任务中的一个过程,用户租户可以通过手动触发,或者等待定时分区均衡任务触发。
分区权重均衡算法通过分区移动和分区交换的方法,使各个用户日志流上分区权重之和的方差尽量小。
只有设置过分区权重的表会参与分区权重均衡。未设置权重的分区仍按照分区个数均衡。
数据负载均衡相关的配置项
-
租户级配置项
enable_rebalance在系统租户下用于控制是否进行租户间的负载均衡;在用户租户下用于控制是否进行租户内均衡。默认值为true。 -
租户级配置项
enable_transfer用于控制是否在租户下进行 Transfer,默认值为true。其中:当配置项
enable_rebalance的值为false时,无论配置项enable_transfer的值为true还是false,系统均不会进行自动负载均衡。当配置项
enable_rebalance的值为true且enable_transfer的值为 为true时,表示在进行租户扩缩容时,系统会自动调整租户内日志流的数量,通过日志流分裂、合并以及 Transfer 等操作,进行租户下的 Leader 均衡和分区均衡。当配置项
enable_rebalance的值为true且enable_transfer的值为 为false时,表示在进行租户扩缩容时,系统不会进行 Transfer 并且不会出现日志流数量的变化,仅在现有日志流的基础上尽量保证日志流均衡。
partition_balance_schedule_interval
租户级配置项
partition_balance_schedule_interval用于控制生成分区负载均衡任务的时间间隔。表示当enable_rebalance的值为true时,系统会将partition_balance_schedule_interval作为时间间隔来自动触发分区负载均衡任务。默认值为2h,取值范围为 [0s, +∞),0s表示关闭分区均衡。注意
对于 V4.4.x 版本,该配置项的默认值从 V4.4.1 版本开始更改为 0s,对于 V4.4.1 及之后版本,不建议再使用该配置项来控制分区均衡,用户可以通过调用
DBMS_BALANCE.TRIGGER_PARTITION_BALANCE子程序来定时或手动触发分区均衡。enable_database_sharding_none
租户级配置项
enable_database_sharding_none用于控制在创建 Database 时,是否开启用户表的自动聚合。默认值为False,表示在创建 Database 时,默认不开启用户表的自动聚合。