Skip to main content

集群扩缩容

本节介绍的是通过 OBD 手动扩缩容的方式,如果集群通过 OCP 管理,那么也可以直接在 OCP 上操作。

集群扩缩容包括两种,一种是节点,即扩容每个 Zone 内的 OBServer 的数量;还有一种是 Zone,即增减 Zone 的数量。两种操作都需要在 sys 租户下进行。

扩容​

扩容节点​

场景​

本例从 1-1-1 的集群架构扩容到 2-2-2 的集群架构

操作流程​

  1. 新建新增集群的配置文件

    新增集群配置参数建议跟原集群配置保持一致,防止资源量以及性能跟其他节点不同,注意:需要替换 server 名字以及 IP 地址。

    比如:原先为zone1(server1)、zone2(server2)、zone3(server3)。现在新增的配置里面 zone 不变,server 要变成 server4、server5、server6,并且将 IP 替换为新的 OBServer 地址。

    可以参照 配置文件。

  2. 使用 OBD 部署新集群

    obtest2 为新集群名字

    obd cluster deploy obtest2 -c obtest2.yaml
  3. 把新的配置文件复制到原本的配置文件中。

    查看原配置文件路径。

    [admin@obtest conf]$ obd cluster list
    +--------------------------------------------------------------+
    | Cluster List |
    +---------+----------------------------------+-----------------+
    | Name | Configuration Path | Status (Cached) |
    +---------+----------------------------------+-----------------+
    | obtest | /home/admin/.obd/cluster/obtest | running |
    | obtest2 | /home/admin/.obd/cluster/obtest2 | destroyed |
    +---------+----------------------------------+-----------------+

    根据原配置文件路径,找到原配置文件 config.yaml , 打开原配置文件,将新配置文件的节点内容复制到原配置文件中,复制后的配置文件可参考 配置文件。

    vim /home/admin/.obd/cluster/obtest/config.yaml

    注意

    新配置一定要放在对应原配置内容下面。

  4. 启动集群

    这里的集群为原集群,原先的 OBServer 不会受影响,只会启动新加入的节点。

    obd cluster start obtest
  5. 将节点添加到集群

    使用 root 用户登录集群的 sys 租户,并执行如下命令。

    alter system add server 'xxx.xxx.x.xxx:2882' zone 'zone1';
    alter system add server 'xxx.xxx.x.xxx:2882' zone 'zone2';
    alter system add server 'xxx.xxx.x.xxx:2882' zone 'zone3';
  6. 确认集群节点信息

    # 集群内通过如下 SQL 命令查询
    select * from __all_server;

    # OBD 查询
    obd cluster display obtest
  7. 添加成功后,根据业务实际情况,调整租户的资源配置,即调大 UNIT_NUM。

    ALTER RESOURCE TENANT tenant1 UNIT_NUM 2; 

扩容 Zone​

场景​

本例从 zone1,zone2,zone3 扩容为 zone1,zone2,zone3,zone4,zone5

操作流程​

前面增加节点的操作跟扩容节点相同,需要注意的是zone需要变化

  1. 添加 zone

    alter system add zone 'zone4' region 'sys_region';
    alter system start zone 'zone4';
    alter system add zone 'zone5' region 'sys_region';
    alter system start zone 'zone5';
  2. 添加 节点 到集群

    alter system add server 'xx.xx.xx.xx:2882' zone 'zone4';
    alter system add server 'xx.xx.xx.xx:2882' zone 'zone5';
  3. 修改 resource pool

    alter resource pool pool_1 zone_list=('zone1','zone2','zone3','zone4','zone5');
  4. 通过修改租户的 Locality 来增加副本。每次只能增加一个 Zone 内的 Locality。

    ALTER TENANT tenant1 LOCALITY='F@zone1,F@zone2,F@zone3,F@zone4';

    ALTER TENANT tenant1 LOCALITY='F@zone1,F@zone2,F@zone3,F@zone4,F@zone5';
  5. 确认当前副本信息

    select SVR_IP,SVR_PORT,TENANT_ID,ROLE,count(*) from CDB_OB_TABLE_LOCATIONS group by SVR_IP,SVR_PORT,TENANT_ID,ROLE;

操作结束后,本次扩容完成,等待副本迁移完成。

缩容​

缩容 Zone​

场景​

