区域冗余使函数应用能够灵活应对Azure可用性区域中的问题,因此当数据中心或区域发生中断时,应用仍可用。 本文提供了根据托管计划将Azure Functions配置为区域冗余的分步指南。 有关可用区如何与 Azure Functions 配合使用的信息,请参阅 Azure Functions 的可靠性。
Azure Functions的可用性区域配置取决于 Functions 托管计划:
| 托管计划 |
支持级别 |
配置部分 |
|
弹性高级计划 |
GA |
选择本文顶部的Premium。 |
|
消耗计划 |
n/a |
消耗计划不支持。 |
消费计划不支持区域冗余。 请考虑迁移到 高级计划 ,以获取可用性区域支持。
创建区域冗余函数应用
按照以下步骤创建区域冗余的高端计划和应用程序。
在 Azure 门户中,选择创建功能应用。 有关在门户中创建函数应用的详细信息,请参阅创建函数应用。
选择 “功能高级” ,然后选择 “选择”。
在 创建功能应用(功能高级版)中,在 基础 标签下,输入你功能应用的设置。 请特别注意下表中提到了区域冗余具体要求的设置(以下屏幕截图中也突出显示了这些设置)。
| 设置 |
建议值 |
有关区域冗余的说明 |
|
Region |
首选支持的区域 |
您创建 Elastic Premium 计划时所在的区域。 选择支持可用区的区域。 有关支持区域冗余的 Azure Functions 高级计划的区域列表,请参阅Azure Functions 的可靠性 - 应对可用性区域故障的复原能力 - 要求。 |
|
定价计划 |
弹性高级计划之一。 有关详细信息,请参阅可用的实例 SKU。 |
本文将说明如何在Premium计划中创建区域冗余应用程序。 区域冗余目前在消费计划中不可用。 有关应用服务计划的区域冗余的信息,请参阅 为应用服务配置可用性区域。 |
|
区域冗余 |
已启用 |
此设置指定应用是否为区域冗余。 除非你选择支持区域冗余的区域,否则无法选择 Enabled ,如前所述。 |
在“存储”选项卡上,输入函数应用存储帐户的设置。 请特别注意下表中关于区域冗余的设置及其具体要求。
在函数应用创建过程的其余步骤中,请照常创建函数应用。 在创建过程的其余步骤中,没有任何设置会影响区域冗余。
在为功能应用创建存储账户时,选择一个区域冗余的SKU,例如 Standard_ZRS。 例如:
az storage account create \
--name <STORAGE_NAME> \
--location <REGION> \
--resource-group <RESOURCE_GROUP> \
--sku Standard_ZRS \
--allow-blob-public-access false
创建高级计划时,添加 --zone-redundant true 参数:
az functionapp plan create \
--resource-group <RESOURCE_GROUP> \
--name <PLAN_NAME> \
--location <REGION> \
--sku EP1 \
--zone-redundant true
创建函数应用程序并将其与区域冗余的 Premium 计划相关联:
az functionapp create \
--resource-group <RESOURCE_GROUP> \
--name <APP_NAME> \
--storage-account <STORAGE_NAME> \
--plan <PLAN_NAME> \
--runtime <RUNTIME> \
--runtime-version <RUNTIME_VERSION>
可以使用 Bicep 文件部署到区域冗余 Premium 方案。 若要了解如何将函数应用部署到高级计划,请参阅 在 Azure Functions 中自动化资源部署。
创建区域冗余托管计划时要注意的唯一属性是 zoneRedundant 属性和计划的实例计数 (capacity) 字段。 将属性 zoneRedundant 设置为 , true 且根据工作负载需求设置属性 capacity ,但不得小于 3。 选择合适的容量取决于多种因素以及高可用性和容错策略。 一个好的做法是为应用程序指定足够的实例,以确保即使失去某个实例区域,也剩有足够的容量来处理预期负载。
重要
Azure Functions 应用托管在包含区域冗余的 Elastic Premium 方案中,必须至少有数量为2的始终就绪实例。 此最低值可确保区域冗余功能应用始终拥有足够的实例,以满足每个区域至少一个工作者的需求。
以下代码片段是一个用于区域冗余高级层计划的 Bicep 模板。 它显示 zoneRedundant 字段和 capacity 规范。
resource EPFuncPlan 'Microsoft.Web/serverfarms@2024-04-01' = {
name: '<YOUR_PLAN_NAME>'
location: '<YOUR_REGION_NAME>'
sku: {
name: 'EP1'
tier: 'ElasticPremium'
size: 'EP1'
family: 'EP'
capacity: 3
}
kind: 'elastic'
properties: {
perSiteScaling: false
elasticScaleEnabled: true
maximumElasticWorkerCount: 20
isSpot: false
reserved: false
isXenon: false
hyperV: false
targetWorkerCount: 0
targetWorkerSizeId: 0
zoneRedundant: true
}
}
若要了解有关这些模板的详细信息,请参阅 Azure Functions 中的 Automate 资源部署。
您可以使用 ARM 模板来部署到区域冗余的高级套餐。 若要了解如何将函数应用部署到高级计划,请参阅 在 Azure Functions 中自动化资源部署。
创建区域冗余托管计划时要注意的唯一属性是 zoneRedundant 属性和计划的实例计数 (capacity) 字段。 将属性 zoneRedundant 设置为 , true 且根据工作负载需求设置属性 capacity ,但不得小于 3。 选择合适的容量取决于多种因素以及高可用性和容错策略。 一个好的做法是为应用程序指定足够的实例,以确保即使失去某个实例区域,也剩有足够的容量来处理预期负载。
重要
Azure Functions 应用托管在包含区域冗余的 Elastic Premium 方案中,必须至少有数量为2的始终就绪实例。 此最低值可确保区域冗余功能应用始终拥有足够的实例,以满足每个区域至少一个工作者的需求。
以下代码片段是用于区域冗余 Premium 计划的 ARM 模板。 它显示 zoneRedundant 字段和 capacity 规范。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2024-04-01",
"name": "<YOUR_PLAN_NAME>",
"location": "<YOUR_REGION_NAME>",
"sku": {
"name": "EP1",
"tier": "ElasticPremium",
"size": "EP1",
"family": "EP",
"capacity": 3
},
"kind": "elastic",
"properties": {
"perSiteScaling": false,
"elasticScaleEnabled": true,
"maximumElasticWorkerCount": 20,
"isSpot": false,
"reserved": false,
"isXenon": false,
"hyperV": false,
"targetWorkerCount": 0,
"targetWorkerSizeId": 0,
"zoneRedundant": true
}
}
]
}
若要了解有关这些模板的详细信息,请参阅 Azure Functions 中的 Automate 资源部署。
创建并部署区域冗余计划后,你在新计划中托管的任何功能应用都被视为区域冗余。
在现有计划中启用区域冗余
在为您的高级套餐托管应用启用区域冗余之前,请牢记以下重要考虑因素:
弹性高级计划的 zoneRedundant 属性可更改,因此无需创建新计划即可切换可用性区域支持。
与专用(App Service)计划不同,每个应用的弹性高级容量行为(sku.capacity)是由应用级设置决定的,而不只是由计划设置决定。
要启用区域冗余,您必须在套餐和应用层面同时更新设置:
| 级别 |
资产 |
所需的值 |
备注 |
| Plan |
zoneRedundant |
true |
启用可用区分布 |
| Plan |
sku.capacity |
2 或更高版本 |
设定预期的最小实例数 |
| 应用(每个) |
minimumElasticInstanceCount |
2 或更高版本 |
控制平面将计划 sku.capacity 设置为所有应用中 最高的 值。 仅仅设置 sku.capacity 并不能强制执行最低值,所以你还必须设置这个应用级别属性。 |
当前无法通过门户为现有的 Elastic Premium 计划配置可用区冗余。
要在您的高级套餐应用中启用可用区冗余:
按照以下步骤在现有弹性高级计划上启用区域冗余:
对方案启用区域冗余:
az appservice plan update \
--resource-group <RESOURCE_GROUP> \
--name <PLAN_NAME> \
--set zoneRedundant=true sku.capacity=2
注释
sku.capacity=2该命令中的参数设定了预期的最小值,但系统在你完成第二步后才强制执行。
将计划中每个需要实现区域冗余的函数应用的“始终就绪”实例数更新为至少 2 个:
az functionapp update \
--resource-group <RESOURCE_GROUP> \
--name <APP_NAME> \
--set siteConfig.minimumElasticInstanceCount=2
计划的实际 sku.capacity 更新反映所有应用中最高的 minimumElasticInstanceCount 更新。
若要在现有计划中禁用区域冗余,请执行以下操作:
az appservice plan update \
--resource-group <RESOURCE_GROUP> \
--name <PLAN_NAME> \
--set zoneRedundant=false
禁用区域冗余后,可以选择将 minimumElasticInstanceCount 重新设置为 1 在函数应用中。
您可以使用 Bicep 模板将现有的 Elastic Premium 计划更新为区域冗余。 以下示例演示如何启用区域冗余:
resource EPFuncPlan 'Microsoft.Web/serverfarms@2024-04-01' existing = {
name: '<YOUR_PLAN_NAME>'
}
resource EPFuncPlanUpdate 'Microsoft.Web/serverfarms@2024-04-01' = {
name: EPFuncPlan.name
location: EPFuncPlan.location
sku: {
name: 'EP1'
tier: 'ElasticPremium'
size: 'EP1'
family: 'EP'
capacity: 2
}
kind: 'elastic'
properties: {
perSiteScaling: false
elasticScaleEnabled: true
maximumElasticWorkerCount: 20
isSpot: false
reserved: false
isXenon: false
hyperV: false
targetWorkerCount: 0
targetWorkerSizeId: 0
zoneRedundant: true
}
}
resource FunctionApp 'Microsoft.Web/sites@2024-04-01' = {
name: '<YOUR_APP_NAME>'
location: EPFuncPlan.location
kind: 'functionapp'
properties: {
serverFarmId: EPFuncPlan.id
siteConfig: {
minimumElasticInstanceCount: 2
}
}
}
注释
请记住,将 minimumElasticInstanceCount 计划中所有函数应用中的属性更新为至少 2 个,以确保满足区域冗余要求。
您可以使用 ARM 模板将现有的 Elastic Premium 计划更新为支持区域冗余。 以下示例演示如何启用区域冗余:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2024-04-01",
"name": "<YOUR_PLAN_NAME>",
"location": "<YOUR_REGION_NAME>",
"sku": {
"name": "EP1",
"tier": "ElasticPremium",
"size": "EP1",
"family": "EP",
"capacity": 2
},
...
"properties": {
...
"zoneRedundant": true
}
},
{
"type": "Microsoft.Web/sites",
"apiVersion": "2024-04-01",
"name": "<YOUR_APP_NAME>",
"location": "<YOUR_REGION_NAME>",
"kind": "functionapp",
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', '<YOUR_PLAN_NAME>')]",
"siteConfig": {
"minimumElasticInstanceCount": 2
}
},
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', '<YOUR_PLAN_NAME>')]"
]
}
]
}
注释
请记住,将 minimumElasticInstanceCount 计划中所有函数应用中的属性更新为至少 2 个,以确保满足区域冗余要求。
验证实例区域放置
启用区域冗余后,你可以通过Azure门户或Azure CLI确认你的函数应用实例是否分布在不同可用性区域。
在 Azure 门户中,进入你的函数应用。 在“设置” 下,选择“实例” 。 “ 实例” 页显示每个正在运行的实例及其放入的可用性区域。
请使用以下命令查询实例区域的布局:
RESOURCE_ID=$(az functionapp show \
--resource-group <RESOURCE_GROUP> \
--name <APP_NAME> \
--query id -o tsv)
az rest \
--method get \
--url "${RESOURCE_ID}/instances?api-version=2024-04-01" \
--query "value[].{machineName:properties.machineName, physicalZone:properties.physicalZone}" \
-o table
在此示例中,将 <RESOURCE_GROUP> 和 <APP_NAME> 分别替换为您的资源组和函数应用的名称。
示例输出:
MachineName PhysicalZone
-------------- --------------
pl1sdlwk0002Q7 chinanorth2-az3
pl0sdlwk0002HP chinanorth2-az1
在输出中:
-
machineName 是工人实例的内部名称。
-
physicalZone 显示实例实际放置的可用区域(格式: {region}-az{N})。
- 对于带有两个或多个实例的区域冗余计划,你会看到实例分布在不同的区域。
故障排除
如果按照这些步骤操作后区域冗余仍未如预期工作,请检查以下项目:
验证该区域是否支持适用于你的计划类型的可用区。 参见 Azure Functions 中的可靠性 - 需求。
确保你的存储账户使用区域冗余SKU(ZRS或GZRS)。
确认在每个应用中,minimumElasticInstanceCount 已设置为至少 2。
关于规模单位和SKU要求相关的问题,请查看Azure 应用服务中可用性区域深度博客文章中的常见问题与解决方案部分。
后续步骤