概述
OceanBase 数据库是多租户的分布式数据库,租户使用的资源建立在资源池上。资源池包含了资源单元,而资源单元则规定了具体资源的量化(如
CPU、Memory、Disk_Size 和 IOPS 等)。
创建租户前,必须规定租户使用的资源范围,资源池和资源单元就是为了满足租户资源隔离和负载均衡而存在的。
资源管理中的概念
资源单元(Resource Unit,Unit)
- 资源单元是一个容器。实际上,副本是存储在资源单元之中的,所以资源单元是副本的容器。
- 资源单元包含了计算存储资源(Memory、CPU 和 IO 等)同时资源单元也是集群负载均衡的一个基本单位,
- 在集群节点上下线,扩容缩容时会动态调整资源单元在节点上的分布进而达到资源的使用均衡。
资源池 (Resource Pool)
- 一个租户拥有若干个资源池,这些资源池的集合描述了这个租户所能使用的所有资源。
- 一个资源池由具有相同资源规格(Unit Config)的若干个资源单元组成。
- 一个资源池只能属于一个租户。每个资源单元描述了位于一个 Server 上的一组计算和存储资源,可以视为一个轻量级虚拟机,包括若干 CPU 资源、内存资源、磁盘资源等。一个租户在同一个 Server 上最多有一个资源单元(资源单元是和副本关联的,显而易见一个服务器不能有同一份数据的两个副本)。
资源配置(Resource Config)
- 资源配置是资源单元的具体配置,包含资源单元所属的资源池信息、使用资源的租户信息、资源单元的配置信息(如 CPU 核数和内存资源)等。修改资源配置可以动态调整资源单元的计算资源,进而调整对应租户的资源。
下面开始演示资源管理和租户创建:
1)资源管理
集群默认有个内部租户(sys),可以查看和管理集群的资源(sql如下):
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;
结果如下(实验环境集群为单节点集群):
+-------+---------------------+-----------+--------------+----------+----------------+----------------+----------------+
| zone | observer | cpu_total | cpu_assigned | cpu_free | mem_total_gb | mem_assign_gb | mem_free_gb |
+-------+---------------------+-----------+--------------+----------+----------------+----------------+----------------+
| zone1 | 192.168.152.30:2882 | 14 | 2.5 | 11.5 | 5.000000000000 | 1.250000000000 | 3.750000000000 |
+-------+---------------------+-----------+--------------+----------+----------------+----------------+----------------+
1 row in set (0.006 sec)
查看资源单元规格
MySQL [oceanbase]> select * from __all_unit_config;
+----------------------------+----------------------------+----------------+-----------------+---------+---------+------------+------------+----------+----------+---------------+---------------------+
| gmt_create | gmt_modified | unit_config_id | name | max_cpu | min_cpu | max_memory | min_memory | max_iops | min_iops | max_disk_size | max_session_num |
+----------------------------+----------------------------+----------------+-----------------+---------+---------+------------+------------+----------+----------+---------------+---------------------+
| 2023-02-07 09:51:59.323369 | 2023-02-07 09:51:59.323369 | 1 | sys_unit_config | 5 | 2.5 | 1610612736 | 1342177280 | 10000 | 5000 | 10737418240 | 9223372036854775807 |
+----------------------------+----------------------------+----------------+-----------------+---------+---------+------------+------------+----------+----------+---------------+---------------------+
1 row in set (0.001 sec)
MySQL [oceanbase]>
可以看出,资源单元规格 sys_unit_config 的定义里 CPU 和内存的最小值和最大值定义不一样,而第一条sql统计资源中的已分配资源时是按最小值进行计算的。这将会导致剩余的可用资源计算不那么准确。 所以,建议把该资源单元规格中定义的 CPU 和内存的最小值和最大值拉平。
修改资源单元 sys_unit_config:
alter resource unit sys_unit_config min_cpu=5,max_cpu=5,min_memory='1610612736B', max_memory='1610612736B';
再次查看资源情况可以看见资源统计计算准确
查看已分配资源池的情况
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_name | unit_config_name | max_cpu | min_cpu | max_mem_gb | min_mem_gb | unit_id | zone | observer | tenant_id | tenant_name |
+--------------------+------------------+---------+---------+----------------+----------------+---------+-------+---------------------+-----------+-------------+
| sys_pool | sys_unit_config | 5 | 5 | 1.500000000000 | 1.500000000000 | 1 | zone1 | 192.168.152.30:2882 | 1 | sys |
+--------------------+------------------+---------+---------+----------------+----------------+---------+-------+---------------------+-----------+-------------+
2 rows in set (0.005 sec)
2)如何创建和连接 MySQL 租户
1.创建资源单元规格:该步骤为可选步骤,如果有合适的规格可以跳过此步骤,直接进行复用
2.创建资源池:可以每个 zone 一个资源池,使用独立的资源单元规格,也可以所有 zone 使用同一个资源单元规格,都在一个资源池下。
3.创建租户:创建租户时需关联到第 2 步中创建的资源池。
4.连接租户:
MySQL 客户端连接
OBClient 客户端连接
OceanBase 连接驱动(JDBC)
DBEAVER 客户端连接
ODC 客户端连接:OceanBase 提供官方图形化客户端工具 OceanBase Developer Center,简称 ODC
-创建资源单元规格
查看创建的资源单元规格:
select * from __all_unit_config;
CREATE resource unit S1
max_cpu=3, min_cpu=3, max_memory='3G', min_memory='3G', max_iops=10000, min_iops=1000, max_session_num=1000000, max_disk_size='1024G';
CREATE resource unit S2
max_cpu=4, min_cpu=4, max_memory='3G', min_memory='3G', max_iops=10000, min_iops=1000, max_session_num=1000000, max_disk_size='1024G';
MySQL [oceanbase]> select * from __all_unit_config;
+----------------------------+----------------------------+----------------+-----------------+---------+---------+------------+------------+----------+----------+---------------+---------------------+
| gmt_create | gmt_modified | unit_config_id | name | max_cpu | min_cpu | max_memory | min_memory | max_iops | min_iops | max_disk_size | max_session_num |
+----------------------------+----------------------------+----------------+-----------------+---------+---------+------------+------------+----------+----------+---------------+---------------------+
| 2023-02-07 09:51:59.323369 | 2023-02-07 12:20:46.250880 | 1 | sys_unit_config | 5 | 5 | 1610612736 | 1610612736 | 10000 | 5000 | 10737418240 | 9223372036854775807 |
| 2023-02-07 14:09:21.996793 | 2023-02-07 14:09:21.996793 | 1001 | S1 | 3 | 3 | 3221225472 | 3221225472 | 10000 | 1000 | 1099511627776 | 1000000 |
| 2023-02-07 14:09:37.685271 | 2023-02-07 14:09:37.685271 | 1002 | S2 | 4 | 4 | 3221225472 | 3221225472 | 10000 | 1000 | 1099511627776 | 1000000 |
+----------------------------+----------------------------+----------------+-----------------+---------+---------+------------+------------+----------+----------+---------------+---------------------+
3 rows in set (0.001 sec
-创建资源池
创建语法:
单节点集群的话:
create resource pool pool_1 unit='S1' , unit_num=1, zone_list=('zone1') ;(单副本单节点集群unit_num只能是1)
1-1-1集群的话:
create resource pool pool_1 unit='S1' , unit_num=1, zone_list=('zone1' ,'zone2') ;(1-1-1集群,每一个zone中的server是1,unit_num最大是1)
create resource pool pool_2 unit='S2' , unit_num=1, zone_list=('zone3');
3-3-3集群的话
create resource pool pool1
unit=‘s1’,
unit_num=3#一个zone中包含的observer数据量x>=3), 集群最低要求3-3-3,否则会报错(3个zone(表示3副本),每个zone中3台observer。
zone_list=(‘zone1’,‘zone2’,‘zone3’,‘zone4’)
UNIT_NUM = unitnum:指定要创建的单个 Zone 下的 Unit 个数。每个单元会根据当前集群负载,自动在每个 Zone中选择一个 Server 负载,
但同一个资源池的多个 Unit 不能分配到同一个 Server,即一个资源池包含的 Unit 个数不能超过单 Zone 内 Server 的个数。
资源池创建出来后,集群的可用资源就减少了。但是这个资源池还没有关联到具体租户,所以无法被业务使用。
查看已分配资源池的情况
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_name | unit_config_name | max_cpu | min_cpu | max_mem_gb | min_mem_gb | unit_id | zone | observer | tenant_id | tenant_name |
+--------------------+------------------+---------+---------+----------------+----------------+---------+-------+---------------------+-----------+-------------+
| sys_pool | sys_unit_config | 5 | 5 | 1.500000000000 | 1.500000000000 | 1 | zone1 | 192.168.152.30:2882 | 1 | sys |
| pool_1 | S1 | 3 | 3 | 3.000000000000 | 3.000000000000 | 1001 | zone1 | 192.168.152.30:2882 | NULL | NULL |
+--------------------+------------------+---------+---------+----------------+----------------+---------+-------+---------------------+-----------+-------------+
再次查看剩余资源
MySQL [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;
+-------+---------------------+-----------+--------------+----------+----------------+----------------+----------------+
| zone | observer | cpu_total | cpu_assigned | cpu_free | mem_total_gb | mem_assign_gb | mem_free_gb |
+-------+---------------------+-----------+--------------+----------+----------------+----------------+----------------+
| zone1 | 192.168.152.30:2882 | 14 | 8 | 6 | 5.000000000000 | 4.500000000000 | 0.500000000000 |
+-------+---------------------+-----------+--------------+----------+----------------+----------------+----------------+
1 row in set (0.005 sec)
MySQL [oceanbase]>
-创建租户:
创建租户时需关联到第 2 步中创建的资源池。
create tenant obmysql resource_pool_list=('pool_1'), primary_zone='RANDOM',comment 'mysql tenant/instance', charset='utf8' set ob_tcp_invited_nodes='%' ;
ob_tcp_invited_nodes设置客户端IP白名单,‘%’,表示允许所有的来源,默认仅为本机127.0.0.1。
zone_list=(‘zone1’,‘zone2’,‘zone3’) 租户资源使用的zone(资源分布在哪些zone上,实验环境是单机集群,没法按照示例创建)。
primary_ZONE=‘ZONE1,ZONE2,ZONE3’ 主副本偏好设置。
查看tenant信息
MySQL [oceanbase]> select * from gv$tenant;
+-----------+-------------+-----------+--------------+----------------+-----------------------+-----------+---------------+
| tenant_id | tenant_name | zone_list | primary_zone | collation_type | info | read_only | locality |
+-----------+-------------+-----------+--------------+----------------+-----------------------+-----------+---------------+
| 1 | sys | zone1 | zone1 | 0 | system tenant | 0 | FULL{1}@zone1 |
| 1001 | obmysql | zone1 | RANDOM | 0 | mysql tenant/instance | 0 | FULL{1}@zone1 |
+-----------+-------------+-----------+--------------+----------------+-----------------------+-----------+---------------+
2 rows in set (0.003 sec)
总结:
一个资源单元为 UNIT,UNIT是最小的资源分割单位。
一个资源池中包含若干 UNIT,一台Observer 只能有一个资源池的一个 UNIT。(所以创建resourcepool时unit_num最大数不能超过单个zone总observer的数目)
一个资源池只能赋予给一个租户,一个租户可以包含多个资源池。
资源池若指定只分布在一个zone,则该zone失效后,数据丢失,无副本。
一个资源池建议指定分布在多个zone,多个zone则存在副本。(最好是全部zone,需大于2,若等于2,一个zone损坏,由于不满足多数派,虽然数据还有一个副本,但是服务会停止)
–连接租户
1.obclient
obclient -h192.168.152.30 -uroot@obmysql -P2881 -p -c -A oceanbase
alter user root identified by 'bJVqqEVt' ;
obclient -h192.168.152.30 -uroot@obmysql -P2881 -pbJVqqEVt -c -A oceanbase
show databases;
过程如下:
[admin@obce01 ~]$ obclient -h192.168.152.30 -uroot@obmysql -P2881 -p -c -A oceanbase
Enter password: --------------------------------------------------------初始密码为空
Welcome to the OceanBase. Commands end with ; or \g.
Your MySQL connection id is 3221489885
Server version: 5.7.25 OceanBase 3.1.0 (r3-b20901e8c84d3ea774beeaca963c67d7802e4b4e) (Built Aug 10 2021 08:10:38)
MySQL [oceanbase]> alter user root identified by 'bJVqqEVt' ;
Query OK, 0 rows affected (0.014 sec)
MySQL [oceanbase]> Bye
[admin@obce01 ~]$ obclient -h192.168.152.30 -uroot@obmysql -P2881 -pbJVqqEVt -c -A oceanbase
Welcome to the OceanBase. Commands end with ; or \g.
Your MySQL connection id is 3221489906
Server version: 5.7.25 OceanBase 3.1.0 (r3-b20901e8c84d3ea774beeaca963c67d7802e4b4e) (Built Aug 10 2021 08:10:38)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [oceanbase]> show databases;
+--------------------+
| Database |
+--------------------+
| oceanbase |
| information_schema |
| mysql |
| test |
+--------------------+
4 rows in set (0.005 sec)
MySQL [oceanbase]>
-
ODC客户端
下载安装:下载客户端版 ODC新建连接串:智能识别 obclient -h192.168.152.30 -uroot@obmysql -P2881 -pbJVqqEVt -c -A oceanbase