南大通用GBase 8a数据倾斜,不同节点磁盘占用差距的几个原因

本文讨论GBase 8a数据库集群,在哪些情况下会出现部分节点磁盘占用大小差距较大,比如部分占用多或部分占用少的可能原因,以便用户根据业务要求进行调整。

参考

GBase8a 集群查看某张表占用的磁盘空间大小

从集群层通过segment_id直接查询分片数据排查倾斜

目标表Hash分布表列的数据不均

目标表为hash分布表,这个是最常见的原因,节点数越多,现象越明显。原因是数据本身就分布不均匀。

曾有项目记录原始话单数据,根据主叫号码进行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的部分。

GBase 8a 集群加载数据LOAD的方法

用户导出的本地数据文件

用户偶尔会导出部分数据,发送给外部其它业务用,比如上报。而这些数据文件较大,且忘记了清理,会导致这些节点磁盘占用高。

日志频繁刷新导致

系统故障且不可自动,则会在恢复时记录大量的日志。

曾发生用户不同节点的配置文件不同,导致某个节点的密码修改失败,集群记录的event。在后续重做过程中,肯定还是报错,无法修改密码,同步失败记录日志。之后立即重试,不断重试,同步日志也就在不断的增长。

解决方法

尽快排查解决系统不一致的问题,包括节点故障。