OceanBase租户管理:创建与删除

数据库版本:V4.2.5

OceanBase数据库中的租户(Tenant)可以类比为传统Oracle数据库的实例(Instance)。

租户通过资源池与CPU、内存、磁盘空间、IO等物理资源关联。在租户下可以创建database、table、user等数据库对象。

租户的类型

OceanBase数据库从V4.0开始有三种类型的租户:系统租户、用户租户以及每个用户租户对应的Meta租户。

  • 系统租户是集群默认创建的租户,与集群生命期一致,负责管理集群和所有租户的生命周期。
    • Root Service基于系统租户承担OceanBase数据库的管理工作,包括集群管理、租户管理、资源管理、负载均衡、每日合并调度、迁移复制等。
    • 系统租户兼容MySQL模式,可以通过MySQL客户端登录也可以通过OBClient客户端登录。
  • 用户租户是给应用和业务使用的租户,对外提供完整的数据库功能,支持MySQL和Oracle两种兼容模式。
    • 用户租户下可以创建数据库用户。在用户租户下创建的用户,只能登录到本租户,对其他租户不可见。
    • 用户租户有自己独立的系统表、系统视图、系统变量。
    • 用户租户具备传统数据库实例所具备的其他特性。
  • Meta租户是OceanBase数据库内部自管理的租户,Meta租户存放的都是支撑用户租户运行的租户私有数据。
    • 每创建一个用户租户会创建一个对应的Meta租户,其生命周期与用户租户保持一致。
    • Meta租户用于存储和管理用户租户的租户私有数据,这部分数据不需要跨库物理同步以及物理备份恢复,例如配置项、位置信息、副本信息、日志流状态、备份恢复相关信息、合并信息等。
    • Meta租户不可登录,普通用户只能通过系统租户的视图查询Meta租户下的数据。
    • Meta租户没有独立的Unit,创建租户时默认为Meta租户预留资源,各项资源从用户租户资源中扣除。

用户租户的创建

OceanBase数据库仅支持创建用户租户。创建用户租户前需要先创建租户的资源规格和资源池。

租户的创建流程:创建资源规格 => 创建资源池 => 创建用户租户

创建资源规格

资源规格(Unit Config)规定了一个Unit需要使用的计算存储资源(包含内存、CPU和IO等)的规格,是一个资源配置信息。创建资源池时需要指定其资源规格,从而根据定义创建资源单元。

资源单元(Unit)是租户在节点上的容器,描述租户在节点上的CPU和内存等可用资源。OceanBase按照资源单元来管理物理资源。Unit也是资源调度的基本单位,其具有节点、Zone、Region等位置属性。

创建资源规格仅仅是规格定义,不实际分配资源。资源规格可以复用,建议根据业务场景抽象若干不同规格(例如小杯、中杯
大杯等),从而降低运维复杂度。在租户资源不足需要应急扩容时,不能直接调整原规格,需要新建资源规格,或者直接更换更大一级的资源规格。

  1. 登录到sys租户,检查OceanBase集群中已有的资源规格信息。

OceanBase连接方式:

obclient -hxx.xx.xx.xx -P2883 -uroot@sys#cluser_name -p###### -A
mysql -hxx.xx.xx.xx -P2883 -uroot@sys#cluser_name -p###### -A

检查资源规格信息:

use oceanbase;
select * from oceanbase.dba_ob_unit_configs;
  1. 按照资源规划创建资源规格。
CREATE RESOURCE UNIT unit_name 
    MEMORY_SIZE [=] 'size_value',
    MAX_CPU [=] cpu_num, 
    [MAX_IOPS [=] iops_num,]
    [MIN_CPU [=] cpu_num,]
    [MIN_IOPS [=] iops_num,]
    [IOPS_WEIGHT [=]iopsweight,]
    [LOG_DISK_SIZE [=] 'size_value'];

