区域冗余使函数应用能够灵活应对Azure可用性区域中的问题,因此当数据中心或区域发生中断时,应用仍可用。 本文提供了根据托管计划将Azure Functions配置为区域冗余的分步指南。 有关可用区如何与 Azure Functions 配合使用的信息,请参阅 Azure Functions 的可靠性。
Azure Functions的可用性区域配置取决于 Functions 托管计划:
| 托管计划 |
支持级别 |
配置部分 |
|
弹性高级计划 |
GA |
选择本文顶部的Premium。 |
|
消耗计划 |
n/a |
消耗计划不支持。 |
只能在创建应用时在计划中启用可用性区域。 无法将现有高级计划转换为使用可用性区域。
创建区域冗余函数应用
按照以下步骤创建区域冗余的高端计划和应用程序。
在 Azure 门户中,转到 Create Function App 页。 有关在门户中创建函数应用的详细信息,请参阅创建函数应用。
选择Functions Premium,然后选择选择按钮。
在“创建函数应用 (Functions 高级计划)”页面的“基本信息”选项卡上,输入您函数应用的设置。 请特别注意下表中提到了区域冗余具体要求的设置(以下屏幕截图中也突出显示了这些设置)。
| 设置 |
建议值 |
有关区域冗余的说明 |
|
Region |
首选支持的区域 |
在其中创建弹性高级计划的区域。 必须选取支持可用性区域的地区。 有关支持区域冗余的 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的始终就绪实例。 此最低值可确保区域冗余功能应用始终拥有足够的实例,以满足每个区域至少一个工作者的需求。
下面是用于区冗余的 Premium 计划的 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的始终就绪实例。 此最低值可确保区域冗余功能应用始终拥有足够的实例,以满足每个区域至少一个工作者的需求。
下面是用于区域级冗余高级方案的 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 资源部署。
创建并部署区域冗余的计划后,在新计划中托管的任何函数应用将被视为区域冗余的应用。
在现有计划中启用区域冗余
可以使用Azure CLI在现有 Elastic Premium 计划中启用或禁用区域冗余。 对于 Elastic Premium 计划,此属性 zoneRedundant 是可变的,允许在不创建新计划的情况下切换可用性区域支持。
重要
弹性高级计划的容量行为不同于专用(应用服务)计划。 在 Elastic Premium 中,计划的实例计数 (sku.capacity) 派生自应用级别,而不是直接在计划上设置。 计划中的每个函数应用都有一个minimumElasticInstanceCount属性(始终就绪的实例),控制平面会自动将计划sku.capacity设置为计划中所有应用中的最高minimumElasticInstanceCount值。
启用区域冗余时,必须更新以下两项内容:将计划级别的 zoneRedundant 属性设置为 true 和 sku.capacity 以及 2 和 ,并将需要实现区域冗余的每个函数应用上的应用级别 minimumElasticInstanceCount 设置为至少 2。 仅在计划更新命令中进行设置,并不强制要求最小实例数达到 2 个。
目前,门户尚不支持在现有弹性高级计划中切换可用区域冗余。 请使用与当前支持的工作流对应的“Azure CLI”选项卡。
按照以下步骤在现有弹性高级计划上启用区域冗余:
对方案启用区域冗余:
az appservice plan update \
--resource-group <RESOURCE_GROUP> \
--name <PLAN_NAME> \
--set zoneRedundant=true sku.capacity=2
注释
sku.capacity=2此命令中的参数设置预期的最小值,但在完成步骤 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,使用以下命令查询实例区域放置:
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 chinanorth23-az3
pl0sdlwk0002HP chinanorth23-az1
在输出中:
-
machineName 是工作实例的内部名称
-
physicalZone 显示实例置于的实际可用性区域(格式: {region}-az{N})
- 对于一个具有多个实例的区域冗余方案,您应该会看到实例分布在不同的区域中。
后续步骤