文档首页/ 数据仓库服务 GaussDB(DWS)/ 故障排除/ 集群性能/ 磁盘使用率高&集群只读处理方案
更新时间:2024-11-01 GMT+08:00

磁盘使用率高&集群只读处理方案

查看磁盘使用率

对于用户来说,DWS的磁盘使用率是一个非常需要关注的高价值资源,并且这个资源与集群的可用性息息相关。因此,当出现以下场景时,需要用户密切关注磁盘空间并做出相应的磁盘空间处置(以下磁盘均指数据磁盘)。

查看磁盘空间方法

  1. 登录DWS管理控制台,左侧单击“集群管理”,在集群列表中单击指定集群所在行右侧的“监控面板”进入到DMS监控界面。
  2. 选择“监控 > 节点监控 > 磁盘”,单击“磁盘使用率”右侧的进行排序,可查看当前集群各个节点的磁盘使用率。

    数据磁盘识别方法:一般根据容量进行查看,容量为购买容量的磁盘是数据盘

故障场景

日常处理作业中,DBA可以通过空间管控识别出一些异常业务,阻拦这些不合理的作业,以避免以上场景出现。

  1. 只读是DWS系统自我保护的一种机制,避免出现因为磁盘使用率达到100%,导致DWS实例无法正常启动,引发业务彻底中断的风险。
  2. 以上场景均会由DMS进行告警通告(告警阈值为80%,可自行配置,参见修改告警规则)。
  3. 以上场景一,可通过使用告警订阅功能,当磁盘超过70%或75%时给用户发送短信或邮件进行通知,以便提前进行数据清理,如何设置参见磁盘空间告警订阅

场景一:磁盘使用率高清理方式

根据数据表的查询结果,定期进行脏数据清理,不同版本方式不同,根据对应版本进行选择。

  • 8.1.3及以上版本:通过管理控制台“智能运维”功能进行自动清理
  1. 登录GaussDB(DWS) 管理控制台。
  2. 在集群列表中单击指定集群名称。
  3. 进入“集群详情”页面,切换至“智能运维”页签。
  4. 在运维详情部分切换至运维计划模块。单击“添加运维任务”按钮。

  5. 弹出添加运维任务边栏,

    • 运维任务选择“Vacuum”。
    • 调度模式选择“自动”,DWS将自动扫描Vacuum目标。
    • Vacuum目标选择系统表或用户表:
      • 如果用户业务UPDATE、DELETE较多,选择用户表。
      • 如果创建表、删除表较多,选择系统表。

  6. 单击“下一步:定时配置”,配置Vacuum类型,推荐选择“周期型任务”,GaussDB(DWS)将自动在自定义时间窗内执行Vacuum。

    对于自动Vacuum运维任务,系统对于用户表的处理方法实际采用的是VACUUM FULL操作。VACUUM FULL执行过程中,本身持有8级锁,会阻塞其他业务,导致锁冲突产生,业务本身会陷入锁等待,20分钟后超时报错。因此,在用户配置时间窗内,应尽量避开执行所有处理表的相关业务。

  7. 确认无误后,单击“下一步:配置确认”,完成配置。

  • 8.1.2及以前版本:手动执行VACUUM FULL进行清理。
    1. VACUUM FULL操作会锁表,VACUUM FULL期间,该表的所有访问会阻塞,并等待VACUUM FULL结束,请合理安排调度时间,避免锁表影响业务。
    2. VACUUM FULL是对当前表的有效数据抽出来重新整理,同时清理脏数据,该操作会临时占用额外的整理空间(这部分空间待整理完成后释放),因此空间会先增后降,请提前计算好VACUUM FULL所需要的空间再行处理(额外的整理空间大小=表大小* (1 – 脏页率))。
  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;
    

  2. 判断是否有回显结果。

    • 是,对于表大小超过10G的表,则执行3
    • 否,操作结束。

  3. 将脏页Top5的表,进行VACUUM FULL清理(清理时,如果最高磁盘空间>70%,请串行清理)。

    1
    VACUUM FULL ANALYZE schema.table_name;
    

  4. 如果无脏页率较高的表,并且磁盘使用率已经接近或者超过75%,根据以下数仓类型,对集群进行节点扩容或磁盘扩容,避免触发只读导致业务中断。

    • 云数仓+SSD云盘:参见磁盘扩容进行磁盘扩容。
    • 云数仓+SSD本地盘及旧的标准数仓(不支持磁盘扩容):请联系技术支持进行在线扩容

场景二:磁盘倾斜,倾斜表清理方式

倾斜表,针对单DN倾斜率>5%的表,建议对表进行重选分布列,并对数据进行重分布。

  • 倾斜表的危害:倾斜表可能引发算子计算/下盘倾斜严重,导致数据倾斜的DN处理压力过大,而无法发挥DWS的分布式计算的优势,影响业务性能,并且容易造成单DN磁盘满。
  • 8.1.3版本开始默认建表为轮询表(参见轮询表RoundRobin),如果不熟悉分布键,可以在建表时,使用ROUNDROBIN关键字,来降低业务开发难度(参见轮询表、哈希表适用场景)。
  1. 连接数据库,执行以下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执行无结果章节。

  2. 根据表的大小和倾斜率,将倾斜严重的表重新选择分布列,8.1.0及以上版本直接通过ALTER TABLE语法进行调整,其他版本参见如何调整分布列

