问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

GaussDB数据倾斜解决方案:从检测到优化

创作时间:
作者:
@小白创作中心

GaussDB数据倾斜解决方案:从检测到优化

引用
CSDN
9
来源
1.
https://blog.csdn.net/feng6693/article/details/144815872
2.
https://m.blog.csdn.net/jerrywangcsdn/article/details/143860289
3.
https://blog.csdn.net/GaussDB/article/details/136314220
4.
https://blog.csdn.net/sujiangming/article/details/140835501
5.
https://xie.infoq.cn/article/c8f80098305fd1c8b34fd0831
6.
https://support.huaweicloud.com/trouble-dws/dws_09_0111.html
7.
https://support.huaweicloud.com/trouble-dws/dws_09_0072.html
8.
https://support.huaweicloud.com/mgtg-dws/dws_01_8201.html
9.
https://www.modb.pro/wiki/46?0910

在使用GaussDB数据库时,数据倾斜是一个常见的性能瓶颈问题。数据倾斜会导致资源利用不均,部分节点过载而其他节点空闲,从而降低整体查询效率。本文将详细介绍如何通过选择合适的分布列以及利用GaussDB的RLBT特性来有效解决数据倾斜问题,提升查询效率。

01

数据倾斜的危害

数据倾斜是指数据在各计算节点间分布不均,部分节点因承担过多数据处理任务而导致性能瓶颈。在分布式系统中,理想情况下每个节点的数据量应均匀分布以实现负载均衡。然而,在实际运行中可能会出现某些节点数据量远超其他节点的情况,这种现象被称为“数据倾斜”。

数据倾斜会导致以下负面影响:

  • SQL的性能会非常差,因为数据只分布在部分DN,那么SQL运行的时候就只有部分DN参与计算,没有发挥分布式的优势。
  • 会导致资源倾斜,尤其是磁盘。可能部分磁盘的空间已经接近极限,但是其他磁盘利用率很低。
  • 可能出现部分节点CPU过高等问题。
02

GaussDB的数据分布策略

GaussDB支持多种数据分布策略,包括hash、replication和roundrobin等。合理选择分布策略是解决数据倾斜的关键。

  1. Hash分布:将数据根据hash值分布到不同的节点上,适用于数据量大且分布均匀的场景。
  2. Replication分布:每个节点都保存完整的数据副本,适用于数据量较小但查询频繁的场景。
  3. Roundrobin分布:数据均匀分布到各个节点,适用于数据量大且无明显热点的场景。

在实际应用中,数据倾斜往往由不合理的数据分布策略导致,例如未指定分布键时默认选择第一列作为分布键,可能导致数据分布不均。

03

检测数据倾斜

GaussDB提供了多种工具和视图来检测数据倾斜,帮助用户快速定位问题。

  1. pgxc_thread_wait_status视图:通过查看线程等待状态,可以发现作业是否在等待部分DN或个别DN。
  2. table_distribution函数:可以检查表的数据分布情况,发现数据倾斜。
  3. skew_percent指标:通过百分比形式量化数据倾斜的程度,帮助评估数据分布的均匀性。

例如,可以通过以下SQL语句快速查询表的倾斜率:

WITH skew AS (
  SELECT 
    schemaname,
    tablename,
    pg_catalog.sum(dnsize) AS totalsize,
    pg_catalog.avg(dnsize) AS avgsize,
    pg_catalog.max(dnsize) AS maxsize,
    pg_catalog.min(dnsize) AS minsize,
    (pg_catalog.max(dnsize) - pg_catalog.min(dnsize)) AS skewsize,
    pg_catalog.stddev(dnsize) AS skewstddev
  FROM 
    pg_catalog.pg_class c
    INNER JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
    INNER JOIN pg_catalog.table_distribution() s ON s.schemaname = n.nspname AND s.tablename = c.relname
    INNER JOIN pg_catalog.pgxc_class x ON c.oid = x.pcrelid AND x.pclocatortype = 'H'
  GROUP BY 
    schemaname,
    tablename
)
SELECT 
  schemaname || '.' || tablename AS table,
  (skewsize / totalsize) * 100 AS skew_percent
FROM 
  skew
ORDER BY 
  skew_percent DESC
LIMIT 10;
04

解决方案

解决数据倾斜的具体方法包括:

  1. 选择合适的分布列:确保数据均匀分布,避免单个节点负载过高。分布列的选择原则包括:

    • 尽量选择distinct值比较多的列
    • 尽量选择Join列或group列做分布列
    • 避免数据广播
  2. 避免列存表的小CU膨胀:对列存表(尤其是分区表)进行高频小批量导入会造成CU膨胀,可以采取以下措施:

    • 修改为攒批入库,单分区单批次入库数据量需大于DN个数*6W
    • 定期VACUUM FULL
    • 在CU长期膨胀严重的情况下,考虑将列存表修改为行存表
  3. 清理脏数据:表频繁执行UPDATE/DELETE导致脏数据过多,需要定期VACUUM FULL清理。对于频繁DELETE的场景,可以考虑:

    • 全量DELETE修改为TRUNCATE或者使用临时表替代
    • 定期DELETE某时间段数据,使用分区表并使用TRUNCATE或DROP分区替代
  4. 使用物化视图优化查询性能:物化视图可以预先计算和存储查询结果,提高数据查询效率。GaussDB支持全量物化视图和增量物化视图两种类型。

05

最佳实践

结合实际案例,分享在电子商城等场景下的数据分布策略和优化经验。

在电子商城场景中,订单表和子订单表适合用分布表,支付方式表和快递公司表适合用复制表。通过合理选择数据分布策略,可以有效提升查询性能。

例如,对于订单表和子订单表,可以使用hash分布策略,选择订单ID作为分布列。对于支付方式表和快递公司表,由于数据量较小且查询频繁,可以使用replication分布策略。

通过以上方法,可以有效解决GaussDB中的数据倾斜问题,提升数据库性能和查询效率。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号