首批通过分布式安全可靠测评,为关键业务系统打造
如何规划租户资源的容量?
更新时间:2023-11-16 04:26
本文介绍合理规划租户资源容量的方法。
OceanBase 侧的容量界定方法
OceanBase 数据库主要提供 CPU、Memory 和 Storage 等资源。租户容量资源通过在 OCP 界面上创建租户时,指定 Unit 规格和 Unit 数据来设定。
Unit 规格和 Unit 数据说明如下:
Unit 规格指在单 Zone 的单 Server 的可分配资源总量,并不是指集群所有 Server 资源总量。
Unit 数量指一个租户可使用的资源(专有名词:资源池)可以包含多个资源单元。每个单元会根据当前集群负载,自动在每个 Zone 中选择一个 Server 负载,但同一个资源池的多个单元不能分配到同一个 Server,即一个资源池包含的单元个数不能超过单 Zone 内 Server 的个数。
只有当租户在某个 Server 上有资源单元时,租户才能使用该 Server 存储数据。并且租户数据在同 Zone 的多个 Server 间,能够进一步负载均衡。
该租户被分配的所有资源总量为:Unit 规格*Unit 数量,类比 Oracle 侧,例如 4 Node RAC 上,4 个节点的资源总和。
该租户在连接运行时,可用的资源总量为:1 个 Unit 规格所定义的资源。类比于 Oracle 侧,例如 4 Node RAC 上,在 1 个节点的资源总和。
例如,在 3:3:3 集群部署方式下,某租户的资源池有 2 个单元,则每个 Zone 都会有 2 个 Server 负载 1 份数据,共有 6 个 Server 负载这三份数据。
该租户的数据只能在这 6 个 Server 上存储,在同 Zone 的 2 个 Server 间能够负载均衡。如果共用同一个集群的租户数量较多,每个资源池只能包含一个资源单元,因为此时单元总数已经比较多,能够做到比较好的负载均衡。
根据上图的资源分布情况,该租户在整个集群中需要的资源如下:
共需要 CPU=12 C(4*3),Memory=24 GB(8 GB*3)。
共有 3 个 Zone,所以是 3 个副本。
每个副本,在单个 Server 上被分配的资源是 CPU=4 C,Memory=8 GB。
从 Oracle 迁移数据至 OceanBase 数据库的过程中,建议 OceanBase 数据库资源的初始分配策略(即 Unit 规格)为 [(Oracle_CPU_AAS * C /60%)]*K。说明如下:
Oracle_CPU_AAS 为 Oracle 侧的 CPU_AAS Per Instance(用尽了几个 CPU)。
C 为两侧的 CPU 主频比。
60% 为保持 OBServer 侧单 CPU 的运行态 Max CPU PCT。
K 为根据业务特性需要的倍增系数。
脚本检查 Oracle 侧的资源使用情况
使用脚本收集 Oracle 侧的使用情况。Oracle 的容量规划,是一整套的方法和流程。但是目前在迁移过程中,您只需要检查以下容量相关的信息即可:
CPU/Memory/Storage,以下的 Memory/CPU 指单节点。
CPU 的使用情况。
占用用户存储的大小。
分区数。

脚本检查 OceanBase 侧资源的使用情况
使用 root 用户登录 sys 租户(root/sys)执行下述 SQL 脚本,您需要替换租户的名称。
说明
you can not expand this SQL by adding the "__all_database" and run under root/sys,这是因为 __all_database 只是反映当前租户下的用户信息,所以下述脚本必须在 root/sys 下执行。
查询租户的资源池、资源单元配置名称、资源单元配置
obclient>SELECT c.tenant_id, e.tenant_name, concat(c.name, ': ', d.name) `pool:conf`,
concat(c.unit_count, ' unit: ', d.min_cpu, 'C/', ROUND(d.min_memory/1024/1024/1024,0), "G") unit_info
FROM __all_resource_pool c, __all_unit_config d, __all_tenant e
WHERE c.unit_config_id=d.unit_config_id AND c.tenant_id=e.tenant_id AND c.tenant_id>1000
AND e.tenant_name='CIS2271'
ORDER BY c.tenant_id;
检查租户已使用的存储
obclient>SELECT e.tenant_name,a.svr_ip,round(sum(a.required_size)/1024/1024/1024,0) required_GB,sum(row_count) AS rows
FROM __all_virtual_meta_table a
INNER JOIN __all_virtual_table b ON a.table_id=b.table_id
INNER JOIN __all_virtual_database c ON b.database_id=c.database_id
INNER JOIN __all_tenant e ON b.tenant_id=e.tenant_id
WHERE e.tenant_name='CIS2271'
GROUP BY a.tenant_id,a.svr_ip
ORDER BY a.tenant_id,a.svr_ip;
检查租户的 Partition 总数
obclient>SELECT zone,svr_ip,tenant_name,count(1) cnt
FROM __all_virtual_meta_table a , __all_tenant b
WHERE a.tenant_id=b.tenant_id and b.tenant_name ='CIS2271'
GROUP BY zone,svr_ip,tenant_name ORDER BY zone,svr_ip,tenant_name desc;
检查集群的所有资源
磁盘空间实时统计
obclient>SELECT /*+READ_CONSISTENCY(WEAK), QUERY_TIMEOUT(100000000)*/ \
b.zone,a.svr_ip, \
round(total_size/1024/1024/1024, 2) total_G, \
round((total_size - free_size) /1024/1024/1024, 2) used_G, \
round(free_size/1024/1024/1024, 2) free_G, \
concat(round((total_size - free_size) / total_size * 100, 2), '%') used_percent \
FROM __all_virtual_disk_stat a, __all_server b
WHERE a.svr_ip = b.svr_ip ORDER BY b.zone,svr_ip;
所有可用的 CPU 和 Memory 情况
obclient>SELECT b.zone,a.svr_ip, a.cpu_total, a.cpu_assigned, a.cpu_assigned_percent, a.mem_total/1024/1024/1024 AS mem_total,
a.mem_assigned/1024/1024/1024 AS mem_assigned, (a.mem_total-a.mem_assigned)/1024/1024/1024 AS mem_free, a.mem_assigned_percent
From __all_virtual_server_stat a,__all_server b WHERE a.svr_ip = b.svr_ip ORDER BY zone,cpu_assigned_percent desc;
您也可以直接在租户下,使用 dba_segments.bytes 检查。
obclient>SELECT owner,segment_type,round(sum(bytes/power(1024,2))) size_MB
FROM dba_segments
GROUP BY owner,segment_type order by owner,segment_type;
对比存储使用量的示例:
| 数据库 | 公共库 | 物流库 |
|---|---|---|
| Oracle 数据库 | 300 GB | 300 MB |
| OceanBase 数据库 | 23 GB | 115 MB |
检查方法如下:
Oracle:通过 dba_segments 查询除 index 外,需要迁移的 data 数。
OceanBase 数据库:在租户的 sys 下,使用 dba_segments 查询。