磁盘使用率高&集群只读处理方案
查看磁盘使用率
对于用户来说,DWS的磁盘使用率是一个非常需要关注的高价值资源,并且这个资源与集群的可用性息息相关。因此,当出现以下场景时,需要用户密切关注磁盘空间并做出相应的磁盘空间处置(以下磁盘均指数据磁盘)。
查看磁盘空间方法:
- 登录DWS管理控制台,左侧单击“集群管理”,在集群列表中单击指定集群所在行右侧的“监控面板”进入到DMS监控界面。
- 选择“监控 > 节点监控 > 磁盘”,单击“磁盘使用率”右侧的进行排序,可查看当前集群各个节点的磁盘使用率。
数据磁盘识别方法:一般根据容量进行查看,容量为购买容量的磁盘是数据盘
故障场景
- 场景一:磁盘使用率过高,当前集群所有磁盘或超过半数以上的磁盘使用率>=70%。
- 场景二:磁盘倾斜,使用率最高的磁盘和最低的磁盘使用率之差>=10%。
- 场景三:集群只读,当前只读阈值为单数据盘使用率>=90%。
日常处理作业中,DBA可以通过空间管控识别出一些异常业务,阻拦这些不合理的作业,以避免以上场景出现。
场景一:磁盘使用率高清理方式
根据数据表的查询结果,定期进行脏数据清理,不同版本方式不同,根据对应版本进行选择。
- 8.1.3及以上版本:通过管理控制台“智能运维”功能进行自动清理。
- 登录GaussDB(DWS) 管理控制台。
- 在集群列表中单击指定集群名称。
- 进入“集群详情”页面,切换至“智能运维”页签。
- 在运维详情部分切换至运维计划模块。单击“添加运维任务”按钮。
- 弹出添加运维任务边栏,
- 单击“下一步:定时配置”,配置Vacuum类型,推荐选择“周期型任务”,GaussDB(DWS)将自动在自定义时间窗内执行Vacuum。
对于自动Vacuum运维任务,系统对于用户表的处理方法实际采用的是VACUUM FULL操作。VACUUM FULL执行过程中,本身持有8级锁,会阻塞其他业务,导致锁冲突产生,业务本身会陷入锁等待,20分钟后超时报错。因此,在用户配置时间窗内,应尽量避开执行所有处理表的相关业务。
- 确认无误后,单击“下一步:配置确认”,完成配置。
- 8.1.2及以前版本:手动执行VACUUM FULL进行清理。
- VACUUM FULL操作会锁表,VACUUM FULL期间,该表的所有访问会阻塞,并等待VACUUM FULL结束,请合理安排调度时间,避免锁表影响业务。
- VACUUM FULL是对当前表的有效数据抽出来重新整理,同时清理脏数据,该操作会临时占用额外的整理空间(这部分空间待整理完成后释放),因此空间会先增后降,请提前计算好VACUUM FULL所需要的空间再行处理(额外的整理空间大小=表大小* (1 – 脏页率))。
- 连接数据库,执行以下SQL语句查询脏页率超过30%的较大表,并且按照表大小从大到小排序。
1 2 3 4 5
SELECT schemaname AS schema, relname AS table_name, n_live_tup AS analyze_count, pg_size_pretty(pg_table_size(relid)) as table_size, dirty_page_rate FROM PGXC_GET_STAT_ALL_TABLES WHERE schemaName NOT IN ('pg_toast', 'pg_catalog', 'information_schema', 'cstore', 'pmk') AND dirty_page_rate > 30 ORDER BY table_size DESC, dirty_page_rate DESC;
- 判断是否有回显结果。
- 是,对于表大小超过10G的表,则执行3。
- 否,操作结束。
- 将脏页Top5的表,进行VACUUM FULL清理(清理时,如果最高磁盘空间>70%,请串行清理)。
1
VACUUM FULL ANALYZE schema.table_name;
- 如果无脏页率较高的表,并且磁盘使用率已经接近或者超过75%,根据以下数仓类型,对集群进行节点扩容或磁盘扩容,避免触发只读导致业务中断。
场景二:磁盘倾斜,倾斜表清理方式
倾斜表,针对单DN倾斜率>5%的表,建议对表进行重选分布列,并对数据进行重分布。
- 倾斜表的危害:倾斜表可能引发算子计算/下盘倾斜严重,导致数据倾斜的DN处理压力过大,而无法发挥DWS的分布式计算的优势,影响业务性能,并且容易造成单DN磁盘满。
- 8.1.3版本开始默认建表为轮询表(参见轮询表RoundRobin),如果不熟悉分布键,可以在建表时,使用ROUNDROBIN关键字,来降低业务开发难度(参见轮询表、哈希表适用场景)。
- 连接数据库,执行以下SQL语句查询倾斜表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
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.gs_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 IN('H', 'N') GROUP BY schemaname,tablename ) SELECT schemaname, tablename, totalsize, avgsize::numeric(1000), (maxsize/totalsize)::numeric(4,3) AS maxratio, (minsize/totalsize)::numeric(4,3) AS minratio, skewsize, (skewsize/avgsize)::numeric(4,3) AS skewratio, skewstddev::numeric(1000) FROM skew WHERE totalsize > 0;
有关查询倾斜表的详细内容,可参考数据倾斜导致SQL执行慢,大表SQL执行无结果章节。
- 根据表的大小和倾斜率,将倾斜严重的表重新选择分布列,8.1.0及以上版本直接通过ALTER TABLE语法进行调整,其他版本参见如何调整分布列。
场景三:集群只读
当集群单磁盘使用率超过90%时,系统会自动触发集群只读,此时继续执行写类型业务(DML或DDL)会出现类似报错“ERROR: cannot execute xxx in a read-only transaction.”。
集群只读是DWS对用户数据的一种自我保护机制,防止磁盘写满引发实例无法启动。
- 8.1.3及以上集群版本处理方法:
- 集群处于“只读”状态时,应立即停止写入任务,避免磁盘被写满造成数据丢失的风险。
- 使用客户端连接数据库,通过显示事务关闭只读,DROP/TRUNCATE TABLE清理无用数据,尽量将磁盘使用率清理至80%以下。
清理数据方式1:
1 2 3
START TRANSACTION READ WRITE; drop/truncate table table_name; COMMIT;
清理数据方式2:1 2 3 4
START TRANSACTION; SET transaction_read_only=off; drop/truncate table table_name; COMMIT;
清理完成后,系统会自动解除只读。
- 排查场景一和场景二相关表,查看是否有需要整改的表,如果没有,建议尽快对集群进行扩容,根据数仓类型不同,分为节点扩容和磁盘扩容。
- 8.1.2及以前集群版本处理方法:
- 集群处于“只读”状态时,应立即停止写入任务,避免磁盘被写满造成数据丢失的风险。
- 集群进入只读状态时,通过登录GaussDB(DWS) 管理控制台,解除只读状态。
- 解除只读操作成功后,通过DROP/TRUNCATE清理相关的无用数据。尽量将磁盘使用率清理至80%以下。
- 排查场景一和场景二相关表,查看是否有需要整改的表,如果没有,建议尽快对集群进行扩容,根据数仓类型不同,分为节点扩容和磁盘扩容。
单语句空间管控
GaussDB(DWS)支持语句磁盘空间管控相关的参数sql_use_spacelimit和temp_file_limit,用于业务运行时,避免由于不合理的数据量,引发磁盘空间暴增,触发告警/只读,主动识别不合理的大批量倒数业务或者高数据量入库业务。
- 登录DWS控制台,左侧单击“集群管理”,在集群列表中单击指定集群,进入集群详情页面。
- 单击“参数修改”,搜索栏中搜索sql_use_spacelimit和temp_file_limit(参见磁盘空间),根据业务进行调整。
建议设置sql_use_spacelimit为实例所在磁盘空间总容量的10%(例如购买时空间为100G/每节点,则配置该参数为10G)。上述配置生效后,如果单语句运行过程中超过该配置参数,则SQL语句会被主动中止。如需临时放开,可以在session会话中执行以下语句进行临时关闭。
1
SET sql_use_spacelimit=0;