在业务开发之前,DBA 需要在 OceanBase 集群中创建一个数据库实例,这个实例就是 OceanBase 租户。OceanBase 集群可以分配出多个租户,这个能力就称为多租户。
OceanBase 数据库以集群形态部署运行,提供给业务使用的是其中的租户。租户也叫实例,拥有一定的资源能力(如 CPU、内存和空间)。
OceanBase 是单进程软件,进程名为 observer
。进程启动后,默认会将操作系统的大部分 CPU、内存和磁盘资源据为己有。当然,资源的使用情况也可以通过集群启动参数进行设置。
参数名 | 参数值 | 参数含义 |
---|---|---|
cpu_count |
16 | 默认取操作系统的 CPU 数减去 2 。也可以自定义数目。 |
memory_limit |
8G | 进程默认使用的最大内存。如果设置为 0 表示该参数不受限制。和参数 memory_limit_percentage 二选一。 |
memory_limit_percentage |
80 | 进程默认使用的最大内存占总可用内存的百分比。 和参数 memory_limit 二选一。 |
datafile_size |
0 | 进程的数据文件(block_file )的初始化大小 。如果设置为 0 表示该参数不受限制。 |
datafile_disk_percentage |
75 | 进程的数据文件(block_file )的初始化大小占数据目录(sstable)所在文件系统可用空间的百分比。 |
clog_disk_usage_limit_percentage |
95 | 进程的 clog 文件所在文件系统空间使用率上限百分比。达到这个值就会被认为“空间满”,clog 会停写。 |
进程 observer
取得的资源中 CPU 个数是声明式的,内存资源是独占的,磁盘空间是独占的(预分配)。
OceanBase 集群能把所有节点进程 observer
取得的资源集中管理,然后从集群中分配出多个租户,每个租户对应一定的资源。这个资源的大小可以自行定义,并且资源可以在线调整,该功能也是弹性伸缩能力的体现。
OceanBase 数据库的租户资源定义包含 CPU、内存、空间、IOPS 和会话数。目前 OceanBase 只实现了 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)
您可运行以下 SQL 查看资源单元规格。
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';
从上面可以看出,资源单元规格 sys_unit_config
的定义里 CPU 和内存的最小值和最大值定义不一样,而前面统计资源中的已分配资源时是按最小值进行计算的。这将会导致剩余的可用资源计算不那么准确。所以,建议把该资源单元规格中定义的 CPU 和内存的最小值和最大值拉平。
此时查询剩余可用资源将较为准确。
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)
查看资源分配细节。
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
)。