
# 磁盘使用率高\&集群只读处理方案
#### 查看磁盘使用率
对于用户来说，DWS的磁盘使用率是一个非常需要关注的高价值资源，并且这个资源与集群的可用性息息相关。因此，当出现以下场景时，需要用户密切关注磁盘空间并做出相应的磁盘空间处置（以下磁盘均指数据磁盘）。
**查看磁盘空间方法**：
1. 登录[DWS控制台](https://console.huaweicloud.com/dws)，左侧单击"集群列表"，在集群列表中单击指定集群所在行右侧的"监控面板"进入到DMS监控界面。
2. 选择"监控 \> 节点监控 \> 磁盘"，单击"磁盘使用率"右侧的![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000001393399197.png)进行排序，可查看当前集群各个节点的磁盘使用率。
   
   数据磁盘识别方法：一般根据容量进行查看，容量为购买容量的磁盘是数据盘。
   ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000001393559137.png "点击放大")
   
   
   
 
#### 故障场景
- [场景一：磁盘使用率过高]，当前集群所有磁盘或超过半数以上的磁盘使用率\>=70%。
- [场景二：磁盘倾斜]，使用率最高的磁盘和最低的磁盘使用率之差\>=10%。
- [场景三：集群只读]，当前只读阈值为单数据盘使用率\>=90%。
日常处理作业中，DBA可以通过[空间管控]识别出一些异常业务，阻拦这些不合理的作业，以避免以上场景出现。
![](https://support.huaweicloud.com/trouble-dws/public_sys-resources/notice_3.0-zh-cn.png)
1. 只读是DWS系统自我保护的一种机制，避免出现因为磁盘使用率达到100%，导致DWS实例无法正常启动，引发业务彻底中断的风险。
2. 以上场景均会由DMS进行告警通告（告警阈值为80%，可自行配置，参见[修改告警规则](https://support.huaweicloud.com/mgtg-dws/dws_01_1242.html#section2)）。
3. 以上场景一，可通过使用告警订阅功能，当磁盘超过70%或75%时给用户发送短信或邮件进行通知，以便提前进行数据清理，如何设置参见[磁盘空间告警订阅]。
 
 #### 场景一：磁盘使用率高清理方式
根据数据表的查询结果，定期进行**脏数据**清理，不同版本方式不同，根据对应版本进行选择。
- **8.1.3及以上版本：通过管理控制台"智能运维"功能进行自动清理**。
1. 登录[DWS控制台](https://console.huaweicloud.com/dws)。
2. 在集群列表中单击指定集群名称。
3. 进入"集群详情"页面，切换至"智能运维"页签。
4. 在运维详情部分切换至运维计划模块。单击"添加运维任务"按钮。 
   ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000001389255541.png "点击放大")
   
   
5. 弹出添加运维任务边栏。 
   - 运维任务选择"Vacuum"。
   
   - 调度模式选择"自动"，DWS将自动扫描Vacuum目标。
   
   - Vacuum目标选择系统表或用户表：
     - 如果用户业务UPDATE、DELETE较多，选择用户表。
     
     - 如果创建表、删除表较多，选择系统表。 ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000002350860392.png "点击放大")
       
      
   
   
   
   
6. 单击"下一步：定时配置"，配置Vacuum类型，推荐选择"周期型任务"，DWS将自动在自定义时间窗内执行Vacuum。 
   ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000002350861052.png "点击放大")
   ![](https://support.huaweicloud.com/trouble-dws/public_sys-resources/note_3.0-zh-cn.png)
   对于自动Vacuum运维任务，系统对于用户表的处理方法实际采用的是VACUUM FULL操作。VACUUM FULL执行过程中，本身持有8级锁，会阻塞其他业务，导致锁冲突产生，业务本身会陷入锁等待，20分钟后超时报错。因此，在用户配置时间窗内，应尽量避开执行所有涉及处理表的业务。
   
   
7. 确认无误后，单击"下一步：配置确认"，完成配置。
- **8.1.2及以前版本：手动执行VACUUM FULL进行清理。**
  ![](https://support.huaweicloud.com/trouble-dws/public_sys-resources/notice_3.0-zh-cn.png)
  1. VACUUM FULL操作**会锁表，**VACUUM FULL期间，该表的所有访问会阻塞，并等待VACUUM FULL结束，请合理安排调度时间，避免锁表影响业务。
  
  2. VACUUM FULL是对当前表的有效数据抽出来重新整理，同时清理脏数据，该操作会临时占用**额外的** **整理空间** （这部分空间待整理完成后释放），因此空间会先增后降，请提前计算好VACUUM FULL所需要的空间再行处理（**额外的整理空间大小** **=** **表大小\* (1-脏页率)**）。
    
1. 连接数据库，执行以下SQL语句查询脏页率超过30%的较大表，并且按照表大小从大到小排序。 
   ```
   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%，请串行清理）。
   
   ```
   VACUUM FULL ANALYZE schema.table_name;
   ```
   
   
4. 如果无脏页率较高的表，并且磁盘使用率已经接近或者超过75%，根据以下数仓类型，对集群进行节点扩容或磁盘扩容，避免触发只读导致业务中断。 
   - 云数仓+SSD云盘：参见[磁盘扩容](https://support.huaweicloud.com/mgtg-dws/dws_01_0828.html)进行磁盘扩容。
   
   - 云数仓+SSD本地盘及旧的标准数仓(不支持磁盘扩容)：请联系技术支持进行[在线扩容](https://support.huaweicloud.com/mgtg-dws/dws_01_0023.html)。
   
   
   
   
 
 #### 场景二：磁盘倾斜，倾斜表清理方式
**倾斜表，** 针对单DN倾斜率\>5%的表，建议对表进行重选**分布列** ，并对数据进行**重分布。**
![](https://support.huaweicloud.com/trouble-dws/public_sys-resources/notice_3.0-zh-cn.png)
- 倾斜表的危害：倾斜表可能引发算子计算/下盘倾斜严重，导致数据倾斜的DN处理压力过大，而无法发挥DWS的分布式计算的优势，影响业务性能，并且容易造成单DN磁盘满。
- 8.1.3版本开始默认建表为轮询表（参见[轮询表RoundRobin](https://support.huaweicloud.com/bestpractice-dws/dws_05_0076.html#section2)），如果不熟悉分布键，可以在**建表** 时，使用ROUNDROBIN关键字，来降低业务开发难度（参见[轮询表、哈希表适用场景](https://support.huaweicloud.com/bestpractice-dws/dws_05_0076.html#section2)）。
 
1. 连接数据库，执行以下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.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执行无结果](https://support.huaweicloud.com/trouble-dws/dws_09_0072.html)章节。
   
   
2. 根据表的大小和倾斜率，将倾斜严重的表重新选择分布列，8.1.0及以上版本直接通过ALTER TABLE语法进行调整，其他版本参见[如何调整分布列](https://support.huaweicloud.com/dws_faq/dws_03_2126.html)。
 #### 场景三：集群只读
当集群单磁盘使用率超过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：
   ```
   START TRANSACTION READ WRITE;
   drop/truncate table table_name;
   COMMIT;
   ```
   清理数据方式2：
   ```
   START TRANSACTION;
   SET transaction_read_only=off;
   drop/truncate table table_name;
   COMMIT;
   ```
   清理完成后，系统会自动解除只读。
   
   
3. 排查场景一和场景二相关表，查看是否有需要整改的表，如果没有，建议尽快对集群进行扩容，根据数仓类型不同，分为节点扩容和磁盘扩容。 
   - 云数仓+SSD云盘：参见[磁盘扩容](https://support.huaweicloud.com/mgtg-dws/dws_01_0828.html)进行磁盘扩容。
   
   - 云数仓+SSD本地盘及旧的标准数仓(不支持磁盘扩容)：请联系技术支持进行[在线扩容](https://support.huaweicloud.com/mgtg-dws/dws_01_0023.html)。
   
   
   
   
- **8.1.2及以前集群版本处理方法：**
1. 集群处于"只读"状态时，应立即停止写入任务，避免磁盘被写满造成数据丢失的风险。
2. 集群进入只读状态时，通过控制台，解除只读状态。 
   1. 登录[DWS控制台](https://console.huaweicloud.com/dws)。单击"集群列表"。默认显示用户所有的集群列表。
   
   2. 在集群列表中，在指定集群所在行的"操作"列，选择"更多 \> 解除只读"。 ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000001343729290.png "点击放大")
      
      
   
   3. 在弹出对话框中，单击"确定"，再次进行解除只读确认，对集群进行解除只读操作。
      ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000001394409149.png "点击放大")
      ![](https://support.huaweicloud.com/trouble-dws/public_sys-resources/note_3.0-zh-cn.png)
      解除只读支持1.7.2及8.0.1/8.1.x及以上版本。
      
   
   
   
   
3. 解除只读操作成功后，通过DROP/TRUNCATE清理相关的无用数据。尽量将磁盘使用率清理至80%以下。
4. 排查场景一和场景二相关表，查看是否有需要整改的表，如果没有，建议尽快对集群进行扩容，根据数仓类型不同，分为节点扩容和磁盘扩容。 
   - 云数仓+SSD云盘：参见[磁盘扩容](https://support.huaweicloud.com/mgtg-dws/dws_01_0828.html)进行磁盘扩容。
   
   - 云数仓+SSD本地盘及旧的标准数仓(不支持磁盘扩容)：请联系技术支持进行[在线扩容](https://support.huaweicloud.com/mgtg-dws/dws_01_0023.html)。
   
   
   
   
 
 #### 单语句空间管控
DWS支持语句磁盘空间管控相关的参数sql_use_spacelimit和temp_file_limit，用于业务运行时，避免由于不合理的数据量，引发磁盘空间暴增，触发告警/只读，主动识别不合理的大批量倒数业务或者高数据量入库业务。
1. 登录[DWS控制台](https://console.huaweicloud.com/dws)，左侧单击"集群列表"，在集群列表中单击指定集群，进入集群详情页面。
2. 单击"参数修改"，搜索栏中搜索sql_use_spacelimit和temp_file_limit（参见[磁盘空间](https://support.huaweicloud.com/devg-dws/dws_04_0894.html)），根据业务进行调整。
   
   建议设置sql_use_spacelimit为实例所在磁盘空间总容量的10%（例如购买时空间为100G/每节点，则配置该参数为10G）。
   ![](https://support.huaweicloud.com/trouble-dws/public_sys-resources/notice_3.0-zh-cn.png)
   上述配置生效后，如果单语句运行过程中超过该配置参数，则SQL语句会被主动中止。如需临时放开，可以在session会话中执行以下语句进行临时关闭。
   ```
   SET sql_use_spacelimit=0;
   ```
   
   
 
 #### 磁盘空间告警订阅
为了减轻客户自行的运维压力，DWS提供了告警订阅的功能：即当集群的磁盘使用率大于设置的阈值时，系统会以短信、邮件形式通知到用户。
1. 设置告警阈值： 
   1. 登录[DWS控制台](https://console.huaweicloud.com/dws)，左侧选择"监控 \> 告警"，单击"告警规则管理"。
      
      
      
   
   2. 在告警规则列表中，单击"**节点数据盘使用率超阈值**"右侧的"修改"。
   
   3. 在集群列表中单击指定集群，进入集群详情页面。告警策略设置如下：
      - 规则绑定集群：所有集群
      
      - 告警策略：将数据盘的重要告警配置为70%，持续10分钟，紧急告警配置为75%，持续10分钟。如下设置：
      
      
      ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000001394482801.png "点击放大")
      
      
   
   
   
   
2. 在消息通知服务(SMN)创建主题。 
   1. 切换到消息通知服务控制台，单击"创建主题"。如下设置"主题名称"和"企业项目"。 ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000001344580298.png "点击放大")
      
      
   
   2. 主题创建成功后，单击右侧的"添加订阅"。根据需要选择"短信"、"邮件"方式，订阅终端输入对应的手机号或邮箱地址。 ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000001344747486.png "点击放大")
      
      
   
   3. 输入的手机号或邮箱地址会收到确认短信或邮件，单击确认，即可完成订阅。
   
   
   
   
3. 添加告警订阅。 
   1. 回到DWS控制台，左侧选择"监控 \> 告警"，切换到"订阅"，单击"创建订阅"。
   
   2. 订阅名称输入"dms_alarm"，告警级别选择"紧急"、"重要"，消息通知主题名称选择上一步创建的主题"dms_alarm"。 ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000001344263594.png "点击放大")
      
      
   
   3. 单击"确认"。整个告警订阅成功，后续磁盘使用率大于70%和75%则发出通知。
   
   
   
   
 
