示例1:租户副本数升级
集群原始状态
共三个zone:z1,z2,z3;三个zone都属于region: hz,每个zone内一个observer。
两个租户:系统租户syslocality=’F@z1,F@z2,F@z3’, resource_pool_list=(‘sys_pool’);普通租户tt locality=’F@z1,F@z2,F@z3’, resource_pool_list=(‘pool1’);。
集群目标状态
- 系统租户sys不做调整,普通租户tt由三副本调整为五副本,即locality由F@z1,F@z2,F@z3变为F@z1,F@z2,F@z3,F@z4,F@z5。
操作步骤
- 集群中目前只有z1、z2、z3三个 zone,先给集群增加z4、z5这两个zone,使用如下的SQL语句:
alter system add zone z4;
alter system start zone z4;
alter system add zone z5;
alter system start zone z5;
- 在z4和z5上各添加一个 OBServer,使用如下SQL语句:
alter system add server "ip:port" zone 'z4';
alter system add server "ip:port" zone 'z5';
- 给租户tt在z4和z5上添加副本,租户tt在z4和z5上需要有可用的unit和resourcepool资源,使用如下语句给租户tt在z4和z5上添加资源。
create resource pool pool2 unit = 'box', unit_num = 1,zone_list=('z4','z5');
alter tenant tt resource_pool_list=('pool1','pool2');
- 给租户tt在z4和z5上添加完资源后,开始通过修改locality增加副本,依据【变更规则】,每次为tt增加一个zone内的locality。
alter tenant tt locality="F@z1,F@z2,F@z3,F@z4";
执行完该语句后,rs的后台线程开始给租户tt在z4上添加副本,可以通过【变更进度】的方式查询locality的变更进度。
- z4上的副本添加完成后,继续修改locality,为租户tt在z5上继续添加副本,通过如下指令触发。
alter tenant tt locality="F@z1,F@z2,F@z3,F@z4,F@z5";
仍然可以通过【变更进度】的方式查询locality的变更进度。这次变更完成后,就完成了租户tt由三副本到五副本的变更。事实上,多个租户都有locality的变更是可以同时进行的,可以同时对多个租户执行上述操作。
示例2:租户搬迁
租户搬迁,涉及到集群机器的管理,租户unit资源的管理,以及租户数据副本的分布三个层面的操作,需要分别进行:
机器资源层面,增删 Zone、增删机器。
租户资源层面,增加 resource pool、从旧的 resourcepool 删除 Zone 和 unit。
- 租户数据层面,通过修改租户locality、完成数据副本的迁移。
操作步骤比较复杂,之所以这样,是因为 OB 多租户和资源管理的方式决定的:
集群新增 Zone 和 Server,不一定可以给一个租户用。
一个租户新增的 Zone 和 unit,不一定可以给所有表分区使用。
关于删除操作,有如下约束:
- 删除 Zone的前提是 Zone 里没有 Server。
- 删除 Server 的前提是,里面的 unit 全部迁移走(或者没有 unit)
- 删除一个 Zone 所有 unit(通过修改 resource pool 的 zone_list 或者修改 tenant的resource_pool_list)的前提是,租户所有分区的副本都没有在这个 Zone 上有分布(通过修改租户或表的locality)。
所以,要想安全移除一个 Zone,操作顺序是:
- 修改locality,删除某个Zone的副本
- 修改resource pool的zone_list或者tenant的resource_pool_list,删除某个 Zone 的 unit
- 删除这个 Zone 的所有 Server。
- 删除 Zone。
集群原始状态
- 共三个zone:z1,z2,z3;三个zone都属于region: hz,每个zone内一个observer。
- 一个租户:系统租户syslocality=’F@z1,F@z2,F@z3’, resource_pool_list=(‘sys_pool’);
集群目标状态
将系统租户sys的两个zone从hz迁到sh,即locality由F@z1,F@z2,F@z3变为F@z1,F@z4,F@z5,其中z4和z5属于region: sh。
操作步骤
- 集群中目前只有z1,z2,z3三个zone,先给集群增加一个zone:z4,使用如下的SQL语句。
alter system add zone z4;
alter system start zone z4;
- 在z4添加一个 OBServer,使用如下SQL语句。
alter system add server "ip:port" zone 'z4';
- 给租户sys在z4上添加副本,租户sys在z4上需要有可用的unit和resource pool资源,使用如下语句给租户sys在z4上添加资源。
create resource pool sys_pool2 unit ='sys_unit_config', unit_num = 1, zone_list=('z4');
alter tenant sys resource_pool_list=('sys_pool','sys_pool2');
- 给租户sys在z4上添加完资源后,开始通过修改locality增加副本,依据【变更规则】,每次为sys增加一个zone内的locality。
alter tenant sys locality="F@z1,F@z2,F@z3,F@z4";
执行完该语句后,rs的后台线程开始给租户sys在z4上添加副本,可以通过【变更进度】的方式查询locality的变更进度。
- z4上的副本添加完成后,继续修改locality,将租户sys在z2上的添加副本下掉,通过如下指令触发。
alter tenant syslocality="F@z1,F@z3,F@z4";
仍然可以通过【变更进度】的方式查询locality的变更进度。
- (可选)停止z2。
如果z2上所有租户都要执行上述操作去掉z2上的副本,可以在执行上面alter locality减副本动作之前,先停止zone。
alter system stop zone z2;
这样做,可以加快减副本的速度。
b. (可选)修改primary_zone。
如果z2为租户的primary_zone,需要根据情况设定新的primary_zone(根据应用切换情况来定)。
alter tenant sys primary_zone='z1';
- 集群中目前只有z1,z2,z3,z4四个zone,给集群再增加一个zone:z5,使用如下的SQL语句。
alter system add zone z5;
alter system start zone z5;
- 在z5添加一个 OBServer,使用如下SQL语句。
alter system add server "ip:port" zone'z5';
- 给租户sys在z5上添加副本,租户sys在z5上需要有可用的unit和resource pool资源,使用如下语句给租户sys在z5上添加资源。
create resource pool sys_pool3 unit ='sys_unit_config', unit_num = 1, zone_list=('z5');
alter tenant sysresource_pool_list=('sys_pool','sys_pool2','sys_pool3');
- 给租户sys在z5上添加完资源后,开始通过修改locality增加副本,依据【变更规则】,每次为sys增加一个zone内的locality。
alter tenant sys locality="F@z1,F@z3,F@z4,F@z5";
执行完该语句后,rs的后台线程开始给租户sys在z5上添加副本,可以通过【变更进度】的方式查询locality的变更进度。
- z5上的副本添加完成后,继续修改locality,将租户sys在z3上的添加副本下掉,通过如下指令触发。
alter tenant sys locality="F@z1,F@z4,F@z5";
仍然可以通过【变更进度】的方式查询locality的变更进度。
- (可选)停止z3。
如果z3上所有租户都要执行上述操作去掉z3上的副本,可以在执行上面alter locality减副本动作之前,先停止zone。
alter system stop zone z3;
这样做,可以加快减副本的速度。
b. (可选)修改primary_zone。
如果z3为租户的primary_zone,需要根据情况设定新的primary_zone(根据应用切换情况来定)。
alter tenant sys primary_zone='z4';
- 到这里,已经将z2,z3迁移到z4和z5上,此时已经可以将z2和z3下掉,执行如下语句。
alter resource pool sys_pool zone_list = ('z1'); // 系统租户resource pool中删除已经没有数据的z2, z3
alter system delete server 'ip:port'; //这里删除z2上的server
alter system delete server 'ip:port'; //这里删除z3上的server
alter system stop zone z2; //如果之前没有stop过
alter system delete zone z2;
alter system stop zone z3; //如果之前没有stop过
alter system delete zone z3;