场景三:集群只读

当集群单磁盘使用率超过90%时,系统会自动触发集群只读,此时继续执行写类型业务(DML或DDL)会出现类似报错“ERROR: cannot execute xxx in a read-only transaction.”。

集群只读是DWS对用户数据的一种自我保护机制,防止磁盘写满引发实例无法启动。

集群只读后,由于剩余空间较小,需要尽快通过DROP、TRUNCATE等操作清理无用数据,将空间降至80%以下。之后再处理场景一和场景二中的相关表,避免VACUUM FULL和倾斜处理引发磁盘使用率先增后降,导致磁盘写满。
  • 8.1.3及以上集群版本处理方法:
  1. 集群处于“只读”状态时,应立即停止写入任务,避免磁盘被写满造成数据丢失的风险。
  2. 使用客户端连接数据库,通过显示事务关闭只读,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;
    

    清理完成后,系统会自动解除只读。

  3. 排查场景一和场景二相关表,查看是否有需要整改的表,如果没有,建议尽快对集群进行扩容,根据数仓类型不同,分为节点扩容和磁盘扩容。

    • 云数仓+SSD云盘:参见磁盘扩容进行磁盘扩容。
    • 云数仓+SSD本地盘及旧的标准数仓(不支持磁盘扩容):请联系技术支持进行在线扩容

  • 8.1.2及以前集群版本处理方法:
  1. 集群处于“只读”状态时,应立即停止写入任务,避免磁盘被写满造成数据丢失的风险。
  2. 集群进入只读状态时,通过登录GaussDB(DWS) 管理控制台,解除只读状态。

    1. 登录GaussDB(DWS) 管理控制台。单击“集群管理”。默认显示用户所有的集群列表。
    2. 在集群列表中,在指定集群所在行的“操作”列,选择更多 > 解除只读

    3. 在弹出对话框中,单击“确定”,再次进行解除只读确认,对集群进行解除只读操作。

  3. 解除只读操作成功后,通过DROP/TRUNCATE清理相关的无用数据。尽量将磁盘使用率清理至80%以下。
  4. 排查场景一和场景二相关表,查看是否有需要整改的表,如果没有,建议尽快对集群进行扩容,根据数仓类型不同,分为节点扩容和磁盘扩容。

    • 云数仓+SSD云盘:参见磁盘扩容进行磁盘扩容。
    • 云数仓+SSD本地盘及旧的标准数仓(不支持磁盘扩容):请联系技术支持进行在线扩容

单语句空间管控

GaussDB(DWS)支持语句磁盘空间管控相关的参数sql_use_spacelimit和temp_file_limit,用于业务运行时,避免由于不合理的数据量,引发磁盘空间暴增,触发告警/只读,主动识别不合理的大批量倒数业务或者高数据量入库业务。

  1. 登录DWS控制台,左侧单击“集群管理”,在集群列表中单击指定集群,进入集群详情页面。
  2. 单击“参数修改”,搜索栏中搜索sql_use_spacelimit和temp_file_limit(参见磁盘空间),根据业务进行调整。

    建议设置sql_use_spacelimit为实例所在磁盘空间总容量的10%(例如购买时空间为100G/每节点,则配置该参数为10G)。
    上述配置生效后,如果单语句运行过程中超过该配置参数,则SQL语句会被主动中止。如需临时放开,可以在session会话中执行以下语句进行临时关闭。
    1
    SET sql_use_spacelimit=0;
    

磁盘空间告警订阅

为了减轻客户自行的运维压力,DWS提供了告警订阅的功能:即当集群的磁盘使用率大于设置的阈值时,系统会以短信、邮件形式通知到用户。

  1. 设置告警阈值:

    1. 登录DWS控制台,左侧选择“告警管理”,单击“告警规则管理”。

    2. 在告警规则列表中,单击“节点数据盘使用率超阈值”右侧的“修改”。
    3. 在集群列表中单击指定集群,进入集群详情页面。告警策略设置如下:
      • 规则绑定集群:所有集群
      • 告警策略:将数据盘的重要告警配置为70%,持续10分钟,紧急告警配置为75%,持续10分钟。如下设置:

  2. 在消息通知服务(SMN)创建主题。

    1. 切换到消息通知服务控制台,单击“创建主题”。如下设置“主题名称”和“企业项目”。

    2. 主题创建成功后,单击右侧的“添加订阅”。根据需要选择“短信”、“邮件”方式,订阅终端输入对应的手机号或邮箱地址。

    3. 输入的手机号或邮箱地址会收到确认短信或邮件,单击确认,即可完成订阅。

  3. 添加告警订阅。

    1. 回到DWS控制台,左侧选择“告警管理”,切换到“订阅”,单击“创建订阅”。
    2. 订阅名称输入“dms_alarm”,告警级别选择“紧急”、“重要”,消息通知主题名称选择上一步创建的主题“dms_alarm”。

    3. 单击“确认”。整个告警订阅成功,后续磁盘使用率大于70%和75%则发出通知。