OceanBase 数据库是多租户的数据库系统,一个集群内可包含多个相互独立的租户,每个租户提供独立的数据库服务。在 OceanBase 数据库中,使用资源配置(unit_config)、资源池(Resource Pool)和资源单元(Unit)等三个概念,对各租户的可用资源进行管理。
租户资源的创建
创建租户前,需首先确定租户的资源配置、使用资源范围等。租户创建的通用流程如下:
创建资源配置
创建资源池
创建租户
创建资源配置
资源配置是描述资源池的配置信息,用来描述资源池中每个资源单元可用的 CPU、内存、存储空间和 IOPS 等的规格。修改资源配置可动态调整资源单元的规格。这里需要注意,资源配置指定的是对应资源单元能够提供的服务能力,而不是资源单元的实时负载。 创建资源配置的示例语句如下:
obclient> CREATE RESOURCE UNIT uc1 MAX_CPU 5, MIN_CPU 4, MEMORY_SIZE '36G', MAX_IOPS 128000, MIN_IOPS 128000, LOG_DISK_SIZE '2T' ;
CREATE RESOURCE UNIT 语句中的必选参数包括:
MAX_CPUMEMORY_SIZE
对于可选参数 MIN_CPU、MAX_IOPS、MIN_IOPS 和 LOG_DISK_SIZE:
MIN_CPU默认等于MAX_CPUMIN_IOPS默认等于MAX_IOPSLOG_DISK_SIZE默认等于 3 倍的内存大小,最小为 2G。MAX_IOPS和MIN_IOPS的最小值为 1024,并且要求MAX_IOPS >= MIN_IOPS。如果未指定
MIN_IOPS和MAX_IOPS的值:MIN_IOPS和MAX_IOPS的值根据MIN_CPU规格自动计算,1个 Core 对应 1 万 IOPS 值,即MAX_IOPS = MIN_IOPS = MIN_CPU * 10000。如果用户未指定
IOPS_WEIGHT,则IOPS_WEIGHT = MIN_CPU;如果用户指定了IOPS_WEIGHT,则IOPS_WEIGHT以用户指定的值为准。
如果仅指定了
MAX_IOPS的值:MIN_IOPS取MAX_IOPS的值;反之亦然。如果用户未指定
IOPS_WEIGHT的值,则默认为0。
MIN_CPU 表示使用该资源配置的资源单元能够提供的 CPU 的下限。
Meta 租户的资源配置
Meta 租户没有独立的 Unit,租户资源管理过程中不管理 Meta 租户。系统在创建租户时默认为 Meta 租户预留资源,各项资源从用户租户的资源中扣除。目前 Meta 租户的各项资源采用默认配置,不支持用户指定,包括:CPU、MEMORY、IOPS 以及 LOG_DISK_SIZE。
其中:
CPU 资源:Meta 租户和用户租户共享 CPU 资源,不做隔离。考虑到公有云最小 1c2G 的售卖模式,CPU 规格最小为 1c。在
GV$OB_UNITS视图中展示的 Meta 租户的 CPU 资源规格为NULL,表示与用户租户共享 CPU 资源。MEMORY 资源:内存资源不支持共享,Meta 租户和用户租户的内存资源需要隔离。默认 Meta 租户占整体租户规格的 10%。为了保证 Meta 租户正常运行,Meta 租户内存资源规格最小为 512M,不设最大值。整体租户内存规格减去 Meta 租户内存规格即为用户租户的内存规格。整体租户规格最小值调整为 1G。下面举例说明:
租户规格大于等于 10G 时,Meta 租户和用户租户内存规格比例为 1:9
租户规格大于等于 2G 时,Meta 租户的内存规格固定为 1G,剩余资源给用户租户
租户规格小于 2G 时,Meta 租户固定分配 512M,剩余资源给用户租户
租户规格最小 1G,Meta 租户占用 512M,用户租户占用 512M
日志盘资源:日志盘资源规格用户可以不指定,默认值为内存资源的3倍大小,最小值为 2G。日志盘资源和内存资源一样,不支持共享,Meta 租户和用户租户的日志盘资源需要隔离。默认,Meta 租户占整体租户规格的 10%。为了保证 Meta 租户正常运行,Meta 租户的日志盘资源规格最小为 512M。
IOPS资源:Meta 租户和用户租户共享 IOPS 资源,不做隔离。在
GV$OB_UNITS视图中展示的 Meta 租户的 IOPS 资源规格会为NULL,表示与用户租户共享 IOPS 资源。
用户租户和 Meta 租户的资源规格取值如下表所示。
| 资源参数 | 租户规格 | 用户租户 | Meta租户 |
|---|---|---|---|
| MIN_CPU / MAX_CPU | 最小 1C | 共享 CPU 资源规格 | 共享 CPU 资源规格 |
| MEMORY_SIZE | 最小 1G | 最小 512M | 租户规格的 10%:
|
| LOG_DISK_SIZE | 最小 2G | 最小 1.5G | 租户规格的 10%,最小 512M |
| MAX_IOPS / MIN_IOPS | 最小 1024 | 共享 IOPS 资源规格 | 共享 IOPS 资源规格 |
创建资源池
资源池由若干个资源单元组成,通过给资源池指定资源配置,可指定资源池下各资源单元的物理资源。创建资源池的示例语句如下:
obclient> CREATE RESOURCE POOL rp1 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('zone1', 'zone2');
在该示例语句中,创建了一个资源池 rp1,该资源池有三个要素,三个要素缺一不可:
UNIT 'uc1'表示为该资源池指定的资源配置为uc1,该资源池下的每个资源单元使用uc1的规格进行配置。ZONE_LIST ('zone1','zone2')是为资源池指定的使用范围,表示该资源池要在zone1和zone2上创建资源单元。UNIT_NUM 2是为资源池指定资源单元的个数,表示在ZONE_LIST内的每个 Zone 上都创建 2 个资源单元。
任何一个资源单元一定需要放置在资源足够容纳下它的物理机上,并且单台物理机上最多能放置同一个资源池下的一个资源单元,如果 zone1 或 zone2 上的物理机个数小于 2,或物理机的资源小于 uc1 的规格,上述创建资源池的示例语句将无法执行成功,资源池最终会创建失败。
创建租户
创建好资源池后,可以继续创建租户,一个资源池仅能属于一个租户,一个租户可拥有一个或多个资源池,租户在同一个 Zone 上仅能有一个资源池,即属于同一个租户的多个资源池的 ZONE_LIST 彼此不允许有交集。一个租户的所有资源池下的全部资源单元的集合描述了该租户可以使用的全部物理机资源。
创建租户的示例语句如下:
obclient> CREATE RESOURCE POOL pool1 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('z1', 'z2');
obclient>CREATE RESOURCE POOL pool2 UNIT 'uc1', UNIT_NUM 1, ZONE_LIST ('z3');
obclient>CREATE TENANT tt resource_pool_list=('pool1','pool2');
示例语句中首先创建了两个资源池 pool1 和 pool2,并在此基础上创建了租户 tt,租户 tt 在 z1、z2 上各有 2 个资源单元,在 z3 上有 1 个资源单元,各资源单元的规格均使用 uc1 指定的资源配置。
注意
属于同一个租户的多个资源池的 ZONE_LIST 彼此不允许有交集。
租户资源的变更
租户的资源变更通过调整租户下各资源的三要素即可完成,具体表现为,可以分别单独调整资源池的 Unit 配置、ZONE_LIST 和 UNIT_NUM 来进行租户资源的变更。除此之外,还支持对资源池进行 Split 或 Merge 两个特殊的变更操作。
修改资源配置
修改资源池的资源配置即直接调整资源配置的 CPU 或 Memory 等的值,进而直接影响租户在该资源池上的资源规格和服务能力。 修改资源池的资源配置的示例语句如下:
obclient> CREATE RESOURCE UNIT uc1 MAX_CPU 5, MIN_CPU 4, MEMORY_SIZE '32G', MMAX_IOPS 128000, MIN_IOPS 128000, LOG_DISK_SIZE '2T';
obclient> CREATE RESOURCE POOL pool1 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('z1', 'z2');
obclient> CREATE RESOURCE POOL pool2 UNIT 'uc1', UNIT_NUM 1, ZONE_LIST ('z3');
obclient> CREATE TENANT tt resource_pool_list=('pool1','pool2');
obclient> ALTER RESOURCE UNIT uc1 MAX_CPU 6, MEMORY_SIZE '36G';
示例中,资源池 pool1 和 pool2 的资源配置是 uc1,语句 ALTER RESOURCE UNIT uc1 MAX_CPU 6, MEMORY_SIZE '36G'; 将资源配置 uc1 的 MAX_CPU 调整为 6;MEMORY_SIZE 调整为 36G,其他配置选项不变。通过调整资源配置的各个选项,可调整租户的资源池在对应 Zone 上的资源规格,进而影响租户的服务能力。
切换资源配置
切换资源池的资源配置可以调整资源池下每个资源单元的资源规格,进而调整租户在该资源池上的资源规格和服务能力。
切换资源池的资源配置的示例语句如下:
obclient> ALTER RESOURCE POOL rp1 UNIT 'uc2';
假设资源池 rp1 之前的资源配置为 uc1,则示例语句将 rp1 的资源配置从 uc1 变更为 uc2。理论上 OceanBase 数据库支持对资源规格 MIN_CPU、MAX_CPU 以及 MEMORY_SIZE 同时修改。但通常情况下,修改资源配置和切换资源配置都能对租户的服务能力进行调整。对应到租户层面,实际上是调整了租户资源单元的规格。对资源规格的修改通常有以下两种场景:
调大资源规格
调大资源规格主要用在租户的资源扩容场景中,可分别对 CPU 和 Memory 进行资源扩容。
示例 1:
obclient> CREATE RESOURCE UNIT u_c0 MAX_CPU 5, MIN_CPU 4, MEMORY_SIZE '36G', MAX_IOPS 128000, MIN_IOPS 128000, LOG_DISK_SIZE '2T'; obclient> CREATE RESOURCE POOL pool1 unit='u_c0', unit_num=3, zone_list=('z1','z2','z3'); obclient> ALTER RESOURCE UNIT u_c0 MAX_CPU 10, MIN_CPU 8, MEMORY_SIZE '72G';上述示例 1 中创建了一个资源配置
u_c0,并创建了一个资源池pool1,pool1使用u_c0作为自己的资源配置,之后调大u_c0的MIN_CPU、MAX_CPU或MMEMORY_SIZE。该调整旨在调大资源池pool1的资源规格,目的是提高相应租户的服务能力。示例 2:
obclient> CREATE RESOURCE UNIT u_c0 MAX_CPU 5, MIN_CPU 4, MEMORY_SIZE '36G', MMAX_IOPS 128000, MIN_IOPS 128000, LOG_DISK_SIZE '2T'; obclient> CREATE RESOURCE UNIT u_c1 MAX_CPU 10, MIN_CPU 8, MEMORY_SIZE '72G', MMAX_IOPS 128000, MIN_IOPS 128000, LOG_DISK_SIZE '2T'; obclient> CREATE RESOURCE POOL pool1 unit='u_c0', unit_num=3, zone_list=('z1','z2','z3'); obclient> ALTER RESOURCE POOL pool1 unit='u_c1';上述示例 2 中创建了两个资源配置
u_c0和u_c1。并创建了一个资源池pool1,pool1最初使用u_c0作为自己的资源配置,之后调整为资源配置u_c1。该调整旨在调大资源池pool1的资源规格,目的是提高相应租户的服务能力。调小资源规格
根据调大资源规格的示例,系统还支持调小资源规格,方法与调大资源规格的方法相同。
未被分配的资源池的 UNIT_NUM 变更
调整资源池的 UNIT_NUM 可以调整资源池下每个 Zone 内资源单元的数量,进而通过调整资源单元的数量来提高或降低该租户在对应 Zone 上的服务能力。
调整资源池的 UNIT_NUM 的示例语句如下:
obclient> CREATE RESOURCE POOL rp1 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('zone1', 'zone2');
obclient> ALTER RESOURCE POOL rp1 UNIT_NUM 3; // 调大unit num
obclient> ALTER RESOURCE POOL rp1 UNIT_NUM 2; // 调小unit num
obclient> ALTER RESOURCE POOL rp1 UNIT_NUM 1 DELETE UNIT = (1001, 1003); // 指定资源单元调小unit num
变更 UNIT_NUM 也分为两类,即调大 UNIT_NUM 和调小 UNIT_NUM。其中,ALTER RESOURCE POOL rp1 UNIT_NUM 3; 是调大 UNIT_NUM;ALTER RESOURCE POOL rp1 UNIT_NUM 2; 和 ALTER RESOURCE POOL rp1 UNIT_NUM 1 DELETE UNIT = (1001, 1003); 为调小 UNIT_NUM。
租户资源池的 UNIT_NUM 变更
资源池在赋予租户后也可以进行 UNIT_NUM 的变更,但是只能增加,不能减少。资源池变更要以租户为单位,所有资源池都增加才可以成功。调整租户资源池的 UNIT_NUM 的示例语句如下:
obclient> CREATE RESOURCE POOL pool1 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('zone1', 'zone2');
obclient> CREATE RESOURCE POOL pool2 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('zone3');
obclient> CREATE TENANT tt resource_pool_list=('pool1','pool2');
obclient> ALTER RESOURCE TENANT tt UNIT_NUM = 3;//调大unit num
变更 ZONE_LIST
调整资源池的 ZONE_LIST 可以调整资源池在 Zone 维度的使用范围,从而调整租户数据在 Zone 维度的服务范围。
调整资源池的 ZONE_LIST 的示例语句如下:
obclient> CREATE RESOURCE POOL pool1 UNIT_NUM=3, UNIT='unit_config', ZONE_LIST=('z1','z2','z3');
obclient> CREATE RESOURCE POOL pool2 UNIT_NUM=3, UNIT='unit_config', ZONE_LIST=('z1','z2','z3');
obclient> ALTER RESOURCE POOL pool1 ZONE_LIST=('z1','z2','z3','z4');
obclient> ALTER RESOURCE POOL pool2 ZONE_LIST=('z1','z2');
变更 ZONE_LIST 也分为两类,即扩大 Zone 维度的使用范围和缩小 Zone 维度的使用范围。其中,ALTER RESOURCE POOL pool1 ZONE_LIST=('z1','z2','z3','z4'); 是扩大 Zone 维度的使用范围;ALTER RESOURCE POOL pool2 ZONE_LIST=('z1','z2'); 是缩小 Zone 维度的使用范围。
分裂资源池
分裂资源池操作可将一个资源池分裂为多个资源池,分裂资源池操作的基本语法和示例如下:
obclient> CREATE RESOURCE POOL pool1 UNIT='uc0', UNIT_NUM=1, ZONE_LIST=('z1','z2','z3');
obclient> ALTER RESOURCE POOL pool1 SPLIT INTO ('pool10','pool11','pool12') ON ('z1','z2','z3');
obclient> ALTER RESOURCE POOL pool10 UNIT='uc1';
obclient> ALTER RESOURCE POOL pool11 UNIT='uc2';
obclient> ALTER RESOURCE POOL pool12 UNIT='uc3';
合并资源池
合并资源池操作可将多个资源池合并为一个资源池,合并资源池的基本语法和示例如下:
obclient> CREATE RESOURCE POOL pool1 UNIT='uc0', UNIT_NUM=1, ZONE_LIST=('z1');
obclient> CREATE RESOURCE POOL pool2 UNIT='uc0', UNIT_NUM=1, ZONE_LIST=('z2');
obclient> CREATE RESOURCE POOL pool3 UNIT='uc0', UNIT_NUM=1, ZONE_LIST=('z3');
obclient> ALTER RESOURCE POOL MERGE ('pool1','pool2','pool3') INTO ('pool0');
说明
合并资源池时,不会影响资源池被租户使用,仅在 RootService 的管理层看来是多个资源池合并为一个资源池,方便统一维护。




