文档首页/ 数据仓库服务 DWS/ 最佳实践/ 集群管理及资源负载监控/ 存算分离场景下按需弹性VW:高性价比地适应灵活多变的业务需求
更新时间:2025-11-26 GMT+08:00
分享

存算分离场景下按需弹性VW:高性价比地适应灵活多变的业务需求

本章节演示存算分离场景下,使用DWS的增删弹性计算组Virtual Warehouse(以下简称 VW)功能,实现VW按业务高低峰进行自动扩缩容,实现VW按需消费,为企业降本增效。

学习本实践流程如下:

  1. 了解自动弹性VW的背景信息。
  2. 了解主VW、弹性VW、手动增加弹性VW和自动弹性VW。
  3. 根据业务场景,选择不同场景下对应的弹性VW模式。

本实践仅9.1.1.100及以上版本的存算分离集群支持。

背景信息

随着公司业务的快速发展,数据库扩容已成为支撑业务规模扩张的业界通用解决方案。从长期时间维度来看,基于业务负载趋势的定量扩容(如图1所示)能够有效支撑更高的业务并发量,是应对业务增长的成熟方案。

图1 传统扩容模式

但在更细粒度的时间维度(如按周、按日)下,传统扩容模式往往通过资源超配来应对业务负载的波动,这一方式存在显著的资源浪费问题。以图2所示场景为例:公司数据中台团队每日凌晨 0 点至 6 点执行 ETL 作业,完成大批量数据的离线导入;而业务团队的作业负载则呈现无规律的波动特征。在此情况下,传统扩容的资源超配模式会造成大量计算资源闲置,显著增加企业的资源使用成本。

图2 不同业务负载下的作业场景

理想状态下,若数据库能够根据负载波动自动实现弹性扩缩容,按需调整资源配置,将大幅降低资源浪费、节约使用成本(如图3所示)。为实现更灵活、低成本的数据库扩缩容,数据库系统可配置基础资源规格以满足日常作业负载需求,同时在业务负载高峰期快速扩容,保障业务稳定运行。DWS 存算分离版本恰好实现了上述按需弹性扩缩容能力,可有效适配细粒度时间维度的负载波动,通过主动、按需弹性扩容资源,保障短期负载爆发场景下的业务稳定性。

图3 随业务负载弹性扩缩容

固定资源池(主VW)和弹性资源池(弹性VW)介绍

图4所示,DWS存算分离版本存在两个核心逻辑概念:固定资源池弹性资源池

  • 固定资源池

    固定资源池通过部署多个固定计算组Virtual Warehouse(以下简称 VW)适配业务需求,这些固定VW又称为主VW,VW作为动态分配的计算资源集群,支持不同业务绑定不同的专属VW,实现业务间的负载隔离。在MPP架构下,主VW的规格直接决定单条SQL语句的处理上限及系统可承载的QPS峰值;因此主VW适用于承接负载稳定、对时延要求低的作业场景。DWS提供分VW的水平扩展能力,可通过扩充节点资源满足业务规模扩张的需求,管理员需基于长期负载变化趋势,提前规划主 VW 的规格。

  • 弹性资源池

    弹性资源池适用于细粒度时间维度的负载波动场景,包含一个或多个弹性VW。弹性 VW 采用“存储 - 计算解耦”架构:存储层基于OBS构建shared storage架构,计算层则为shared nothing架构,这一设计实现了计算与存储的分层独立扩展——计算节点扩容无需进行数据重分布,存储资源可按需弹性扩展,从而支持存储容量的无限扩展。同时,弹性VW与 主VW之间支持实时数据共享,可解决元数据实时同步问题,避免元数据刷新滞后,确保弹性VW能基于最新元数据执行作业。

图4 VW介绍

场景选择:关于手动弹性VW和自动弹性VW