在进行集群的缩容操作前,需要确认集群中资源对当前负载有较多冗余,查看集群中资源的详细信息的相关操作请参见常用SQL。 本案例中的缩容是将集群中租户的 5 副本降为 3 副本的场景。

操作步骤​

  1. (可选)如果租户使用了 z4 或 z5 作为 Primary Zone,则需要修改该租户的 Primary Zone。

    ALTER TENANT tenant_name PRIMARY_ZONE='z1,z2,z3';
  2. 通过修改租户 tenant1 的 Locality 来删除副本。根据 Locality 的变更规则,每次只能删除一个 Zone 内的 Locality,Locality 的变更规则相关信息请参见官网 OceanBase 数据库文档 Locality 概述。

    ALTER TENANT tenant1 LOCALITY='F@z1,F@z2,F@z3,F@z4';

    ALTER TENANT tenant1 LOCALITY='F@z1,F@z2,F@z3';
  3. 执行以下命令,停止 z4、z5。

    ALTER SYSTEM STOP ZONE z4;

    ALTER SYSTEM STOP ZONE z5;
  4. 缩小资源池 pool1 的 ZONE_LIST 范围,从而将 z4、z5 从资源池中移出。

    ALTER RESOURCE POOL pool1 ZONE_LIST=('z1','z2','z3');
  5. 执行以下语句,从集群中删除 Zone 中的 OBServer 节点。

    注意

    本示例中,仅租户 tenant1 使用了 z4、z5 上的资源,在实际场景中,如果有其他租户也使用了 z4 或 z5,则还需要对这些租户也执 行一遍前面的步骤(步骤 2 ~ 步骤 5)。

    ALTER SYSTEM DELETE SERVER 'xxx.xxx.x.xx4:2882';

    ALTER SYSTEM DELETE SERVER 'xxx.xxx.x.xx5:2882';

    删除后,可以执行以下语句,确认列表中已查询不到这些 OBServer 节点,则表示删除成功。

    SELECT * FROM oceanbase.DBA_OB_SERVERS;
  6. 确认 OBServer 节点删除成功后,执行以下语句,从集群中删除 Zone。

    ALTER SYSTEM DELETE ZONE z4;

    ALTER SYSTEM DELETE ZONE z5;

    删除后,可以执行如下语句,确认列表中已查询不到这些 Zone,则表示删除成功。结束后,本次缩容完成。

缩容节点​

场景​

在进行集群的缩容操作前,需要确认集群中资源对当前负载有较多冗余,查看集群中资源的详细信息的相关操作请参见常用SQL。 该案例场景为当前集群中共包含 3 个可用区 z1、z2、z3,每个 Zone 内包含 2 个 OBServer 节点,将每个 Zone 缩容到 1 个 OBServer 节点。

操作步骤​

  1. 使用 root 用户登录集群的 sys 租户。

    注意

    如果要删除的节点没有任何 UNIT,那么可以跳过 2-6,直接删除。

    由于当前版本暂不支持调小租户的 UNIT_NUM,该缩容方式仅适用于当前集群中 Unit 数量小于或等于计划删除 OBserver 节点后的单个 Zone 中的可用 OBserver 节点数量。例如,本示例中,如果租户 tenant1 的 UNIT_NUM 为 2,则删除各 Zone 中的 OBServer 时会失败。

  2. 临时关闭 rebalance,否则租户会自动调度均衡

    alter system set enable_rebalance=False;
  3. 查看当前 Unit 分布,获取待迁移的 UNIT_ID。

    SELECT * FROM OCEANBASE.__all_unit;
  4. 手动迁移Unit

    ALTER SYSTEM MIGRATE UNIT = unit_id DESTINATION = 'xx.xx.xx.xx:2882';
  5. 确认 Unit 的迁移进度

    # 查看迁移状态
    SELECT * FROM oceanbase.DBA_OB_UNIT_JOBS WHERE JOB_TYPE = 'MIGRATE_UNIT';

    # 如果 MIGRATE_FROM_SVR_IP和MIGRATE_FROM_SVR_PORT为空,则迁移完成
    SELECT * FROM oceanbase.DBA_OB_UNITS WHERE SVR_IP = 'xx.xx.xx.xx';
  6. 多台节点迁移重复 3-5

  7. 删除各 Zone 中的 OBServer 节点。

    ALTER SYSTEM DELETE SERVER 'xxx.xxx.x.xx1:2882' ZONE='z1';
    ALTER SYSTEM DELETE SERVER 'xxx.xxx.x.xx2:2882' ZONE='z2';
    ALTER SYSTEM DELETE SERVER 'xxx.xxx.x.xx3:2882' ZONE='z3';

    如果列表中已经查询不到旧节点信息,则表示删除成功。如果列表中仍然有该节点,且该节点的状态为 DELETING,则表示该节点仍然在删除状态中。

    SELECT * FROM OCEANBASE.DBA_OB_SERVERS;
  8. 恢复 rebalance。

    alter system set enable_rebalance=True;

