OceanBase(2)OceanBase租户创建和管理
一、OceanBase租户概念
OceanBase集群搭建完成后通过创建租户的方式来为不同的业务提供服务,之所以使用租户的概念是因为当集群创建以后不会直接把整个资源池给予一个实例使用,通常建议一个应用占用一个租户,租户之间资源相互隔离(具体表现为内存物理隔离、CPU逻辑隔离、数据隔离,对于磁盘空间、IOPS 和会话数未实现隔离,创建资源时需要根据实际情况进行设置,尤其是空间资源不要超出机器磁盘实际可用空间过多,否则将影响后期负载均衡),租户和租户之间的数据是不可跨租户访问的,所以租户也可以简单的理解为数据库实例
租户的特性如下:
· 集群资源使用的第一步
· 租户的物理资源可以在线动态调整,弹性伸缩
· 可以创建自己的用户和密码
· 可以创建自己的数据库、表
· 拥有独立的系统数据库和独立的数据库变量
二、OceanBase资源占用
OceanBase在进程启动后默认会将系统大部分资源都申请占用(CPU、内存和磁盘)。占用的比例可以通过集群启动的参数进行设置,其中内存和磁盘空间会提前预分配,集群启动相关参数如下
· cpu_count:默认为操作系统 CPU数量 - 2,可自定义
· memory_limit:进程使用的最大内存,默认为8G,0为不限制,该参数与memory_limit_percentage二选一
· memory_limit_percentage:进程使用的最大内存百分比,默认为80,该参数和memory_limit 二选一
· datafile_size:数据文件(block_file)的初始化大小 ,默认为0表示不受限制
· datafile_disk_percentage:数据文件(block_file)初始化大小占数据目录(sstable)所在文件系统可用空间的百分比,默认为75
· clog_disk_usage_limit_percentage:clog文件所在文件系统空间使用率上限百分比,默认95,达到该值集群就会停止写入
三、OceanBase集群资源相关概念
· zone:一个集群由多个zone组成,拥有同样tag的节点属于一个zone。不同的zone可以对应不同的城市、不同的机房、不同的机架。每个zone都有一份完整的副本,单个zone故障不影响集群运行
· 租户:租户就是实例,创建租户时需关联对应的资源池
· 租户资源池:一个租户可以拥有多个资源池,这些资源池的集合就是这个租户所能使用的所有资源。资源池中的资源都是从节点资源中分配而来,资源池一旦创建,集群的可用资源就会被占用。资源池在每个节点里的部分被称为资源单元,每个资源单元的大小通过创建时指定的资源单元规格大小确定。可以为每个zone分配独立资源池,也可以共用同一个资源单元规格
· 资源单元规格:资源单元规格可以理解为一个实例的配置模板,通过 __all_unit_config视图可以查看单元规格
四、OceanBase集群资源管理
1、查看集群可用资源
在创建租户时可以先查看资源确保资源充足
mysql -h 172.20.1.212 -u root -P 2881 -p -c -A
use oceanbase
select a.zone,concat(a.svr_ip,':',a.svr_port) observer, cpu_total, cpu_assigned, (cpu_total-cpu_assigned) cpu_free, mem_total/1024/1024/1024 mem_total_gb, mem_assigned/1024/1024/1024 mem_assign_gb, (mem_total-mem_assigned)/1024/1024/1024 mem_free_gb from __all_virtual_server_stat a join __all_server b on (a.svr_ip=b.svr_ip and a.svr_port=b.svr_port)order by a.zone, a.svr_ip;
通过系统表__all_unit_config查看已有的资源单元规格,这些规格是可以复用的,这些规则可以理解为实例的模板,后续创建实例时就可以使用这些规格
mysql -h 172.20.1.212 -u root -P 2881 -p -c -A
use oceanbase
select * from __all_unit_config;
修改单元规格配置
alter resource unit sys_unit_config min_cpu=5,max_cpu=5,min_memory='1610612736B',max_memory='1610612736B';
查看资源分配详情,输出结果中可以看到存在一个叫做sys_pool的资源池,每个资源单元使用了名为sys_unit_config的规格
select t1.name resource_pool_name, t2.`name` unit_config_name, t2.max_cpu, t2.min_cpu, t2.max_memory/1024/1024/1024 max_mem_gb, t2.min_memory/1024/1024/1024 min_mem_gb, t3.unit_id, t3.zone, concat(t3.svr_ip,':',t3.`svr_port`) observer,t4.tenant_id, t4.tenant_name
from __all_resource_pool t1 join __all_unit_config t2 on (t1.unit_config_id=t2.unit_config_id)
join __all_unit t3 on (t1.`resource_pool_id` = t3.`resource_pool_id`)
left join __all_tenant t4 on (t1.tenant_id=t4.tenant_id)
order by t1.`resource_pool_id`, t2.`unit_config_id`, t3.unit_id;
2、创建资源单元规格(仅仅是定义规格,不会进行实际的资源分配)
CREATE RESOURCE UNIT unit_name
MAX_CPU [=] cpu_num, #分配的最大CPU数
MAX_MEMORY [=] mem_size, #分配的最大内存容量,单位为字节 B,最小值为1G
MAX_IOPS [=] iops_num, #分配的最大IOPS
MAX_DISK_SIZE [=] disk_size, #分配的最大磁盘容量,单位为字节,最小值为 512M
MAX_SESSION_NUM [=] session_num, #分配的最大Session数
[MIN_CPU [=] cpu_num,] #分配的最小CPU数
[MIN_MEMORY [=] mem_size,] #分配的最小内存容量,单位为字节 B,最小值为1G
[MIN_IOPS [=] iops_num] ; #分配的最小IOPS
#创建了2个单元规格
CREATE resource unit S1 max_cpu=4,max_memory='8G',max_iops=10000,max_session_num=1000000,max_disk_size='1024G';
CREATE resource unit S2 max_cpu=8,max_memory='16G',max_iops=20000,max_session_num=1000000,max_disk_size='1024G';
select * from __all_unit_config;
3、创建资源池,创建完毕后查看集群资源情况可以看到zone的可用资源被减少了
CREATE RESOURCE POOL poolname #资源池名称
UNIT [=] unitname, #资源规格名称,和上一步的需要关联
UNIT_NUM [=] unitnum, #每个资源池需要几个server来建立zone,这里会在Zone内自动负载均衡,比如1代表在zone_list中每个zone中创建一个unit,2则是自动选取2个zone进行创建
ZONE_LIST [=] ('zone' [, 'zone' ...]); #要创建的资源池所属的Zone。如果不指定,就默认在所有Zone创建这个资源单元
#创建2个资源池分别使用不同的资源单元规格,其中一个资源池跨两个Zone。生产环境中为了管理方便可以一个资源池跨三个Zone,并使用同一种单元规格
create resource pool pool_1 unit='S1',unit_num=1,zone_list=('zone1','zone2');
create resource pool pool_2 unit='S2',unit_num=1,zone_list=('zone3');
#查看资源池情况
select t1.name resource_pool_name, t2.`name` unit_config_name, t2.max_cpu, t2.min_cpu, t2.max_memory/1024/1024/1024 max_mem_gb, t2.min_memory/1024/1024/1024 min_mem_gb, t3.unit_id, t3.zone, concat(t3.svr_ip,':',t3.`svr_port`) observer,t4.tenant_id, t4.tenant_name
from __all_resource_pool t1 join __all_unit_config t2 on (t1.unit_config_id=t2.unit_config_id)
join __all_unit t3 on (t1.`resource_pool_id` = t3.`resource_pool_id`)
left join __all_tenant t4 on (t1.tenant_id=t4.tenant_id)
order by t1.`resource_pool_id`, t2.`unit_config_id`, t3.unit_id;
#查看集群资源情况
select a.zone,concat(a.svr_ip,':',a.svr_port) observer, cpu_total, cpu_assigned, (cpu_total-cpu_assigned) cpu_free, mem_total/1024/1024/1024 mem_total_gb, mem_assigned/1024/1024/1024 mem_assign_gb, (mem_total-mem_assigned)/1024/1024/1024 mem_free_gb from __all_virtual_server_stat a join __all_server b on (a.svr_ip=b.svr_ip and a.svr_port=b.svr_port)order by a.zone, a.svr_ip;
4、创建OceanBase租户
该步操作就是将资源池和租户进行绑定的一个过程
create tenant obmysql resource_pool_list=('pool_1'), primary_zone='RANDOM',comment 'mysql tenant/instance', charset='utf8' set ob_tcp_invited_nodes='%';
# resource_pool_list:资源池列表,创建租户时必填项
# 创建租户时可以使用set命令指定租户的变量值
select * from gv$tenant;
5、连接OceanBase租户
每个租户创建后都会有一个root账号。OceanBase 开源版的租户只兼容 MySQL,因此可以直接使用 MySQL 命令行客户端或者图形化工具进行连接
mysql -h172.20.1.212 -uroot@obmysql#obdemo -P2883 -p -c -A #通过OBProxy连接的方式需要带集群名 mysql -h172.20.1.212 -uroot@obmysql -P2881 -p -c -A #直连OBServer不需要带集群名,初始密码为空 #-u:提供租户的连接账户,格式有两种:用户名@租户名#集群名 或者 集群名:租户名:用户名 #-P:OceanBase连接端口,默认是2881,如果使用OBProxy默认是2883 #-p:提供账户密码,为了安全可以不提供,改为在后面提示符下输入,密码文本不可见 #-c:表示在 MySQL 运行环境中不要忽略注释。 #-A:表示在 MySQL 连接数据库时不自动获取统计信息 #oceanbase:连接集群后访问的数据库名,可以改为实际的业务数据库,相当于就是use database_name;
4、删除OceanBase规格、资源池、租户
drop tenant 租户名称 force; drop resource pool 资源池1; drop resource pool 资源池2; drop resource pool 资源池3; drop resource unit 规则名称1; drop resource unit 规格名称2;
评论