在业务开发之前,DBA 先需要从 OceanBase 集群里创建一个数据库实例出来。这个实例就是 OceanBase 租户。OceanBase 集群可以分配出多个租户,这个能力就是多租户。
多租户原理简介
OceanBase 数据库以集群形态部署运行,提供给业务使用的是其中的租户。租户也叫实例,拥有一定的资源能力(如CPU、内存和空间)。
OceanBase 是单进程软件,进程名叫 observer
,每个进程启动后,默认会将操作系统的大部分资源据为己有。资源指的是 CPU、内存和磁盘空间。当然,这个资源的使用情况可以通过集群启动参数去设置。
进程 observer
取得的资源中 CPU 个数是声明式的,内存资源是独占的,磁盘空间是独占的(预分配)。
OceanBase 集群能把所有节点进程 observer
取得的资源集中管理,然后从集群中分配出多个租户,每个租户对应一定的资源。这个资源大小可以定义,并且资源可以在线调整,这个功能也是弹性伸缩能力的一个体现。 OceanBase 的租户资源定义是包含 CPU、内存、空间、IOPS 和会话数,目前产品只实现了 CPU 和 内存的资源隔离,空间、IOPS 和会话数不起作用。不过建议创建资源的时候依然要设置的有意义一些。尤其是空间资源,不要定义的超出机器磁盘实际可用空间很多。这个数据会对后期负载均衡机制有一定影响。
查看集群可用资源
OceanBase 集群默认有个内部租户(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 | 172.20.249.52:2882 | 14 | 2.5 | 11.5 | 5.000000000000 | 1.000000000000 | 4.000000000000 | | zone2 | 172.20.249.49:2882 | 14 | 2.5 | 11.5 | 5.000000000000 | 1.000000000000 | 4.000000000000 | | zone3 | 172.20.249.51:2882 | 14 | 2.5 | 11.5 | 5.000000000000 | 1.000000000000 | 4.000000000000 | +-------+--------------------+-----------+--------------+----------+----------------+----------------+----------------+ 3 rows in set (0.008 sec)
再查看一下资源分配细节。
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 | 172.20.249.52:2882 | 1 | sys | | sys_pool | sys_unit_config | 5 | 5 | 1.500000000000 | 1.500000000000 | 2 | zone2 | 172.20.249.49:2882 | 1 | sys | | sys_pool | sys_unit_config | 5 | 5 | 1.500000000000 | 1.500000000000 | 3 | zone3 | 172.20.249.51:2882 | 1 | sys | +--------------------+------------------+---------+---------+----------------+----------------+---------+-------+--------------------+-----------+-------------+ 3 rows in set (0.006 sec)
这个结果显示内部租户的资源池(resource pool
),由每个 zone
里的一个节点上的资源单元(resource unit
)组成,每个资源单元使用同一规格(sys_unit_config
)。 从上面可以看出,资源单元规格 sys_unit_config
的定义里 CPU 和 内存的最小值和最大值定义不一样,前面统计资源里的已分配资源是按最小值计算的。这个会导致剩余可用资源计算不那么直观。 所以,建议把这个资源单元规格定义的 CPU 和内存的最小值和最大值拉平。
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 | +----------------------------+----------------------------+----------------+-----------------+---------+---------+------------+------------+----------+----------+---------------+---------------------+ | 2021-09-12 14:49:43.422194 | 2021-09-13 13:55:55.778987 | 1 | sys_unit_config | 5 | 2.5 | 1610612736 | 1073741824 | 10000 | 5000 | 53687091200 | 9223372036854775807 | +----------------------------+----------------------------+----------------+-----------------+---------+---------+------------+------------+----------+----------+---------------+---------------------+ 1 row in set (0.001 sec) alter resource unit sys_unit_config min_cpu=5,max_cpu=5,min_memory='1610612736B',max_memory='1610612736B';
再查询剩余可用资源就准确了。
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 | 172.20.249.52:2882 | 14 | 5 | 9 | 5.000000000000 | 1.500000000000 | 3.500000000000 | | zone2 | 172.20.249.49:2882 | 14 | 5 | 9 | 5.000000000000 | 1.500000000000 | 3.500000000000 | | zone3 | 172.20.249.51:2882 | 14 | 5 | 9 | 5.000000000000 | 1.500000000000 | 3.500000000000 | +-------+--------------------+-----------+--------------+----------+----------------+----------------+----------------+ 3 rows in set (0.005 sec)
计算集群剩余可用资源的目的是为了避免创建业务租户时不会碰到资源不足的报错。
附录:
- 3.1 查看 OceanBase 集群资源的使用情况
- 3.2 如何创建和连接 MySQL 租户
- 3.3 如何连接租户
- 3.4 如何对租户参数(或变量)进行设置
- 3.5 如何使用 MySQL 租户做常见数据库开发
- 3.6 如何使用 OceanBase 分区表进行水平拆分
- 3.7 (高级)如何使用 OceanBase 表分组
- 3.8(高级)如何使用 OceanBase 复制表
- 3.9 常见问题
结束语
加入教程直播群方式一:钉钉群号3255 4020
加入教程直播群方式二:扫码下方二维码加入