租户资源的扩缩容​

租户资源的扩缩容也是包括两种,一种是增加租户的资源单元(unit)配置大小;另一种是增加租户的资源单元(unit)数量。两种操作均需在 sys 租户下进行操作。

前提条件​

在进行租户的扩容和缩容操作前,需要进行以下操作:

  • 由于空闲的资源池会被计算为占用的资源,故在扩容前,如果有租户被删除,建议与租户对应的资源池也一并删除,以便释放资源。删除资源池的相关操作请参见官网 OceanBase 数据库文档 删除资源池。

  • 进行租户缩容前,建议进行一轮转储以便释放租户正在使用的内存。手动触发转储的相关操作请参见官网 OceanBase 数据库文档 手动触发转储。

  • 查看集群中资源的分配情况,了解集群中资源的使用情况。查看集群节点的资源总量和分配状态的相关操作请参见官网 OceanBase 数据库文档 查看集群的资源信息。

通过 SQL 语句修改租户的资源单元配置​

在通过调大和调小租户资源单元的配置(unit_config)进行扩容和缩容时,有以下两种场景:

  • 当前租户配置了独立的资源单元配置,可以直接修改租户的资源单元配置。

  • 多个租户使用了相同的资源单元配置,需要切换租户的资源单元配置。

确认租户是否使用了独立的资源单元配置的操作如下:

  1. 使用 root 用户登录集群的 sys 租户。

  2. 执行以下语句,获取待操作的租户所属的资源配置 ID。

    SELECT a.TENANT_NAME, b.UNIT_CONFIG_ID  FROM oceanbase.DBA_OB_TENANTS a,oceanbase.   DBA_OB_RESOURCE_POOLS b WHERE b.TENANT_ID=a.TENANT_ID;
    +-------------+----------------+
    | TENANT_NAME | UNIT_CONFIG_ID |
    +-------------+----------------+
    | sys | 1 |
    | MySQL | 1002 |
    | Oracle | 1004 |
    +-------------+----------------+
    3 rows in set

根据查询结果,如果当前租户对应的 UNIT_CONFIG_ID 与其他租户相同,则表示有多个租户使用了相同的资源单元配置;如果当前租户中对应的 UNIT_CONFIG_ID 与其他租户均不相同,则表示该租户使用了独立的资源单元配置。

以下将通过这两种场景提供租户扩容和缩容的操作指导。

注意事项​

在调大资源规格时,无论是通过修改资源配置还是切换资源配置,调整后的资源总量都必须满足以下要求:

Sum(min_cpu) <= CPU_CAPACITY;  // CPU 总的容量
Sum(max_cpu) <= CPU_CAPACITY * resource_hard_limit; // CPU 总的容量 * 配置项的值(默认100)
Sum(memory_size) <= MEM_CAPACITY; // 内存总的容量
Sum(log_disk_size) <= LOG_DISK_CAPACITY; // 日志盘总的容量

否则,系统会报错,提示扩容失败。

场景​

假设当前集群中共包含 3 个可用区 z1、z2、z3,每个 Zone 内包含 3 台 OBServer。集群中有一个普通租户 tenant1,其资源分配情况如下:

CREATE RESOURCE UNIT unit1 MAX_CPU 6, MIN_CPU 6, MEMORY_SIZE '36G', MAX_IOPS 1024, MIN_IOPS 1024, IOPS_WEIGHT=0, LOG_DISK_SIZE = '4G';

CREATE RESOURCE POOL pool1 UNIT 'unit1', UNIT_NUM 2, ZONE_LIST ('z1','z2','z3');

CREATE TENANT tenant1 resource_pool_list=('pool1');

租户配置了独立的资源单元配置的场景​

