OceanBase 是一个多租户的分布式数据库,统计数据量时需要考虑一台服务器上可能会有多个租户,1个租户会有多个副本。在 sys 租户上统计数据量大小时需要注意怎么区分单个副本的数据量大小,在业务租户上通过元数据表统计的数据量大小是单副本的大小。下文将展开描述服务器、租户级别、表级别的数据量统计方式。
服务器级别
OCP 上“集群总览”展示的数据量是集群中每个 observer 服务器的磁盘容量大小和已使用大小,通过这个信息我们可以快速知道整个集群大概的数据量,以及每台服务器上的存储是否够用。
- 16.8TB 表示的是 observer 上用 datafile_size 或者 datafile_disk_percentage 参数指定的可以使用的存储大小,也就是 /data/1/{cluster_name}/sstable/block_file 数据文件的大小(OceanBase 的数据文件是预分配的,在安装数据库后数据文件 block_file 的大小就已经预留好了,后续的写入不会改变文件大小。)
- 2.5TB 表示 block_file 数据文件中真实数据的大小,剩余都是可用空间
对应服务器上看到的磁盘使用情况,和OCP 上“集群总览”展示的基本一致。
df -h |grep /data/1
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/observervg-obdata 24T 17T 7.1T 71% /data/1
ll /data/1/group_x86_pt01/sstable/
total 17T
-rw-r----- 1 admin admin 17T Jan 18 01:31 block_file
另外补充一点,OCP上展示的数据来自 __all_virtual_disk_stat:
obclient [oceanbase]> SELECT svr_ip,svr_port,total_size/1024/1024/1024 AS total,
free_size/1024/1024/1024 AS free,
(total_size-free_size)/1024/1024/1024 as used
FROM __all_virtual_disk_stat;
+----------------+----------+--------------------+--------------------+-------------------+
| svr_ip | svr_port | total | free | used |
+----------------+----------+--------------------+--------------------+-------------------+
| xxx.xxx.xxx.193| 2882 | 17162.496093750000 | 14536.255859375000 | 2626.240234375000 |
| xxx.xxx.xxx.195| 2882 | 17162.496093750000 | 14494.105468750000 | 2668.390625000000 |
| xxx.xxx.xxx.197| 2882 | 17162.496093750000 | 14502.750000000000 | 2659.746093750000 |
+----------------+----------+--------------------+--------------------+-------------------+
3 rows in set (0.024 sec)
租户级别
单纯从数据量统计来说,租户级别会比集群级别更有意义,因为租户对标的是 MySQL、Oracle 的一个实例,而集群上可能会有多个租户。
一个zone上会有一个租户的所有分区,这个分区可能是 leader 副本也可能是 follower 副本。以下面例子来说:
- 1001号租户有3个 zone 也就是3副本,每个zone上只有1个 unit 也就是说这1个副本都在1个 observer 上。如果每个zone 有2个 unit,那这1份完整的副本会分散在2个 observer 上
- 1个副本的数据量是data_size_gb=2302GB,占用的磁盘空间大小是 required_size_gb=2601GB(xxx.xxx.xxx.193 上只有1001租户,对应block_file文件中数据文件中真实数据的大小)
- 3个副本的总数据量就是3个zone的数据量之和
obclient [oceanbase]> select zone,svr_ip,svr_port,sum(data_size)/1024/1024/1024 as data_size_gb,sum(required_size)/1024/1024/1024 as required_size_gb from __all_virtual_meta_table where tenant_id=1001 group by zone,svr_ip,svr_port;
+-------+----------------+----------+-------------------+-------------------+
| zone | svr_ip | svr_port | data_size_gb | required_size_gb |
+-------+----------------+----------+-------------------+-------------------+
| zone1 | xxx.xxx.xxx.193| 2882 | 2302.406988900154 | 2601.037109375000 |
| zone2 | xxx.xxx.xxx.195| 2882 | 2302.406988900154 | 2601.037109375000 |
| zone3 | xxx.xxx.xxx.197| 2882 | 2302.406988900154 | 2601.037109375000 |
+-------+----------------+----------+-------------------+-------------------+
3 rows in set (0.384 sec)
也可以在业务租户里统计,下面是OB Oracle 租户的示例,这里统计的是1个副本的数据量大小,和上面的 data_size_gb=2302GB 一致:
obclient [SYS]> select ROUND(SUM(BYTES)/1024/1024/1024,2) AS "SIZE(GB)" FROM DBA_SEGMENTS;
+----------+
| SIZE(GB) |
+----------+
| 2302.41 |
+----------+
1 row in set (2.948 sec)
表级别
如果要看某张表的数据量大小,通常这个维度看的是单副本的大小,OB Oracle 业务租户统计方式如下:
obclient [SYS]> select owner,SEGMENT_NAME,ROUND(BYTES/1024/1024,2) AS "SIZE(M)" FROM DBA_SEGMENTS where SEGMENT_NAME='ETL_P10IDS_RISKCON';
+-------+--------------------+-----------+
| OWNER | SEGMENT_NAME | SIZE(M) |
+-------+--------------------+-----------+
| LIFE | ETL_P10IDS_RISKCON | 177094.57 |
+-------+--------------------+-----------+
1 row in set (0.485 sec)
对应 sys 租户的统计方式:
obclient [oceanbase]> select meta.zone,meta.svr_ip,t.database_name,t.table_name,ROUND(meta.data_size/1024/1024,2) AS "DATA_SIZE(M)",ROUND(meta.required_size/1024/1024,2) AS "REQUIRED_SIZE(M)" from __all_virtual_meta_table meta join gv$table t on meta.table_id=t.table_id where t.table_name='ETL_P10IDS_RISKCON' and t.database_name='LIFE';
+-------+----------------+---------+--------------------+--------------+------------------+
| zone | svr_ip | db_name | table_name | DATA_SIZE(M) | REQUIRED_SIZE(M) |
+-------+----------------+---------+--------------------+--------------+------------------+
| zone1 | xxx.xxx.xxx.193| LIFE | ETL_P10IDS_RISKCON | 177094.57 | 193888.00 |
| zone2 | xxx.xxx.xxx.195| LIFE | ETL_P10IDS_RISKCON | 177094.57 | 193888.00 |
| zone3 | xxx.xxx.xxx.197| LIFE | ETL_P10IDS_RISKCON | 177094.57 | 193888.00 |
+-------+----------------+---------+--------------------+--------------+------------------+
3 rows in set (0.787 sec)
网友评论