📖参数说明:

  • unit_name:资源规格名称。
  • MEMORY_SIZE:内存规格,其最小值由隐藏配置项__min_full_resource_pool_memory控制,默认为5G,支持最小可以调整为4G。必选参数。
  • MAX_CPU:CPU规格上限,MIN_CPU是CPU规格下限,单位是核数。如果用户没有指定MIN_CPU,默认等于MAX_CPU值。必选参数。
  • MIN_CPU:最小CPU规格,所有租户的MIN_CPU的总和不能超过该节点CPU总容量CPU_CAPACITY
  • LOG_DISK_SIZE:日志盘空间,OceanBase数据库V4.0会按租户管理日志盘空间,系统为各个租户预留日志盘空间,实现按租户隔离。当用户没有指定时,默认值是内存规格的3倍大小,最小为2G。
  • OceanBase数据库V4.0支持租户间IOPS隔离,通过MAX_IOPSMIN_IOPSIOPS_WEIGHT三个参数决定。IOPS规格参数默认不需要指定,系统根据CPU规格自动计算。

示例:创建一个名为unit_mysql_s1的资源规格。

CREATE RESOURCE UNIT unit_mysql_s1
       MEMORY_SIZE = '5G',
       MAX_CPU = 1, MIN_CPU = 1,
       LOG_DISK_SIZE = '6G';
  1. 检查系统视图,确认资源规格创建成功。
select * from oceanbase.dba_ob_unit_configs where name='unit_mysql_s1';

创建资源池

资源池(Resource Pool)是资源分配的基本单位,每个Unit都归属于一个资源池,每个资源池由若干个Unit组成。同一个资源池内的各个Unit具有相同的资源规格。

创建资源池时会实际创建Unit,按照资源规格定义分配资源,如对应节点预留资源不够将会创建失败。

可以每个Zone一个资源池,使用独立的资源规格。也可以所有Zone使用同一个资源池,从而所有Zone使用同一个资源规格。

⚠️:对于OceanBase数据库单机版,每个租户只有单个Unit(资源池的UNIT_NUM=1),如果出现容量瓶颈,除了更换更大规格的服务器,还可以将单机版转为分布式,从而利用多节点的资源。

  1. 登录到sys租户,检查OceanBase集群中已有的资源规格、资源池、Zone信息。
use oceanbase;
select * from oceanbase.dba_ob_resource_pools;
select * from oceanbase.dba_ob_unit_configs;
select * from oceanbase.dba_ob_zone;
  1. 利用已有的资源规格创建资源池。
CREATE RESOURCE POOL poolname 
    UNIT [=] unitname, 
    UNIT_NUM [=] unitnum, 
    ZONE_LIST [=] ('zone' [, 'zone' ...]);

📖参数说明:

  • UNIT:该资源池使用的资源规格名称。
  • UNIT_NUM:该资源池在目标Zone的Unit个数。它的值要小于目标Zone的Observer节点个数,且每个节点上最多只能分布同一个租户的一个Unit。对于OceanBase数据库单机版,它的值只能为1。
  • ZONE_LIST:资源池的Zone分布。OceanBase 数据库会在ZONE_LIST描述的每个Zone里面创建UNIT_NUM个Unit,每个Unit的资源规格为UNIT参数设置的值。对于OceanBase数据库单机版,只有1个Zone。

示例:创建一个名为pool_mysql_s1的资源规格。

CREATE RESOURCE POOL pool_mysql_s1 
       UNIT='unit_mysql_s1', 
       UNIT_NUM=1, 
       ZONE_LIST=('zone1','zone2'); 
  1. 检查系统视图,确认资源池创建成功。
select * from dba_ob_resource_pools where name = 'pool_mysql_s1';

创建用户租户

创建租户时通过指定RESOURCE_POOL_LIST将资源池分配给租户。OceanBase企业版支持MySQL兼容模式和Oracle兼容模式两种类型的租户,社区版仅支持MySQL租户。