DWS提供弹性资源池的两种使用方式,分别为手动弹性自动弹性,可覆盖各类按需弹性扩缩容场景。

  • 手动弹性

    适用于对自身业务负载特性充分了解的客户,尤其适配负载呈周期性波动、且波动期间以大查询为主的场景(例如周期性跑批作业)。客户可基于已知的负载周期规律,手动触发弹性资源的扩容与缩容,精准匹配业务需求。

    其中手动弹性,按照在控制台上配置方式不同,还可以划分为用户绑定方式比例路由方式

    图5 手动弹性VW
  • 自动弹性

    面向无需深入理解业务负载特性的客户(含新手用户),支持全流程无人工干预的智能弹性调度,客户可直接享受 “按资源使用付费(Pay by Resource)”的成本优化能力。该模式尤其适合复杂查询占比高、作业负载为数十分钟至小时级突发(burst)的场景,系统可自动识别负载峰值并快速扩容,负载回落时自动缩容,兼顾业务稳定性与资源利用率。

    示例请参见场景三:使用自动弹性模式,用户零干预,实现弹性资源的自动驾驶

约束限制

  • 仅9.1.1.100及以上版本的存算分离集群支持
  • 细粒度快照开关开启下,不支持创建弹性VW,请先关闭细粒度快照开关,参见创建与管理DWS手动快照

场景一:使用用户绑定模式手动创建弹性VW,弹性VW均用于承接ETL负载

图6所示,公司的数据中台团队在每天的凌晨0点到6点执行ETL操作,假设,有两个ETL执行用户user1和user2,负责完成大数据量的离线导入,ETL负载存在两个阶跃式的增长。

在手动弹性的帮助下,DWS在0点时会定时准备好弹性VW 1以消费第一阶段的负载增长,而在凌晨4点又由于负载再次增加,仍会定时准备弹性VW 2来满足第二阶段的负载突发。

数据导入大约持续到6点,DWS会定时回收2个手动弹性VW。在此过程中,客户只需要额外为零点到6点这段时间额外付费,无需要对主VW进行资源超配,降低成本

图6 手动弹性VW场景
  1. 参见创建DWS存算分离集群,创建DWS存算分离集群,并已创建user1、user2作业用户。
  2. 在DWS控制台,左侧导航栏中,选择“专属集群 > 集群列表”。
  3. 在集群列表中,单击指定集群名称,进入“集群详情”页面。
  4. 在上侧导航栏切换至“逻辑集群管理”页面,单击“添加增删计划”。
  5. 按以下参数配置,创建VW1,绑定用户user1。

    表1 创建VW1

    参数

    取值

    计划类型

    周期性

    集群名称

    VW1

    绑定主逻辑集群

    不选择

    绑定用户

    user1

    节点数

    3

    起止时间

    选定执行ETL的窗口期,例如1~3个月

    周期类型

    每星期

    时间配置

    • 创建完成时间全选,00:00
    • 开始删除时间全选,06:00
    图7 创建VW1绑定用户

  6. 重复5,创建VW2,绑定用户user2。时间配置为:

    • 创建完成时间全选,04:00
    • 开始删除时间全选,06:00

  7. 如果想查询用户与VW的绑定关系,可以查询pg_user的nodegroup列。

    1. 查看用户绑定的弹性VW。
      1
      SELECT usename, nodegroup from pg_user where usename= 'user1';
      
    2. 查看弹性VW绑定的用户。
      1
      SELECT usename, nodegroup from pg_user where nodegroup='VW1'; 
      

通过以上步骤配置后,在凌晨0点~6点,user1执行的作业将在对应VW1完成。在凌晨4点~6点,user2执行的作业将在对应VW2完成。

6点后,VW1和VW1自动删除,节省成本。

图8 绑定用户模式

场景二:不绑定用户,使用比例路由方式手动创建弹性VW,将主VW的作业卸载一部分到弹性VW上执行

我们仍然以数据中台团队为例,介绍比例路由方式的案例。在创建弹性VW时,不绑定给用户,而绑定到主逻辑集群。

数据中台业务用户user1绑定主VW v3_logical,user2绑定主VW v3_logical_2。两个用户提交的作业既包含ETL负载,也包括一些DML业务处理负载。

在每日的凌晨0点到6点,ETL负载变高,团队管理员在DWS控制台创建VW1,设置为周期性,每天0点创建,6点删除,且绑定主逻辑集群设置为v3_logical。

  1. 参见创建DWS存算分离集群,创建DWS存算分离集群。
  2. 添加第二套主VW,命名为v3_logical_2。

    1. 在DWS控制台,左侧导航栏中,选择“专属集群 > 集群列表”。
    2. 在集群列表中,单击指定集群名称,进入“集群详情”页面。
    3. 在上侧导航栏切换至“逻辑集群管理”页面,单击“添加逻辑集群”。
    4. 添加第二套主VW v3_logical_2,如果没有可选节点,先进行节点扩容。

  3. 创建用户user1和user2,分别绑定主VW v3_logical和主VW v3_logical_2。

    1
    2
    CREATE USER user1 NODE GROUP "v3_logical" PASSWORD '{password}';
    CREATE USER user2 NODE GROUP "v3_logical_2" PASSWORD '{password}';
    

  4. 回到“逻辑集群管理”页面,单击“添加增删计划”。
  5. 按以下参数配置,创建VW1,并绑定到主VW v3_logical中,此时VW1为专用弹性VW

    表2 创建VW1

    参数

    取值

    计划类型

    周期性

    集群名称

    VW1

    绑定主逻辑集群

    v3_logical

    绑定用户

    不选择。

    节点数

    3

    起止时间

    选定执行ETL的窗口期,例如1~3个月

    周期类型

    每星期

    时间配置

    • 创建完成时间全选,00:00
    • 开始删除时间全选,06:00
    图9 创建VW1绑定主逻辑集群
    图10 创建VW1绑定主逻辑集群

  6. 执行以下SQL,配置dedicated卸载策略,将主VW的作业卸载到专用弹性VW中,比例是60%,即60%的作业会到弹性VW1中执行,如图11所示。

    有关更多offloading_strategy、offloading_rate的介绍,请参见ALTER NODE GROUP

    ALTER NODE GROUP v3_logical SET offloading_strategy TO dedicated; 
    ALTER NODE GROUP v3_logical SET offloading_rate TO 60;
    图11 专用弹性VW1

  7. 后续团队发现,由于user1提交的作业负载太高,一个弹性VW仍然不能满足需求,而且,user2提交的作业负载也需要卸载一部分到弹性VW执行。

    但是出于经济成本考量,再额外新建2个弹性VW成本很高。最好的方式是新建一个弹性VW2,能同时处理user1和user2的作业

    此时,团队可以选择elastic路由策略

    1. 参见4~5,再创建第二个弹性VW,但是不绑定用户,也不绑定主逻辑集群,即VW2为公用弹性VW
    2. 执行以下DDL语句,将主VW v3_logical、v3_logical_2的卸载策略调整成elastic,即主VW的作业可以卸载到专用弹性VW公用弹性VW中。
      1
      2
      3
      4
      ALTER NODE GROUP v3_logical set offloading_strategy TO elastic; 
      ALTER NODE GROUP v3_logical_2 set offloading_strategy TO elastic; 
      ALTER NODE GROUP v3_logical set offloading_rate TO 60; 
      ALTER NODE GROUP v3_logical_2 set offloading_rate TO 20;
      

    经过设置后,如图12所示,user1提交的40%作业在主VW v3_logical执行,剩余60%按Round Robin(轮询)方式拆分一部分30%在专用弹性VW1执行,另一部分30%在公用弹性VW2执行。user2提交的80%作业仍然在主VW v3_logical_2执行,而20%作业在公用弹性VW2执行。

    即图中绿色部分为公用弹性VW,user1和user2的部分作业都卸载到该VW执行。

    图12 公用弹性VW2

