南大通用GBase 8a表数据分布不均的原因及解决方案
GBase 8a数据倾斜原因分析
Hash分布表列的数据不均
目标表为hash分布表,这个是最常见的原因,节点数越多,现象越明显。原因是数据本身就分布不均匀。
项目上曾有sql存储了原始话单数据,根据主叫号码进行Hash分布,但发现各个节点磁盘占用差距达到了3倍。经数据排查,发现10086占用的总行数,基本等同于第2到第5的总和,甚至还要多。结果导致保存主叫10086的节点磁盘空间明细比其它的多。
解决方法
V8版本,可以选择其它的分布更均匀的,可接受的hash分布列,或者干脆使用随机分布表,将数据接近平均的分散。
V9版本,实现了多列hash,可以选择合适的多个列做Hash分布来缓解倾斜,当然需要根据业务,毕竟多列hash也代表这你的join/group里也必须包含这多列,否则没有性能提升,那就还不如直接做随机分布表。
汇总类查询转储第一列存在大量重复值
目标表多为随机分布表,采用insert 目标表 select 原表 group时,group的第一列有大量重复值,且其余group列又不是原表的hash分布列,则会导致大量数据分组到部分节点,然后insert 到了本地随即表里。
频繁加载小批量数据
只针对随机分布表,如果数据行数比节点数还少,或者数据行数每次都不是节点数的倍数,那么总会有部分节点的行数会少一行。
比如100个节点,每次加载90行,那么最后10个节点将每次都没有数据。 每次加载190行,那么最后10个节点将少一行。 数据库内部并没有在加载时动态调整这一行的偏差的功能。
如果频率很高,比如每5秒一次,那么随着时间累计积压,部分节点磁盘占用将比其它的少。
解决方案
增加加载间隔,比如从每5秒一次改成每5分钟一次,则可以极大改善这个差距的程度。
其它数据占用
如下是几种遇到过的,其它数据导致部分节点占用高的情况。
加载错误数据
当加载出现不合法的数据时,默认会将其保存到加载连接的gcluster节点的日志目录下。当某些业务加载错误数据多时,错误数据占用的空间将明显比其它节点多。
解决方法
提高数据质量,或者拒绝错误超过限定的加载。,具体看load的语法里有关MAX_BAD_RECORDS的部分。
用户导出的本地数据文件
用户偶尔会导出部分数据,发送给外部其它业务用,比如上报。而这些数据文件较大,且忘记了清理,会导致这些节点磁盘占用高。
日志频繁刷新导致
系统故障且不可自动,则会在恢复时记录大量的日志。
用户不同节点的配置文件不同,导致某个节点的密码修改失败,集群记录的event。在后续重做过程中,肯定还是报错,无法修改密码,同步失败记录日志。之后立即重试,不断重试,同步日志也就在不断的增长。
解决方法
尽快排查解决系统不一致的问题,包括节点故障。
GBase 8a数据倾斜定位方法
GBase 8a数据库集群提供了元数据表 cluster_tables,用于查询某张表占用的磁盘空间,以及各个分片 CLUSTER_TABLE_SEGMENTS 在各自机器上占用的磁盘空间。
作用
查看指定表占用的数据空间,最后更新时间等。
提醒:如下方案在某些86版本里,当磁盘表和列特别多时,需要消耗大量的磁盘操作来统计数据库真实占用的磁盘空间。建议测试后如果发现无法接受,请自行使用df 数据库所在分区的方案来进行统计。
注意:
1.此功能在部分V95早期版本不可用,大部分V86和新的V9版本均可用。
2.必须同时提供库名和表名。
3.如想查看整个test库占用的空间,建议
4.以磁盘df 的/opt/gbase目录估算。
5.或者du -sh /opt/gbase/gnode/userdata/gbase/用户database名字
查看表总空间
select * from information_schema.cluster_tables a where table_schema='dbname' and table_name='tbname';
其中dbname为库名,比如test,tbname为表名,比如test_xx。
两个参数必须同时指定,每次只能查1个表。 返回结果里已经包含了副本空间。单位是字节。
查看每个分片空间
select * from information_schema.CLUSTER_TABLE_SEGMENTS a where table_schema='dbname' and table_name='tbname';
表总空间,等于分片大小的总和副本数量。 对于复制表就是节点数量。
使用样例
update_time是最后修改时间,比如加载;
table_data_size是纯数据占用的磁盘空间;
table_storage_size是全部占用的空间,包括元数据和数据等。
suffix 是分片号
分布表样例
总空间是每个分片空间的和,乘以副本数量。 本例副本是1+1=2。
如下是一个1000万行的表的情况。
gbase> select count(*) from test.tt;
+----------+
| count(*) |
+----------+
| 10000000 |
+----------+
1 row in set (Elapsed: 00:00:00.17)
总数据量情况。共2.7G(已经包含副本空间)。
gbase> select * from information_schema.cluster_tables a where table_schema='test' and table_name='tt';
+------------+--------+----+---------------------+---------------------+-----------+-----------+
| TABLE_VC | TABLE_SCHEMA | TABLE_NAME | CREATE_TIME | UPDATE_TIME | TABLE_DATA_SIZE | TABLE_STORAGE_SIZE | TABLE_TYPE |
+------------+--------+----+---------------------+---------------------+-----------+-----------+
|vcname000001| test | tt | 2020-09-05 07:42:51 | 2024-11-29 06:22:18 | 162129972 |2740314218 | random |
+------------+--------+----+---------------------+---------------------+-----------+-----------+
分片情况,每个450M,3个累积1.37G。
gbase> select * from information_schema.CLUSTER_TABLE_SEGMENTS a where table_schema='testdb' and table_name='tt';
+--------------+--------+----+----+------------+----------+-----------+--------------+
| TABLE_VC | TABLE_SCHEMA | TABLE_NAME | SUFFIX | HOST | TABLE_DATA_SIZE | TABLE_STORAGE_SIZE | DATA_PERCENT |
+--------------+--------+----+----+------------+----------+-----------+--------------+
| vcname000001 | test | tt | n1 | 10.11.22.10 | 27159648 | 456672843 | 33.5036% |
| vcname000001 | test | tt | n2 | 10.11.22.11 | 26748872 | 456634381 | 32.9968% |
| vcname000001 | test | tt | n3 | 10.11.22.12 | 27156466 | 456849885 | 33.4996% |
+--------------+--------+----+----+------------+----------+-----------+--------------+
3 rows in set (Elapsed: 00:00:00.01)
分片累积*副本数2,基本和总和一样
gbase> select 456672843*3;
+-------------+
| 456672843*3 |
+-------------+
| 1370018529 |
+-------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select 456672843*3*2;
+---------------+
| 456672843*3*2 |
+---------------+
| 2740037058 |
+---------------+
1 row in set (Elapsed: 00:00:00.00)
复制表样例
总空间等于分片空间*节点数。本例是3个节点。
gbase> select * from information_schema.cluster_tables a where table_schema='test' and table_name='t1gh';
+--------------+--------------+------------+---------------------+---------------------+-----------------+--------------------+------------+
| TABLE_VC | TABLE_SCHEMA | TABLE_NAME | CREATE_TIME | UPDATE_TIME | TABLE_DATA_SIZE | TABLE_STORAGE_SIZE | TABLE_TYPE |
+--------------+--------------+------------+---------------------+---------------------+-----------------+--------------------+------------+
| vcname000001 | test | t1gh | 2024-12-01 21:24:00 | 2024-10-02 15:36:02 | 1713 | 6285 | replicated |
+--------------+--------------+------------+---------------------+---------------------+-----------------+--------------------+------------+
1 row in set (Elapsed: 00:00:00.01)
gbase> select * from information_schema.CLUSTER_TABLE_SEGMENTS a where table_schema='test' and table_name='t1gh';
+--------------+--------------+------------+--------+------------+-----------------+--------------------+--------------+
| TABLE_VC | TABLE_SCHEMA | TABLE_NAME | SUFFIX | HOST | TABLE_DATA_SIZE | TABLE_STORAGE_SIZE | DATA_PERCENT |
+--------------+--------------+------------+--------+------------+-----------------+--------------------+--------------+
| vcname000001 | test | t1gh | n1 | 10.11.22.10 | 571 | 2095 | 100% |
+--------------+--------------+------------+--------+------------+-----------------+--------------------+--------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select 2095*3;
+--------+
| 2095*3 |
+--------+
| 6285 |
+--------+
1 row in set (Elapsed: 00:00:00.00)
评论


热门帖子
- 12023-05-09浏览数:16919
- 22020-05-11浏览数:10352
- 32019-04-26浏览数:10332
- 42023-09-25浏览数:9764
- 52023-07-04浏览数:9547