租户创建后,租户类型无法修改。新建租户的Root用户密码为空,使用前务必先设置密码。

  1. 登录到sys租户,检查OceanBase集群中已有的资源池和租户信息。
use oceanbase;
select * from oceanbase.dba_ob_resource_pools;
select * from oceanbase.dba_ob_tenants;
  1. 利用已有的资源池创建租户。
CREATE TENANT [IF NOT EXISTS] tenant_name  
    PRIMARY_ZONE [=] zone,
    RESOURCE_POOL_LIST [=](poolname [, poolname...])
    [ENABLE_ARBITRATION_SERVICE = {true | false}]
    {CHARACTER SET | CHARSET} [=] charset_name
    COLLATE [=] collation_name
    {READ ONLY | READ WRITE}
    COMMENT [=] 'string'
    {SET | SET VARIABLES | VARIABLES} system_var_name = expr [,system_var_name = expr] ...

📖参数说明:

  • tenant_name:租户名。
  • PRIMARY_ZONE:指定了租户提供读写服务的Zone的优先级。实际上是一个Zone的列表。
    • 当列表包含多个Zone时,使用分号;)分隔的Zone具有从高到低的优先级
    • 使用逗号,)分隔的Zone具有相同优先级,表示流量打散在多个Zone上,这几个Zone同时提供服务;
    • 默认值为RANDOM,表示指定租户的Primary Zone为租户所在的所有Zone,租户所在的所有Zone具有相同的优先级。
  • RESOURCE_POOL_LIST:指定分配给租户的资源池列表,必填。如果有多个资源池,要求多个资源池的UNIT_NUM个数一致
    • 租户的副本分布的Zone List继承于RESOURCE_POOL_LISTZONE_LIST属性;
    • 租户的副本个数继承于RESOURCE_POOL_LISTZONE_LIST属性的个数;
    • 租户在每个Zone的Unit个数继承于RESOURCE_POOL_LISTUNIT_NUM属性;
    • 租户的Unit的资源规格继承于RESOURCE_POOL_LISTUnit属性。
  • ENABLE_ARBITRATION_SERVICE:指定租户是否开启仲裁服务,如果不显式指定,默认创建的租户其仲裁服务为关闭状态。如果创建租户的时候未开启仲裁服务,可以在创建租户后再开启仲裁服务。
  • CHARSET:指定租户级的字符集。默认的字符集是utf8mb4。OceanBase将UTF8视为UTF8MB4的同义词。
  • COLLATE:指定租户级的字符排序规则。默认的字符序是utf8mb4_general_ci
  • READ ONLY | READ WRITE:指定租户的属性为只读还是读写。如果不指定,默认为读写属性。
  • system_var_name:指定系统变量或配置项。
    • ob_tcp_invited_nodes:用于指定租户连接的白名单,即允许哪些客户端IP连接该租户。%表示所有客户端都可登录,如果不显式指定,则默认租户的连接方式为只允许本机的IP登录该租户。
    • ob_compatibility_mode:用于指定租户的兼容模式,只能在创建时指定。取值可选mysqloracle。如果不显式指定,则默认兼容模式为MySQL模式
    • ob_compatibility_control:用于控制存在MySQL兼容行为冲突的功能表现为何种行为,是与MySQL 5.7保持一致还是与MySQL 8.0保持一致。取值可选MYSQL5.7MYSQL8.0。创建MySQL模式的租户时,需要指定该变量,并且只能在创建时指定,租户创建后不允许修改。如果不显式指定,则默认其兼容行为与MySQL 5.7保持一致。
    • lower_case_table_names:用于控制大小写敏感,仅支持使用CREATE TENANT语句创建租户时指定并只在MySQL模式下生效,租户创建后不能通过SQL语句修改。

示例:创建租户。

--mysql租户创建(优先级:zone1 > zone2 = zone3)
CREATE TENANT IF NOT EXISTS mysql_app_t1 
       PRIMARY_ZONE='zone1;zone2,zone3', 
       RESOURCE_POOL_LIST=('pool_mysql_s1'), 
       CHARSET='utf8mb4' 
       SET ob_tcp_invited_nodes TO '%';

