Unit缩容含义

    从1.4.6版本开始,OceanBase支持unit缩容操作,unit缩容的含义指:调小resource pool的unit num值,减少resource pool内unit的数量,进而减少resource pool的总体容量。

    Unit缩容触发

    使用如下语句发起resource pool的unit缩容操作。

    1. ALTER RESOURCE POOL pool_name UNIT_NUM=unit_num DELETE UNIT=(unit_id1,unit_id2...);

    其中,pool_name为本次缩容resource pool的名称,unit_num为缩容后resource pool每个zone内unitnum的数量,DELETE UNIT=(unit_id1,unit_id2..)为可配置选项,使用DELETE UNIT可以明确指定本次缩容即将删除的unit,不指定DELETE UNIT时,系统将自动选择unit进行删除。使用DELETE UNIT明确指定删除的unit id时需要还需要满足以下条件,不符合这些条件的DELETE UNIT操作都认为是非法的:

    • 删除的unit id列表中,每个zone内删除的unit的数量必须相等,目前认为删除列表中各zone的unit数量不相同的缩容操作非法。

    • 删除的unit id列表中,每个zone内删除的unit的数量和unit_num的数量需要匹配,即删除列表中每个zone内删除了m个unit,则unit_num的减小值也必须为m,两者需保持匹配。

    Unit缩容进度

    触发unit缩容后,RS会将本次unit缩容操作记录到__all_rootservice_job中,可以查询该表来观察本次unit缩容的进度。unit缩容触发后,即将被删除的unit会被标记为DELETING状态,可以查询__all_unit表的status列来获取unit状态。unit缩容的过程中,RS会调度后台任务将partition从DELETING状态的unit上迁走,全部迁移完成后,RS会更新__all_rootservice_job表标记本次缩容任务完成,同时清理__all_unit表,将DELETING状态的unit删除。

    Unit缩容举例

    • 示例1:缩容时不指定unit_id
    1. 执行以下语句,创建test_pool,包含3个zone:z1,z2,z3,每个zone三个unit。
    1. CREATE RESOURCE POOL test_pool UNIT='unit_config', UNIT_NUM=3, ZONE_LIST=('z1','z2','z3');

    b. 执行以下语句,将每个zone内的unitnum调整为1。

    1. ALTER RESOURCE POOL test_pool UNIT_NUM=1;

    本例中没有明确指出删除的unit_id,系统会在每个zone内选取两个unit删除,unit缩容的进度和unit的状态可通过查询__all_rootservice_job和__all_unit获取。

    • 示例2:缩容时指定unit_id
    1. 执行以下语句,创建test_pool,包含3个zone:z1,z2,z3,每个zone三个unit,z1上的unit_id为1001、1002、1003,z2上的unit_id为1004、1005、1006,z3上的unit_id为1007、1008、1009。
    1. CREATE RESOURCE POOL test_pool UNIT='unit_config', UNIT_NUM=3, ZONE_LIST=('z1','z2','z3');

    b. 执行以下语句,将每个zone内的unitnum调整为2。

    1. ALTER RESOURCE POOL test_pool UNIT_NUM=2 DELETE UNIT=(1001,1004,1007);

    本例中明确指定了缩容时要删除unit列表为(1001,1004,1007),unit的缩容进度和unit状态可以通过查询__all_rootservice_job和__all_unit获取。

    除了上述两种合法的操作外,下面再举出两个反例,这两个反例是非法的unit缩容操作。

    • 反例1:各zone内删除的unit数量不相等
    1. 执行以下语句,创建test_pool,包含3个zone:z1,z2,z3,每个zone三个unit,z1上的unit_id为1001、1002、1003;z2上的unit_id为1004、1005、1006;z3上的unit_id为1007、1008、1009。
    1. CREATE RESOURCE POOL test_pool UNIT='unit_config', UNIT_NUM=3, ZONE_LIST=('z1','z2','z3');

    b. 执行以下语句,z1,z2上各删除一个unit,z3上没有删除unit。

    1. ALTER RESOURCE POOL test_pool UNIT_NUM=2 DELET UNIT=(1001,1004);

    各zone内删除的unit数量不相同,是一个非法的unit缩容操作,系统会返回如下报错信息:

    1. shrink unequal unit num on different zone not support
    • 反例2:各zone内删除的unit数量与unitnum不匹配
    1. 执行以下语句,创建test_pool,包含3个zone:z1,z2,z3,每个zone三个unit,z1上的unit_id为1001,1002,1003;z2上的unit_id为1004、1005、1006;z3上的unit_id为1007、1008、1009。
    1. CREATE RESOURCE POOL test_pool UNIT='unit_config', UNIT_NUM=3, ZONE_LIST=('z1','z2','z3');

    b. 执行以下命令,z1,z2,z3每个zone删除一个unit,unit_num的变化值为3-1=2。

    1. ALTER RESOURCE POOL test_pool UNIT_NUM=1 DELET UNIT=(1001,1004,1007);

    各zone内删除unit的数量与unit num变化值不匹配,是一个非法的unit缩容操作,系统会返回如下报错信息:

    1. shrink unit num and unit id list not match