美文网首页
OceanBase:统计数据量大小

OceanBase:统计数据量大小

作者: 轻松的鱼 | 来源:发表于2024-01-30 15:14 被阅读0次

    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)
    

    相关文章

      网友评论

          本文标题:OceanBase:统计数据量大小

          本文链接:https://www.haomeiwen.com/subject/ieeyodtx.html