场景三:使用自动弹性模式,用户零干预,实现弹性资源的自动驾驶

在很多业务环境中,并不是所有的负载都可以总结出具体的周期性规律,业务负载的随机性也是一个常见的业务场景。在业务负载随机的场景下,手动弹性并不是最好的解决方案,本质上将会退化为资源预留的方式,因为客户也无法预知在何时创建及回收弹性VW。

为解决这一痛点,自动弹性VW功能应运而生,其核心设计锚定负载随机性场景,通过系统被动式触发机制实现弹性VW的智能调度:系统实时监控作业排队队列,当负载突发导致作业堆积时(如图13所示),会自动创建弹性 VW 来分担计算压力,利用额外弹性资源快速消化排队作业,避免对核心业务的稳定性造成影响,同时有效提升集群整体并发处理能力;当负载回落至主 VW 可承载的范围时,系统会自动回收冗余的弹性 VW,杜绝资源闲置带来的额外计费。

整个自动弹性过程无需人工干预,既能通过动态资源调度降本增效、提升集群吞吐量,又能全程保障业务在负载波动下的稳定性,是应对随机负载场景的最优解。

图13 自动弹性VW

展开来说,图14中的负载存在明显激突特点,且无明显规律。

在自动弹性的帮助下,t1时刻会自动创建弹性VW1,并于t2时刻销毁弹性VW1。

在第二轮的负载激突中,由于负载峰值比较高,t3时刻创建一个新的弹性VW1并不能满足需求,DWS会根据负载情况自动创建弹性VW2。等待负载降低后,分别在t5和t6时刻分别回收了弹性VW2和弹性VW1。

在此过程中,用户全程无需参与,DWS会自动将突发的负载路由到弹性VW上执行。

图14 负载明显波动场景
  • 当前DWS自动创建的弹性VW的节点数量与主VW一致,不支持配置。当前DWS的自动弹性创建时间大约需要4~5分钟,如果集群作业排队数量非常短暂,可能会出现弹性VW弹出滞后的问题,所以建议集群作业排队持续10分钟以上使用自动弹性
  • 自动弹性规格默认如下,支持在控制台修改,详细GUC参见自动弹性VW相关GUC参数
    • 在主VW的排队作业个数超过10个,则自动触发创建弹性VW。
    • 每个主VW支持自动创建最大的弹性VW个数为5个。
    • 每个自动弹性VW能够执行的最大作业并发数为60。
    • 自动弹性创建出来的VW空闲时间超过5分钟,则会自动回收。
  1. 参见创建DWS存算分离集群,创建DWS存算分离集群。
  2. 在DWS控制台,左侧导航栏中,选择“专属集群 > 集群列表”。
  3. 在集群列表中,单击指定集群名称,进入“集群详情”页面。
  4. 在上侧导航栏切换至“逻辑集群管理”页面,将“自动弹性开关”打开。

    图15 打开自动弹性VW

  5. 开启自动弹性开关后,执行SQL语句创建并设置资源池,并为资源池绑定用户,使指定资源池开启自动弹性能力。其中poolg为资源池名称,可以自行定义。

    其中,GUC参数enable_concurrency_scaling控制资源池是否开启弹性并发扩展功能。
    1
    2
    3
    4
    5
    6
    7
    8
     ---创建新的作业资源池,也可以复用已有资源池
    CREATE RESOURCE POOL "poolg" WITH(nodegroup = 'v3_logical');
    
    ---建立资源池和用户的绑定关系
    ALTER USER "user1" WITH RESOURCE POOL "poolg"; 
    
    ---资源池打开自动弹性开关
    ALTER RESOURCE POOL "poolg"  WITH (enable_concurrency_scaling=true);
    

自动弹性VW相关GUC参数

与自动弹性相关的GUC参数主要包括如下,支持通过控制台进行修改,参见修改DWS集群GUC参数

相关文档