资源单元(Unit)是 OceanBase 数据库系统内用户资源在 OBServer 上的容器(或虚拟机),它是 OceanBase 数据库作为多租户分布式数据库架构的重要概念。RS 模块需要对资源单元进行管理,并通过把资源单元在多个 OBServer 间调度,对系统资源进行有效利用。
RS 对资源单元的管理包括:
资源单元的分配,即新建一个资源单元时,RS 需要决定这个 Unit 分配到哪个 OBServer 上。
资源单元的均衡,即在系统运行过程中,RS 根据 Unit 的资源规格等信息对 Unit 进行再平衡的一个调度过程。
当前,Unit 的分配和均衡策略的目标如下:
考虑能够支持多种资源的分配和均衡调度,主要为 CPU 资源和 Memory 资源。
支持 Zone 内 OBServer 间资源均衡的分配。
多种资源
在当前的 Unit 分配和均衡算法中,主要考虑两类资源(CPU 资源和 Memory资源)的分配和均衡,多种资源同时存在时,资源的分配和均衡可能存在一定问题。为简化问题描述,先考察仅有单一资源的分配和均衡算法,以下以 CPU 资源为例,讨论单一资源的分配和均衡算法。
CPU 单一资源的均衡示例
示例背景
假设存在两个 OBServer:OBS0(10 个 CPU)和 OBS1(10 个 CPU)。其中,OBS0 上包含 6 个 Unit,每个 Unit 的资源规格为 1 个 CPU;OBS1 上包含 4 个 Unit,每个 Unit 的资源规格为 1 个 CPU。
均衡目标
通过在 OBServer 间迁移 Unit,使得各 OBServer 的 CPU 占用率尽可能接近。
均衡过程
从该示例场景可以看到,OBS0 的 CPU 占用率为
(6 / 10) * 100%= 60%,OBS1 的 CPU 占用率为(4 / 10) * 100% = 40%。两个 OBServer 的 CPU 占用率差值为 0.2,将 OBS0 上的一个 Unit 迁移到 OBS1 上,迁移后的 OBS0 的 CPU 占用率为(5 / 10) *100% = 50%,OBS1 的 CPU 占用率为(5 / 10) *100% = 50%,两个 OBServer 的 CPU 相等,与迁移 Unit 前相比,两个 OBServer 的资源占用率更平均。
多种资源占用率的计算
当系统中有多种资源需要进行分配和均衡时,仅使用其中一种资源的占用率去进行分配和均衡可能不够准确,也很难达到较好的分配和均衡效果,为此,OceanBase 数据库在多种资源(CPU 资源和 Memory 资源)均衡和分配时,使用了如下的分配和均衡方法,即为参与分配和均衡的每种资源分配一个权重,作为计算 OBServer 总的资源占用率时该资源所占的百分比。每种资源的权重使用如下方法计算,即某种资源使用的越多,则该资源的权重就越高。
例如,某集群中总的 CPU 资源为 50 个CPU,Unit 共占用 20 个 CPU,则 CPU 总的占用率为 40%。该集群中总的 Memory 资源为 1000 GB,Unit 共占用 Memory 资源 100 GB,则 Memory 占用率为 10%,集群中没有其他资源参与均衡。归一化后,CPU 和 Memory 资源的权重分配为 80% 和 20%,各 OBServer 根据该权重计算各自的资源占用率,然后再通过迁移降低各 OBServer 之间的资源占用率差值。
资源单元的分配
创建一个新的 Unit 时,需要为该 Unit 选择一个 OBServer 宿主机,分配宿主机所采用的方法是:先根据上面多资源占用率的计算规则,计算出每一个 OBServer 的资源占用率,然后选取资源占用率最小的那台 OBServer,作为新建 Unit 的宿主机。
资源单元的均衡
资源单元均衡是通过在 OBServer 间迁移 Unit 的方式使得各 OBServer 的资源占用率相差尽量小,使用上述多种资源占用率的算法,可以计算出每台 OBServer 的资源占用率,并尝试不断迁移 Unit,使得迁移 Unit 完成后,各 OBServer 之间的资源占用率比迁移 Unit 前更小,即完成了资源单元的均衡。
资源单元均衡的控制
OceanBase 数据库通过 2 个配置项用于控制资源单元的均衡:
enable_rebalance该配置项为负载均衡的总开关,用于控制资源单元的均衡。
server_balance_cpu_mem_tolerance_percent该配置项为触发资源单元均衡的阈值,当某些 OBServer 的资源单元负载与平均负载的差值超过
server_balance_cpu_mem_tolerance_percent设置的值时,开始调度均衡,直到所有 OBServer 的资源单元的负载与平均负载的差值都小于配置项server_balance_cpu_mem_tolerance_percent的值。
手动迁移资源单元
除了上述资源单元的自动均衡以外,OceanBase 数据库还支持资源单元的手动迁移,即数据库管理员可以通过 SQL 指令对资源单元进行手动迁移,具体迁移语句如下。
obclient> ALTER SYSTEM MIGRATE UNIT $unit_id DESTINATION '$server';
其中:
$
unit_id:填写待迁移的 Unit 的 ID,可通过oceanbase.gv$unit视图查询。$
server:填写将 Unit 迁移到的目标 Server 地址,格式为ip 地址:端口号。例如,10.10.10.1:2882。
处于迁移中的资源单元,您也可以手动取消该资源单元的迁移,具体语句如下。
obclient> ALTER SYSTEM CANCEL MIGRATE UNIT $unit_id;



