存算分离场景下按需弹性VW:高性价比地适应灵活多变的业务需求
本章节演示存算分离场景下,使用DWS的增删弹性计算组Virtual Warehouse(以下简称 VW)功能,实现VW按业务高低峰进行自动扩缩容,实现VW按需消费,为企业降本增效。
学习本实践流程如下:
- 了解自动弹性VW的背景信息。
- 了解主VW、弹性VW、手动增加弹性VW和自动弹性VW。
- 根据业务场景,选择不同场景下对应的弹性VW模式。
本实践仅9.1.1.100及以上版本的存算分离集群支持。
背景信息
随着公司业务的快速发展,数据库扩容已成为支撑业务规模扩张的业界通用解决方案。从长期时间维度来看,基于业务负载趋势的定量扩容(如图1所示)能够有效支撑更高的业务并发量,是应对业务增长的成熟方案。
但在更细粒度的时间维度(如按周、按日)下,传统扩容模式往往通过资源超配来应对业务负载的波动,这一方式存在显著的资源浪费问题。以图2所示场景为例:公司数据中台团队每日凌晨 0 点至 6 点执行 ETL 作业,完成大批量数据的离线导入;而业务团队的作业负载则呈现无规律的波动特征。在此情况下,传统扩容的资源超配模式会造成大量计算资源闲置,显著增加企业的资源使用成本。
理想状态下,若数据库能够根据负载波动自动实现弹性扩缩容,按需调整资源配置,将大幅降低资源浪费、节约使用成本(如图3所示)。为实现更灵活、低成本的数据库扩缩容,数据库系统可配置基础资源规格以满足日常作业负载需求,同时在业务负载高峰期快速扩容,保障业务稳定运行。DWS 存算分离版本恰好实现了上述按需弹性扩缩容能力,可有效适配细粒度时间维度的负载波动,通过主动、按需弹性扩容资源,保障短期负载爆发场景下的业务稳定性。
固定资源池(主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能基于最新元数据执行作业。
场景选择:关于手动弹性VW和自动弹性VW
DWS提供弹性资源池的两种使用方式,分别为手动弹性和自动弹性,可覆盖各类按需弹性扩缩容场景。
- 手动弹性:
适用于对自身业务负载特性充分了解的客户,尤其适配负载呈周期性波动、且波动期间以大查询为主的场景(例如周期性跑批作业)。客户可基于已知的负载周期规律,手动触发弹性资源的扩容与缩容,精准匹配业务需求。
其中手动弹性,按照在控制台上配置方式不同,还可以划分为用户绑定方式和比例路由方式。
- 用户绑定方式:创建弹性VW时,选择绑定用户,例如图5的②标记,示例请参见场景一:使用用户绑定模式手动创建弹性VW,弹性VW均用于承接ETL负载。
- 比例路由方式:创建弹性VW时,选择绑定主逻辑集群(例如图5的①标记),或者既不绑定主逻辑集群,也不绑定用户。示例请参见场景二:不绑定用户,使用比例路由方式手动创建弹性VW,将主VW的作业卸载一部分到弹性VW上执行。
如果选择绑定了主逻辑集群,我们将这种配置创建出来的弹性VW称为专用弹性VW。数据库内核以比例路由方式将所绑定的主VW的作业路由到专用弹性VW,即专用弹性VW只会接受来自绑定的主VW的作业。
如果均没有选择,我们将这种配置创建出来的弹性VW称之为公用弹性VW。数据库内核以比例路由方式将主VW的作业路由到公用弹性VW,即公用弹性VW可以接受来自集群内所有主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进行资源超配,降低成本
- 参见创建DWS存算分离集群,创建DWS存算分离集群,并已创建user1、user2作业用户。
- 在DWS控制台,左侧导航栏中,选择“专属集群 > 集群列表”。
- 在集群列表中,单击指定集群名称,进入“集群详情”页面。
- 在上侧导航栏切换至“逻辑集群管理”页面,单击“添加增删计划”。
- 按以下参数配置,创建VW1,绑定用户user1。
表1 创建VW1 参数
取值
计划类型
周期性
集群名称
VW1
绑定主逻辑集群
不选择
绑定用户
user1
节点数
3
起止时间
选定执行ETL的窗口期,例如1~3个月。
周期类型
每星期
时间配置
- 创建完成时间:全选,00:00
- 开始删除时间:全选,06:00
图7 创建VW1绑定用户
- 重复5,创建VW2,绑定用户user2。时间配置为:
- 创建完成时间:全选,04:00
- 开始删除时间:全选,06:00
- 如果想查询用户与VW的绑定关系,可以查询pg_user的nodegroup列。
- 查看用户绑定的弹性VW。
1SELECT usename, nodegroup from pg_user where usename= 'user1';
- 查看弹性VW绑定的用户。
1SELECT usename, nodegroup from pg_user where nodegroup='VW1';
- 查看用户绑定的弹性VW。
通过以上步骤配置后,在凌晨0点~6点,user1执行的作业将在对应VW1完成。在凌晨4点~6点,user2执行的作业将在对应VW2完成。
6点后,VW1和VW1自动删除,节省成本。
场景二:不绑定用户,使用比例路由方式手动创建弹性VW,将主VW的作业卸载一部分到弹性VW上执行
我们仍然以数据中台团队为例,介绍比例路由方式的案例。在创建弹性VW时,不绑定给用户,而绑定到主逻辑集群。
数据中台业务用户user1绑定主VW v3_logical,user2绑定主VW v3_logical_2。两个用户提交的作业既包含ETL负载,也包括一些DML业务处理负载。
在每日的凌晨0点到6点,ETL负载变高,团队管理员在DWS控制台创建VW1,设置为周期性,每天0点创建,6点删除,且绑定主逻辑集群设置为v3_logical。
- 参见创建DWS存算分离集群,创建DWS存算分离集群。
- 添加第二套主VW,命名为v3_logical_2。
- 在DWS控制台,左侧导航栏中,选择“专属集群 > 集群列表”。
- 在集群列表中,单击指定集群名称,进入“集群详情”页面。
- 在上侧导航栏切换至“逻辑集群管理”页面,单击“添加逻辑集群”。
- 添加第二套主VW v3_logical_2,如果没有可选节点,先进行节点扩容。
- 创建用户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}';
- 回到“逻辑集群管理”页面,单击“添加增删计划”。
- 按以下参数配置,创建VW1,并绑定到主VW v3_logical中,此时VW1为专用弹性VW。
表2 创建VW1 参数
取值
计划类型
周期性
集群名称
VW1
绑定主逻辑集群
v3_logical
绑定用户
不选择。
节点数
3
起止时间
选定执行ETL的窗口期,例如1~3个月。
周期类型
每星期
时间配置
- 创建完成时间:全选,00:00
- 开始删除时间:全选,06:00
图9 创建VW1绑定主逻辑集群
图10 创建VW1绑定主逻辑集群
- 执行以下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;
- 后续团队发现,由于user1提交的作业负载太高,一个弹性VW仍然不能满足需求,而且,user2提交的作业负载也需要卸载一部分到弹性VW执行。
但是出于经济成本考量,再额外新建2个弹性VW成本很高。最好的方式是新建一个弹性VW2,能同时处理user1和user2的作业。
此时,团队可以选择elastic路由策略。
- 参见4~5,再创建第二个弹性VW,但是不绑定用户,也不绑定主逻辑集群,即VW2为公用弹性VW。
- 执行以下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执行。
场景三:使用自动弹性模式,用户零干预,实现弹性资源的自动驾驶
在很多业务环境中,并不是所有的负载都可以总结出具体的周期性规律,业务负载的随机性也是一个常见的业务场景。在业务负载随机的场景下,手动弹性并不是最好的解决方案,本质上将会退化为资源预留的方式,因为客户也无法预知在何时创建及回收弹性VW。
为解决这一痛点,自动弹性VW功能应运而生,其核心设计锚定负载随机性场景,通过系统被动式触发机制实现弹性VW的智能调度:系统实时监控作业排队队列,当负载突发导致作业堆积时(如图13所示),会自动创建弹性 VW 来分担计算压力,利用额外弹性资源快速消化排队作业,避免对核心业务的稳定性造成影响,同时有效提升集群整体并发处理能力;当负载回落至主 VW 可承载的范围时,系统会自动回收冗余的弹性 VW,杜绝资源闲置带来的额外计费。
整个自动弹性过程无需人工干预,既能通过动态资源调度降本增效、提升集群吞吐量,又能全程保障业务在负载波动下的稳定性,是应对随机负载场景的最优解。
展开来说,图14中的负载存在明显激突特点,且无明显规律。
在自动弹性的帮助下,t1时刻会自动创建弹性VW1,并于t2时刻销毁弹性VW1。
在第二轮的负载激突中,由于负载峰值比较高,t3时刻创建一个新的弹性VW1并不能满足需求,DWS会根据负载情况自动创建弹性VW2。等待负载降低后,分别在t5和t6时刻分别回收了弹性VW2和弹性VW1。
在此过程中,用户全程无需参与,DWS会自动将突发的负载路由到弹性VW上执行。
- 当前DWS自动创建的弹性VW的节点数量与主VW一致,不支持配置。当前DWS的自动弹性创建时间大约需要4~5分钟,如果集群作业排队数量非常短暂,可能会出现弹性VW弹出滞后的问题,所以建议集群作业排队持续10分钟以上使用自动弹性。
- 自动弹性规格默认如下,支持在控制台修改,详细GUC参见自动弹性VW相关GUC参数。
- 在主VW的排队作业个数超过10个,则自动触发创建弹性VW。
- 每个主VW支持自动创建最大的弹性VW个数为5个。
- 每个自动弹性VW能够执行的最大作业并发数为60。
- 自动弹性创建出来的VW空闲时间超过5分钟,则会自动回收。
- 参见创建DWS存算分离集群,创建DWS存算分离集群。
- 在DWS控制台,左侧导航栏中,选择“专属集群 > 集群列表”。
- 在集群列表中,单击指定集群名称,进入“集群详情”页面。
- 在上侧导航栏切换至“逻辑集群管理”页面,将“自动弹性开关”打开。
图15 打开自动弹性VW
- 开启自动弹性开关后,执行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参数。
- concurrency_scaling_max_idle_time: 设置自动创建的弹性VW的最大空闲时间,如果自动创建出来的弹性VW空闲时间一旦超过该GUC设置的时间,会自动进入资源回收流程,默认为5分钟。
- concurrency_scaling_limit_per_main_vw:设置每个主VW可以创建出自动弹性VW的最大个数,默认值为5。
- concurrency_scaling_max_vw_active_statements:每个自动弹性VW能够执行的最大作业并发数,默认值为60。
- concurrency_scaling_max_waiting_statements:主VW排队的作业个数,一旦超过该GUC值,则触发自动创建弹性VW,默认值为10。









