使用 Synapse Pipelines 暂停和恢复专用 SQL 池
可以使用 Azure Synapse Analytics 中的 Synapse Pipelines 自动暂停和恢复专用 SQL 池。 暂停和恢复操作可用于节省专用 SQL 池的成本。 可以轻松将此解决方案包含在现有的数据业务流程中。
以下步骤引导你设置自动暂停和恢复。
- 创建管道。
- 在管道中设置参数。
- 确定 Azure Synapse 工作区中专用 SQL 池的列表。
- 从列表中筛选出你不想要暂停或恢复的任何专用 SQL 池。
- 遍历每个专用 SQL 池,并:
- 检查专用 SQL 池的状态。
- 评估专用 SQL 池的状态。
- 暂停或恢复专用 SQL 池。
这些步骤在 Azure Synapse 中的简单管道中进行:
根据环境的性质,此处所述的整个过程不一定适用,你只需选择适当的步骤即可。 此处所述的过程可用于暂停或恢复开发、测试或 PoC 环境中的所有实例。 对于生产环境,你很有可能会根据各个实例计划暂停或恢复,因此只需执行步骤 5a 至 5c。
上述步骤使用用于 Azure Synapse 和 Azure SQL 的 REST API:
Synapse Pipelines 允许自动暂停和恢复,但你可以通过所选的工具或应用程序按需执行这些命令。
- 一个现有的 Azure Synapse 工作区
- 至少一个专用 SQL 池
- 对于你的工作区,必须将 Azure 参与者角色分配到受影响的专用 SQL 池。 请参阅向 Synapse 管理员授予工作区中的“Azure 参与者”角色。
导航到你的工作区并打开 Synapse Studio。
选择“集成”图标,然后选择“+”符号以创建新管道。
将管道命名为 PauseResume。
要创建的管道将由参数驱动。 通过参数可以创建一个可跨多个订阅、资源组或专用 SQL 池使用的通用管道。 选择靠近管道屏幕底部的“参数”选项卡。 选择“+新建”以创建以下每个参数:
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
ResourceGroup | 字符串 | Synapse | 专用 SQL 池的资源组名称 |
订阅 ID | 字符串 | <SubscriptionID> |
资源组的订阅 ID |
WorkspaceName | 字符串 | Synapse | 工作区的名称 |
SQLPoolName | 字符串 | SQLPool1 | 专用 SQL 池的名称 |
PauseorResume | 字符串 | 暂停 | 管道运行结束时所需的状态 |
设置一个 Web 活动,你将使用此活动通过调用专用 SQL 池的“按服务器列出”REST API 请求来创建专用 SQL 池列表。 输出是一个 JSON 字符串,其中包含工作区中专用 SQL 池的列表。 该 JSON 字符串将传递到下一个活动。
在“活动”>“常规”下,将某个 Web 活动作为管道的第一阶段拖放到管道画布中 。
在“常规”选项卡中,将此阶段命名为“GET 列表”。
选择“设置”选项卡,在“URL”输入空间中单击,然后选择“添加动态内容” 。 将以下使用 @concat 字符串函数参数化的 GET 请求复制并粘贴到动态内容框中。 选择“完成”。 以下代码是一个简单的 Get 请求:
GET https://management.chinacloudapi.cn/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.Synapse/workspaces/{workspace-name}/sqlPools?api-version=2021-06-01-preview
已使用 @concat 字符串函数参数化的 GET 请求:
@concat('https://management.chinacloudapi.cn/subscriptions/',pipeline().parameters.SubscriptionID,'/resourceGroups/',pipeline().parameters.ResourceGroup,'/providers/Microsoft.Synapse/workspaces/',pipeline().parameters.WorkspaceName,'/sqlPools?api-version=2021-06-01-preview')
选择“方法”对应的下拉列表,然后选择“Get” 。
选择“系统分配的托管标识”作为“身份验证类型”。 对于“资源”,请输入
https://management.chinacloudapi.cn/
重要
对于所有“Web 活动”/“REST API Web 调用”,需确保 Synapse Pipeline 针对专用 SQL 池进行身份验证。 需要使用托管标识来运行这些 REST API 调用。
删除你不想要暂停或恢复的专用 SQL 池。 使用筛选器活动来筛选从 Get 列表活动传递的值。 在此示例中,我们将从数组中提取其名称中不包含“prod”的记录。 根据需要应用其他条件。 例如,根据 Synapse 工作区的 SKU/名称进行筛选,以确保仅识别有效的专用 SQL 池。
- 选择“迭代和条件”下的“Filter”活动,并将其拖放到管道画布中。
- 将 Get 列表 Web 活动连接到 Filter 活动。 选择 Web 活动中的绿色标签并将其拖放到“Filter”框。
- 为“项”输入
@activity('Get list').output.value
,其中的“GET 列表”是前一 Web 活动的名称 - 为“条件”输入
@not(endswith(item().name,'prod'))
。 然后,数组中的其余记录将传递到下一活动。
创建一个 ForEach 活动以循环访问每个专用 SQL 池。
- 选择“迭代和条件”下的“ForEach”活动,并将其拖放到管道画布中。
- 在“常规”选项卡上为该活动命名,我们使用了“ForEach_pool”。
- 在“设置”选项卡上选择“项”输入,然后选择“添加动态内容” 。 滚动到“活动输出”,然后选择筛选器活动的输出。 将
.value
添加到该活动。 值应类似于@activity('Filter_PROD').output.value
。 选择“完成”。
- 选择“活动”选项卡,然后选择编辑(铅笔)图标打开 ForEach 循环画布。
检查专用 SQL 池的状态需要用到一个 Web 活动,如同在步骤 1 中那样。 此活动将调用 Azure Synapse 的“检查专用 SQL 池状态”REST API。
在“常规”下选择一个 Web 活动并将其拖放到管道画布中 。
在“常规”选项卡中,将此阶段命名为 CheckState。
选择“设置”选项卡。
在“URL”输入空间中单击,然后选择“添加动态内容” 。 将以下使用 @concat 字符串函数参数化的 GET 请求复制并粘贴到动态内容框中。 选择“完成”。 再次检查状态时,会使用一个通过以下调用发出的 Get 请求:
GET https://management.chinacloudapi.cn/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.Synapse/workspaces/{workspace-name}/sqlPools/{database-name}?api-version=2021-06-01-preview HTTP/1.1
使用 @concat 字符串函数参数化的 GET 请求:
@concat('https://management.chinacloudapi.cn/subscriptions/',pipeline().parameters.SubscriptionID,'/resourceGroups/',pipeline().parameters.ResourceGroup,'/providers/Microsoft.Synapse/workspaces/',pipeline().parameters.WorkspaceName,'/sqlPools/',item().name,'?api-version=2021-06-01-preview')
在本例中,我们将使用 item().name,这是步骤 1 中已通过 ForEach 循环传递到此活动的专用 SQL 池名称。 如果使用管道来控制单个专用 SQL 池,则可以在此处嵌入该专用 SQL 池的名称,或者在管道中使用参数。 例如,可以使用 pipeline().parameters.SQLPoolName。
输出是一个 JSON 字符串,其中包含专用 SQL 池的详细信息,其中包括其状态(在 properties.status 中提供)。 该 JSON 字符串将传递到下一个活动。
选择“方法”对应的下拉列表,然后选择“Get” 。 选择“系统分配的托管标识”作为“身份验证类型”。 对于“资源”,请输入
https://management.chinacloudapi.cn/
评估所需状态“暂停”或“恢复”以及当前状态“联机”或“已暂停”,然后根据需要启动暂停或恢复。
选择“迭代和条件”下的“Switch”活动,并将其拖放到管道画布中。
将“Switch”活动连接到“CheckState”活动 。 选择 Web 活动中的绿色标签并将其拖放到“Switch”框。
在“常规”选项卡中,将此阶段命名为 State-PauseOrResume。
根据所需状态和当前状态,只有以下两种组合才需要更改状态:“已暂停”->“恢复或联机”->“暂停”。
在 “活动”选项卡上,将以下代码复制到“表达式”中 。
@concat(activity('CheckState').output.properties.status,'-',pipeline().parameters.PauseOrResume)
其中,CheckState 是前面的 Web 活动的名称,output.properties.status 定义了当前状态,pipeline().parameters.PauseOrResume 指示所需状态。
检查条件会检查所需状态和当前状态。 如果所需状态为“恢复”且当前状态为“已暂停”,则会在“已暂停-恢复”案例中调用 Resume 活动。 如果所需状态为“暂停”且当前状态为“联机”,则会在“联机-暂停”案例中调用 Pause 活动。 对于任何其他案例,例如所需状态为“暂停”且当前状态为“已暂停”,或者所需状态为“恢复”且当前状态为“联机”,不需要执行任何操作,这些案例将作为默认案例(不使用任何活动)进行处理。
在“活动”选项卡上,选择“+ 添加案例”。 添加案例
Paused-Resume
和Online-Pause
。
对于某些要求而言,最终且唯一相关的步骤是启动专用 SQL 池的暂停或恢复。 此步骤同样使用 Web 活动,并调用 Azure Synapse 的“暂停或恢复计算”REST API。
选择活动编辑(铅笔)图标,将某个 Web 活动添加到 State-PauseorResume 画布中。
选择“设置”选项卡,在“URL”输入空间中单击,然后选择“添加动态内容” 。 将以下使用 @concat 字符串函数参数化的 POST 请求复制并粘贴到动态内容框中。 选择“完成”。
选择“方法”对应的下拉列表,然后选择“POST” 。
在“正文”部分中键入“暂停和恢复”
选择“系统分配的托管标识”作为“身份验证类型”。 对于“资源”,请输入
https://management.chinacloudapi.cn/
使用以下参数化代码为恢复功能添加另一个活动。
此处的示例演示如何通过以下调用来调用 POST 请求,以恢复专用 SQL 池:
POST https://management.chinacloudapi.cn/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.Synapse/workspaces/{workspace-name}/sqlPools/{database-name}/resume?api-version=2021-06-01-preview HTTP/1.1
可以使用 @concat 字符串函数来参数化上述 POST 语句:
@concat('https://management.chinacloudapi.cn/subscriptions/',pipeline().parameters.SubscriptionID,'/resourceGroups/',pipeline().parameters.ResourceGroup,'/providers/Microsoft.Synapse/workspaces/',pipeline().parameters.WorkspaceName,'/sqlPools/',activity('CheckState').output.name,'/resume?api-version=2021-06-01-preview')
在本例中,我们将结合使用活动 'Check State'.output.name,以及在步骤 3a 中已通过 Switch 条件传递到此活动的专用 SQL 池名称。 如果对单一数据库使用单个活动,则可以在此处嵌入专用 SQL 池的名称,或者在管道中使用参数。 例如,可以使用 pipeline().parameters.DatabaseName。
暂停专用 SQL 池的 POST 请求为:
POST https://management.chinacloudapi.cn/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.Synapse/workspaces/{workspace-name}/sqlPools/{database-name}/pause?api-version=2021-06-01-preview HTTP/1.1
可以使用 @concat 字符串函数来参数化 POST 请求,如下所示:
@concat('https://management.chinacloudapi.cn/subscriptions/',pipeline().parameters.SubscriptionID,'/resourceGroups/',pipeline().parameters.ResourceGroup,'/providers/Microsoft.Synapse/workspaces/',pipeline().parameters.WorkspaceName,'/sqlPools/',activity('CheckState').output.name,'/pause?api-version=2021-06-01-preview')
运行整个管道时,你将看到下面列出的输出。 可以通过选择“调试”模式或选择“添加触发器”来运行管道 。 根据下面的管道结果,名为“ResourceGroup”的管道参数已设置为包含两个 Synapse 工作区的单个资源组。 其中一个工作区名为 testprod 并已筛选掉,另一个工作区名为 test1。 test1 专用 SQL 池已暂停,因此作业启动了恢复。
若要保存管道,请选择该管道上方的“全部发布”。
若要计划管道,请选择该管道顶部的“添加触发器”。 按照屏幕中的说明,将管道计划为在指定的时间运行。
有关 Azure Synapse 的托管标识以及如何将托管标识添加到专用 SQL 池的更多详细信息,请参阅: