概述
OceanBase 数据库是多租户的分布式数据库,租户使用的资源建立在资源池上。资源池包含了资源单元,而资源单元则规定了具体资源的量化(如 CPU、Memory、Disk_Size 和 IOPS 等)。 创建租户前,必须规定租户使用的资源范围,资源池和资源单元就是为了满足租户资源隔离和负载均衡而存在的。
资源管理中的概念:
- 资源单元(Resource Unit,Unit)
资源单元是一个容器。实际上,副本是存储在资源单元之中的,所以资源单元是副本的容器。资源单元包含了计算存储资源(Memory、CPU 和 IO 等)同时资源单元也是集群负载均衡的一个基本单位,在集群节点上下线,扩容缩容时会动态调整资源单元在节点上的分布进而达到资源的使用均衡。
- 资源池 (Resource Pool)
一个租户拥有若干个资源池,这些资源池的集合描述了这个租户所能使用的所有资源。一个资源池由具有相同资源规格(Unit Config)的若干个资源单元组成。一个资源池只能属于一个租户。每个资源单元描述了位于一个 Server 上的一组计算和存储资源,可以视为一个轻量级虚拟机,包括若干 CPU 资源、内存资源、磁盘资源等。一个租户在同一个 Server 上最多有一个资源单元。
- 资源配置(Resource Config)
资源配置是资源单元的具体配置,包含资源单元所属的资源池信息、使用资源的租户信息、资源单元的配置信息(如 CPU 核数和内存资源)等。修改资源配置可以动态调整资源单元的计算资源,进而调整对应租户的资源。
管理资源单元(Resource Unit)
创建资源单元
语法
CREATE RESOURCE UNIT unitname MAX_CPU [=] cpunum, MAX_MEMORY [=] memsize, MAX_IOPS [=] iopsnum, MAX_DISK_SIZE [=] disksize, MAX_SESSION_NUM [=] sessionnum, [MIN_CPU [=] cpunum,] [MIN_MEMORY [=] memsize,] [MIN_IOPS [=] iopsnum] ;
参数说明
- 必须指定 CPU、Memory、IOPS、Disk Size 和 Session Num 的大小
- 参数值设置:可以使用纯数字不带引号的方式,也可以使用带单位加引号的方式
max_memory='10G'
等效于max_memory=10737418240
MAX_MEMORY
的取值范围为 [1073741824,+∞),单位为字节,即最小值为 1 G。MAX_IOPS
的取值范围为 [128,+∞)。MAX_DISK_SIZE
的取值范围为 [536870912,+∞],单位为字节,即最小值为 512 M。MAX_SESSION_NUM
的取值范围为 [64,+∞)。
示例
CREATE RESOURCE UNIT unit1 MAX_CPU 1, MAX_MEMORY '1G', MAX_IOPS 128,MAX_DISK_SIZE '10G', MAX_SESSION_NUM 64, MIN_CPU=1, MIN_MEMORY='1G', MIN_IOPS=128; -- 等效 CREATE RESOURCE UNIT unit1 MAX_CPU 1, MAX_MEMORY 1073741824, MAX_IOPS 128, MAX_DISK_SIZE 10737418240, MAX_SESSION_NUM 64, MIN_CPU=1, MIN_MEMORY=1073741824, MIN_IOPS=128;
资源单元 unit1
创建后,可以创建资源池 pool1
和 pool2
并且 pool1
和 pool2
均使用 unit1
资源单元的配置。
查看资源单元
通过内部表查看
SELECT * FROM __all_unit_config;
修改资源单元
动态调整租户的资源单元大小
ALTER RESOURCE UNIT unit1 MAX_CPU 5, MAX_MEMORY 1288490188, MAX_IOPS 128,max_disk_size 8589934592, MAX_SESSION_NUM 64, MIN_CPU=2, MIN_MEMORY 1073741824, MIN_IOPS=128;
删除资源单元
删除资源单元前必须确保当前资源单元未被使用。如果资源单元正在被使用,则需要先将资源单元从资源池中移除后再删除资源单元。
DROP RESOURCE UNIT unitname;
当资源单元被使用时,不可删除
删除资源单元
资源池管理(Resource Pool)
创建资源池
在创建新租户时,如果当前的资源池均被使用(被其他租户使用),需要创建新的资源池。
语法
CREATE RESOURCE POOL poolname UNIT [=] unitname, UNIT_NUM [=] unitnum, ZONE_LIST [=] ('zone' [, 'zone' ...]);
- 参数
unit_num
表示在集群的一个 Zone 里面包含的资源单元个数。该值小于等于一个 Zone 中的 OBServer 的个数。 - 参数
zone_list
表示资源池的 Zone 列表,显示该资源池的资源在哪些 Zone 中被使用。
示例
CREATE RESOURCE POOL pool1 unit='unit1', unit_num=1, zone_list=('zone1','zone2','zone3');
查看资源配置
SELECT * FROM oceanbase.gv$unit;
修改资源池
语法
ALTER RESOURCE POOL poolname UNIT [=] unitname, UNIT_NUM [=] unitnum, ZONE_LIST [=] ('zone'[, 'zone' ...]);
说明
- 修改资源池的命令每次仅支持修改一个参数值。
- 被修改的资源池必须是没有被使用的或者不包含任何资源单元的空的资源池。
- 新创建的资源池不能更改
zone_list
。
示例
修改资源池 pool1
的资源单元,修改后 unit2
替代 unit1
属于资源池pool1
ALTER RESOURCE POOL pool1 unit='unit2'
删除资源池
DROP RESOURCE POOL poolname;
综合案例
1. 创建业务租户及相关对象数据
查看集群可用资源
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 ;
已分配资源池情况
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 ;
结果显示内部租户的资源池(resource pool
),由每个 zone
里的一个节点上的资源单元(resource unit
)组成,每个资源单元使用同一规格(sys_unit_config
)。 从上面可以看出,资源单元规格 sys_unit_config
的定义里 CPU 和 内存的最小值和最大值定义不一样,前面统计资源里的已分配资源是按最小值计算的。
**建议:**资源单元规格定义的 CPU 和内存的最小值和最大值一样
alter resource unit sys_unit_config min_cpu=5,max_cpu=5,min_memory='1288490188B',max_memory='1288490188B';
创建 resource unit
create resource unit pay_unit_config max_cpu=2, min_cpu=2, max_memory='1G', min_memory='1G', max_iops=1000, min_iops=1000, max_session_num=100, max_disk_size='10G';
创建 resource pool
create resource pool pay_pool unit = 'pay_unit_config', unit_num = 1;
创建租户
create tenant pay_mysql_tat resource_pool_list=('pay_pool'), primary_zone='RANDOM',comment 'mysql tenant/instance' set ob_tcp_invited_nodes='192.168.10.%', ob_compatibility_mode='mysql';
ob_tcp_invited_nodes : 参数指定客户端连接主机
连接测试
obclient -h192.168.10.181 -uroot@pay_mysql_tat#obce -P2883 -c -A oceanbase obclient -h127.1 -uroot@pay_mysql_tat#obce -P2883 -c -A oceanbase
创建数据库
使用新建的租户连接并创建数据库
CREATE DATABASE `paydb` DEFAULT CHARACTER SET = utf8mb4 REPLICA_NUM = 1;
创建用户
-- 使用新建的租户连接并创建用户 create user `payer`@`192.168.10.%` identified by '123456'; grant select,insert,update,delete,create,drop on paydb.* to `payer`@`192.168.10.%`; grant all privileges on paydb.* to `payer`@`192.168.10.%`; select host, user, password, plugin, authentication_string from mysql.user;
登陆测试
obclient -h192.168.10.181 -upayer@pay_mysql_tat#obce -P2883 -c -A paydb -p # 返回当前的用户名与主机名 SELECT SESSION_USER(); # 返回登录账户名称的字符串 SELECT CURRENT_USER();
创建业务对象表
obclient -h192.168.10.181 -upayer@pay_mysql_tat#obce -P2883 -c -A paydb -p DROP TABLE IF EXISTS `customers`; CREATE TABLE`customers` ( `customerNumber` bigint(11) NOT NULL, `customerName` varchar(50) NOT NULL, `contactLastName` varchar(50) NOT NULL, `contactFirstName` varchar(50) NOT NULL, `phone` varchar(50) NOT NULL, `addressLine1` varchar(50) NOT NULL, `addressLine2` varchar(50) DEFAULT NULL, `city` varchar(50) NOT NULL, `state` varchar(50) DEFAULT NULL, `postalCode` varchar(15) DEFAULT NULL, `country` varchar(50) NOT NULL, `salesRepEmployeeNumber` bigint(11) DEFAULT NULL, `creditLimit` decimal(10,2) DEFAULT NULL, PRIMARY KEY (`customerNumber`), KEY `salesRepEmployeeNumber` (`salesRepEmployeeNumber`) GLOBAL ) partition by hash(`customernumber`) partitions 6 ; DROP TABLE IF EXISTS `orders`; CREATE TABLE`orders` ( `orderNumber` int(11) NOT NULL, `orderDate` date NOT NULL, `requiredDate` date NOT NULL, `shippedDate` date DEFAULT NULL, `status` varchar(15) NOT NULL, `comments` text DEFAULT NULL, `customerNumber` int(11) NOT NULL, PRIMARY KEY (`orderNumber`, `customerNumber`), KEY `customerNumber` (`customerNumber`) GLOBAL ) PARTITION by HASH(customerNumber) PARTITIONS 6 ; DROP TABLE IF EXISTS `orderdetails`; CREATE TABLE `orderdetails` ( `orderNumber` bigint(11) NOT NULL, `productCode` varchar(15) NOT NULL, `quantityOrdered` bigint(11) NOT NULL, `priceEach` decimal(10,2) NOT NULL, `orderLineNumber` smallint(6) NOT NULL, `customerNumber` bigint(11) NOT NULL, PRIMARY KEY (`customerNumber`, `orderNumber`, `productCode` ), KEY `productCode` (`productCode`) GLOBAL ) PARTITION by HASH(customerNumber) PARTITIONS 6;
创建表组
表组(Table Group)不是一个的物理对象,它是一个逻辑概念,表示一组表或者表的集合
create tablegroup tg_orders partition by hash partitions 6; alter tablegroup tg_orders add customers, orders, orderdetails; show tablegroups;
注意:
只有root用户可以创建tablegroup对象
结束语:OceanBase 社区版入门到实战教程直播正在进行中~
快和小伙伴一起进群交流学习吧~
加入直播群方式一:
钉钉群号 3582 5151
加入直播群方式二:
扫码下方钉钉二维码加入