数据库版本: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等位置属性。
创建资源规格仅仅是规格定义,不实际分配资源。资源规格可以复用,建议根据业务场景抽象若干不同规格(例如小杯、中杯
大杯等),从而降低运维复杂度。在租户资源不足需要应急扩容时,不能直接调整原规格,需要新建资源规格,或者直接更换更大一级的资源规格。
- 登录到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;
- 按照资源规划创建资源规格。
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_IOPS
、MIN_IOPS
、IOPS_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';
- 检查系统视图,确认资源规格创建成功。
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
),如果出现容量瓶颈,除了更换更大规格的服务器,还可以将单机版转为分布式,从而利用多节点的资源。
- 登录到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;
- 利用已有的资源规格创建资源池。
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');
- 检查系统视图,确认资源池创建成功。
select * from dba_ob_resource_pools where name = 'pool_mysql_s1';
创建用户租户
创建租户时通过指定RESOURCE_POOL_LIST
将资源池分配给租户。OceanBase企业版支持MySQL兼容模式和Oracle兼容模式两种类型的租户,社区版仅支持MySQL租户。
租户创建后,租户类型无法修改。新建租户的Root用户密码为空,使用前务必先设置密码。
- 登录到sys租户,检查OceanBase集群中已有的资源池和租户信息。
use oceanbase;
select * from oceanbase.dba_ob_resource_pools;
select * from oceanbase.dba_ob_tenants;
- 利用已有的资源池创建租户。
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具有相同的优先级。
- 当列表包含多个Zone时,使用分号(
RESOURCE_POOL_LIST
:指定分配给租户的资源池列表,必填。如果有多个资源池,要求多个资源池的UNIT_NUM
个数一致。- 租户的副本分布的Zone List继承于
RESOURCE_POOL_LIST
的ZONE_LIST
属性; - 租户的副本个数继承于
RESOURCE_POOL_LIST
的ZONE_LIST
属性的个数; - 租户在每个Zone的Unit个数继承于
RESOURCE_POOL_LIST
的UNIT_NUM
属性; - 租户的Unit的资源规格继承于
RESOURCE_POOL_LIST
的Unit
属性。
- 租户的副本分布的Zone List继承于
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
:用于指定租户的兼容模式,只能在创建时指定。取值可选mysql
或oracle
。如果不显式指定,则默认兼容模式为MySQL模式。ob_compatibility_control
:用于控制存在MySQL兼容行为冲突的功能表现为何种行为,是与MySQL 5.7保持一致还是与MySQL 8.0保持一致。取值可选MYSQL5.7
和MYSQL8.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';
- 检查系统视图,确认租户创建成功。
select * from oceanbase.dba_ob_tenants where tenant_name='oracle_app_t1';
- 登录租户验证,并修改管理员用户密码。
--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操作会直接删除租户,租户下的数据库和表也同时被删除。
- 登录到SYS租户的管理员账户,检查要删除的租户信息。
use oceanbase;
select * from dba_ob_tenants where tenant_name = 'mysql_app_t1';
- 在系统租户下检查回收站是否开启(可选)。
show recyclebin;
- 删除租户,并确认是否删除成功。
drop tenant mysql_app_t1;
select * from dba_ob_tenants where tenant_name = 'mysql_app_t1';
删除资源池
删除资源池前,务必确认该资源池当前未被任何租户使用。如果资源池正在被租户使用,则需要将资源池释放后再删除资源池。
- 当租户有多个资源池,可以通过ALTER TENANT语句修改租户的资源池配置,从租户中释放要删除的资源池。
- 当租户只有一个资源池时,不支持直接移除。
- 如果租户要继续使用,可以新建资源池分配给该租户,再通过修改资源池配置释放需要删除的资源池。
- 如果租户已不再使用,也可以先删除租户后,再删除资源池。
- 登录到SYS租户的管理员账户,检查要删除的资源池信息。
use oceanbase;
select tenant_id,name from dba_ob_resource_pools where name = 'pool_mysql_s1';
- 删除资源池,并确认是否删除成功。
drop resource pool pool_mysql_s1;
select * from dba_ob_resource_pools where name = 'pool_mysql_s1';
删除资源规格
删除资源规格前必须确保当前资源规格未被使用。如果资源规格正在被使用,则需要先通过ALTER RESOURCE POOL语句修改资源池配置,将资源规格从资源池中移出后再删除资源规格。
- 登录到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;
- 删除资源规格,并确认是否删除成功。
drop resource unit unit_mysql_s1;
select * from dba_ob_unit_configs where name = 'unit_mysql_s1';
以上。