如果待操作的租户配置了独立的资源单元配置,您可以直接通过修改租户的 unit_config 来完成租户的扩容和缩容。 方法如下:

  1. 进入 oceanbase 数据库。

    USE oceanbase;
  2. 执行以下语句,获取待操作的租户所使用的资源配置 ID。

    SELECT a.TENANT_NAME, b.UNIT_CONFIG_ID  FROM oceanbase.DBA_OB_TENANTS a,oceanbase.   DBA_OB_RESOURCE_POOLS b WHERE b.TENANT_ID=a.TENANT_ID;
    +-------------+----------------+
    | TENANT_NAME | UNIT_CONFIG_ID |
    +-------------+----------------+
    | sys | 1 |
    | MySQL | 1001 |
    | Oracle | 1002 |
    +-------------+----------------+
    3 rows in set
  3. 执行以下语句,获取待操作租户的资源配置详细信息。

    SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS WHERE UNIT_CONFIG_ID='1001';
    +----------------+-------+---------+---------+-------------+---------------+----------+----------+-------------+
    | UNIT_CONFIG_ID | NAME | MAX_CPU | MIN_CPU | MEMORY_SIZE | LOG_DISK_SIZE | MAX_IOPS | MIN_IOPS | IOPS_WEIGHT |
    +----------------+-------+---------+---------+-------------+---------------+----------+----------+-------------+
    | 1001 | unit1 | 6 | 6 | 38654705664 | 4294967296 | 1024 | 1024 | 0 |
    +----------------+-------+---------+---------+-------------+---------------+----------+----------+-------------+
    1 row in set
  4. 根据获取的资源单元配置信息,修改 unit1 的配置。

    • 调大 unit1 的配置

      ALTER RESOURCE UNIT unit1 MAX_CPU 8, MIN_CPU 8, MEMORY_SIZE '40G', MAX_IOPS 1024, MIN_IOPS 1024, IOPS_WEIGHT 0, LOG_DISK_SIZE '6G';
    • 调小 unit1 的配置

      ALTER RESOURCE UNIT unit1 MAX_CPU 5, MIN_CPU 5, MEMORY_SIZE '5G', MAX_IOPS 1024, MIN_IOPS 1024, IOPS_WEIGHT 0, LOG_DISK_SIZE '2G';

多个租户使用了相同的资源单元配置的场景​

如果多个租户共用了同一个资源单元配置模版,则不能通过简单的调大资源单元配置来实现租户的扩容和缩容。因为一旦修改,将导致使用相同资源单元配置模版的所有租户同时进行了扩容或缩容。此场景下,需要先创建独立的资源单元配置后,再为租户切换资源单元配置。

例如,待扩容或缩容的租户为 tenant1,但由于 tenant1、tenant2 均使用了 unit1 作为资源单元配置,因此需要创建一个新的资源单元。

  1. 使用 root 用户登录集群的 sys 租户。

  2. 进入 oceanbase 数据库。

  3. 创建一个独立的资源单元配置。其中,unit2为新建的资源单元的名称,名称需要保证全局唯一。

    • 创建比当前资源单元配置高的 unit2

      CREATE RESOURCE UNIT unit2 MAX_CPU 8, MIN_CPU 8, MEMORY_SIZE '20G', MAX_IOPS 1024, MIN_IOPS 1024, IOPS_WEIGHT 0, LOG_DISK_SIZE '6G';
    • 创建比当前资源单元配置低的 unit3

      CREATE RESOURCE UNIT unit3 MAX_CPU 5, MIN_CPU 5, MEMORY_SIZE '5G', MAX_IOPS 1024, MIN_IOPS 1024, IOPS_WEIGHT 0, LOG_DISK_SIZE '2G';
  4. 修改租户的资源池,将资源池的资源单元配置替换为刚刚新创建的 Unit。其中,unit2 和 unit3 为刚刚新创建的 Unit。

    ALTER RESOURCE POOL pool1 unit='unit2';

    ALTER RESOURCE POOL pool1 unit='unit3';

后续处理​

操作结束后,您可以通过 oceanbase.DBA_OB_UNIT_CONFIGS 视图,确认当前租户的 unit_config 是否修改成功。

SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS;

更多 DBA_OB_UNIT_CONFIGS 视图的字段及说明信息请参见官网 OceanBase 数据库文档 DBA_OB_UNIT_CONFIGS。

