暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

OceanBase系统架构租户的资源管理

2023-11-26
718

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_CPU

  • MEMORY_SIZE

对于可选参数 MIN_CPUMAX_IOPSMIN_IOPS 和 LOG_DISK_SIZE

  • MIN_CPU 默认等于 MAX_CPU

  • MIN_IOPS 默认等于 MAX_IOPS

  • LOG_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。下面举例说明:

    1. 租户规格大于等于 10G 时,Meta 租户和用户租户内存规格比例为 1:9

    2. 租户规格大于等于 2G 时,Meta 租户的内存规格固定为 1G,剩余资源给用户租户

    3. 租户规格小于 2G 时,Meta 租户固定分配 512M,剩余资源给用户租户

    4. 租户规格最小 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%:
  • 租户规格大于等于 2G 时,Meta 租户最小 1G
  • 租户规格小于 2G 时,Meta 租户占用 512M
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 在 z1z2 上各有 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 调整为 6MEMORY_SIZE 调整为 36G,其他配置选项不变。通过调整资源配置的各个选项,可调整租户的资源池在对应 Zone 上的资源规格,进而影响租户的服务能力。

切换资源配置

切换资源池的资源配置可以调整资源池下每个资源单元的资源规格,进而调整租户在该资源池上的资源规格和服务能力。

切换资源池的资源配置的示例语句如下:

obclient> ALTER RESOURCE POOL rp1 UNIT 'uc2';

假设资源池 rp1 之前的资源配置为 uc1,则示例语句将 rp1 的资源配置从 uc1 变更为 uc2。理论上 OceanBase 数据库支持对资源规格 MIN_CPUMAX_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,并创建了一个资源池 pool1pool1 使用 u_c0 作为自己的资源配置,之后调大 u_c0 的 MIN_CPUMAX_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。并创建了一个资源池 pool1pool1 最初使用 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_NUMALTER 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 的管理层看来是多个资源池合并为一个资源池,方便统一维护。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论