--oracle租户创建(单机版)      
CREATE TENANT IF NOT EXISTS oracle_app_t1 
       PRIMARY_ZONE='zone1', 
       RESOURCE_POOL_LIST=('pool_oracle_s1')
       SET OB_TCP_INVITED_NODES='%',
       ob_compatibility_mode='oracle';		
  1. 检查系统视图,确认租户创建成功。
select * from oceanbase.dba_ob_tenants where tenant_name='oracle_app_t1';
  1. 登录租户验证,并修改管理员用户密码。
--mysql租户
-- obclient -hxx.xx.xx.xx -P2883 -uroot@mysql_app_t1#cluser_name -A
SQL> ALTER USER root IDENTIFIED BY '****';

-- obclient -hxx.xx.xx.xx -P2883 -uroot@mysql_app_t1#cluser_name -p###### -A

--oracle租户
-- obclient -hxx.xx.xx.xx -P2883 -usys@oracle_app_t1#cluser_name -A
SQL> ALTER USER sys IDENTIFIED BY ****;

-- obclient -hxx.xx.xx.xx -P2883 -usys@oracle_app_t1#cluser_name -p###### -A

用户租户的删除

删除租户

可以通过DROP TENANT语句删除用户租户。删除租户后,租户下的数据库和表也同时被删除。但是租户使用的资源池不会被删除。资源池可以继续给其他租户使用。

  • 当系统租户开启回收站功能时,被删除的租户会进入回收站。对于回收站中的租户,后续系统租户可以通过租户级回收站功能进一步删除或恢复该租户。
  • 当系统租户关闭回收站功能时,DROP TENANT操作会直接删除租户,租户下的数据库和表也同时被删除。
  1. 登录到SYS租户的管理员账户,检查要删除的租户信息。
use oceanbase;
select * from dba_ob_tenants where tenant_name = 'mysql_app_t1';
  1. 在系统租户下检查回收站是否开启(可选)。
show recyclebin;
  1. 删除租户,并确认是否删除成功。
drop tenant mysql_app_t1;

select * from dba_ob_tenants where tenant_name = 'mysql_app_t1';

删除资源池

删除资源池前,务必确认该资源池当前未被任何租户使用。如果资源池正在被租户使用,则需要将资源池释放后再删除资源池。

  • 当租户有多个资源池,可以通过ALTER TENANT语句修改租户的资源池配置,从租户中释放要删除的资源池。
  • 当租户只有一个资源池时,不支持直接移除。
    • 如果租户要继续使用,可以新建资源池分配给该租户,再通过修改资源池配置释放需要删除的资源池。
    • 如果租户已不再使用,也可以先删除租户后,再删除资源池。
  1. 登录到SYS租户的管理员账户,检查要删除的资源池信息。
use oceanbase;
select tenant_id,name from dba_ob_resource_pools where name = 'pool_mysql_s1';
  1. 删除资源池,并确认是否删除成功。
drop resource pool pool_mysql_s1;

select * from dba_ob_resource_pools where name = 'pool_mysql_s1';

删除资源规格

删除资源规格前必须确保当前资源规格未被使用。如果资源规格正在被使用,则需要先通过ALTER RESOURCE POOL语句修改资源池配置,将资源规格从资源池中移出后再删除资源规格。

  1. 登录到SYS租户的管理员账户,检查要删除的资源规格信息。
use oceanbase;
select a.unit_config_id, a.name as unit_name, b.name as pool_name 
from oceanbase.dba_ob_unit_configs a,oceanbase.dba_ob_resource_pools b 
where b.unit_config_id=a.unit_config_id;
  1. 删除资源规格,并确认是否删除成功。
drop resource unit unit_mysql_s1;

select * from dba_ob_unit_configs where name = 'unit_mysql_s1';

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GottdesKrieges

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值