通过修改 UNIT_NUM​

对租户内资源的扩容还可以通过调大资源池中的 UNIT_NUM 来实现。当前暂不支持通过调小资源池中的 UNIT_NUM 来进行缩容。

前提条件​

在进行租户的扩容操作前,需要进行以下操作:

  • 由于空闲的资源池会被计算为占用的资源,故在扩容前,如果有租户被删除,建议与租户对应的资源池也一并删除,以便释放资源。删除资源池的相关操作请参见 删除资源池。

  • 查看集群中资源的分配情况,了解集群中资源的使用情况。查看集群节点的资源总量和分配状态的相关操作请参见 查看集群的资源信息。调大资源池的 UNIT_NUM 时,修改后的 UNIT_NUM 数量要小于或等于 Zone 内可用的 OBServer 节点数量。

注意

调大资源池的 UNIT_NUM 时,修改后的 UNIT_NUM 数量要小于或等于 Zone 内可用的 OBServer 节点数量。

通过 SQL 语句修改租户的 UNIT_NUM​

您可以通过调大租户的 UNIT_NUM 来进行租户的扩容。

场景​

假设当前集群中共包含 3 个可用区 z1、z2、z3,每个 Zone 内包含 3 个 OBServer 节点。在集群中创建一个普通租户 MySQL,其资源分配情况如下:

CREATE RESOURCE UNIT unit1 MAX_CPU 6, MIN_CPU 6, MEMORY_SIZE '36G', MAX_IOPS 1024, MIN_IOPS 1024, IOPS_WEIGHT=0, LOG_DISK_SIZE '2G';

CREATE RESOURCE POOL pool1 UNIT 'unit1', UNIT_NUM 1, ZONE_LIST ('z1','z2','z3');

CREATE TENANT MySQL resource_pool_list=('pool1');

调大 UNIT_NUM​

随着业务量的不断变大,每个 Zone 上 1 个 Unit 已经无法承载当前的业务量,因此需要考虑调大 UNIT_NUM 来提高租户的服务能力,以满足新的业务需求。

  1. 使用 root 用户登录集群的 sys 租户。

  2. 进入 oceanbase 数据库。

    USE oceanbase;
  3. 执行以下语句,获取当前租户的资源配置信息。

    SELECT a.TENANT_NAME, b.RESOURCE_POOL_ID,b.NAME resource_pool_name,b.UNIT_CONFIG_ID,b. UNIT_COUNT FROM oceanbase.DBA_OB_TENANTS a,oceanbase.DBA_OB_RESOURCE_POOLS b WHERE b.TENANT_ID=a.TENANT_ID;
    +-------------+------------------+--------------------+----------------+------------+
    | TENANT_NAME | RESOURCE_POOL_ID | resource_pool_name | UNIT_CONFIG_ID | UNIT_COUNT |
    +-------------+------------------+--------------------+----------------+------------+
    | sys | 1 | sys_pool | 1 | 1 |
    | tenant1 | 1001 | pool1 | 1001 | 2 |
    | Oracle | 1002 | pool002 | 1002 | 1 |
    +-------------+------------------+--------------------+----------------+------------+
    3 rows in set

    SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS WHERE UNIT_CONFIG_ID='1001';
    +----------------+-------+---------+---------+-------------+---------------+----------+----------+-------------+
    | UNIT_CONFIG_ID | NAME | MAX_CPU | MIN_CPU | MEMORY_SIZE | LOG_DISK_SIZE | MAX_IOPS | MIN_IOPS | IOPS_WEIGHT |
    +----------------+-------+---------+---------+-------------+---------------+----------+----------+-------------+
    | 1001 | unit1 | 6 | 6 | 38654705664 | 2147483648 | 1024 | 1024 | 0 |
    +----------------+-------+---------+---------+-------------+---------------+----------+----------+-------------+
    1 row in set

    其中,UNIT_COUNT 表示当前租户所分配的 UNIT_NUM 。

  4. 执行以下语句,调大 UNIT_NUM 的数量。

    说明

    不支持通过指定 unit_id 的方式调大 UNIT_NUM 的数量。

    ALTER RESOURCE TENANT MySQL UNIT_NUM = 2;

    语句执行后,系统会直接在每个 Zone 内添加一个 Unit。

Loading...