许多 Azure 区域都提供可用性区域,这些区域是区域中的独立数据中心组。 可用性区域之间不能相距过远,要足以与其他可用性区域建立低延迟连接。 它们彼此间以高性能网络连接,往返延迟小于 2 毫秒。 但是,可用性区域之间不能相距过近,以减少多个可用性区域受当地停电或天气影响的可能性。 各可用性区域具有独立的电源、冷却和连网基础结构。 根据设计,如果一个区域停电,其余区域可支持区域性服务、容量和高可用性。 有关详细信息,请参阅 Azure 可用性区域。
Azure 数据资源管理器群集可配置为使用受支持区域中的可用性区域。 通过使用可用性区域,群集可以更好地承受区域内单个数据中心的故障,以支持业务连续性方案。
可以在 Azure 门户中创建群集时配置可用性区域,或使用以下其中一种方法以编程方式配置可用性区域:
- REST API
- C# SDK
- Python SDK
- PowerShell
- ARM 模板
重要
- 群集配置可用性区域后,无法将群集更改为不使用可用性区域。
- 并非所有地区都支持多个区域。 因此,位于这些区域的群集无法设置为使用可用性区域。
- 使用可用性区域会产生额外的成本。
注意
- 在继续之前,请确保你熟悉迁移过程和注意事项。
- 还可以使用这些步骤更改使用可用性区域的现有群集的区域。
在本文中,您将了解:
先决条件
请确保群集位于支持迁移到多个可用性区域的区域中。
若要迁移群集以支持可用性区域,需要部署一个没有任何可用性区域的群集。
若要更改群集的区域,需要一个已配置可用性区域的群集。
对于 REST API,需要熟悉使用 REST API 管理 Azure 资源。
有关其他编程方法,请参阅先决条件。
获取群集区域的可用性区域列表
可以通过以下方式获取群集的可用性区域列表:
在 Azure 门户中,转到群集的概述页。
在“设置”下选择“纵向扩展”。
在群集的行中,可用性区域列在可用性区域列中。
在开始之前,请确保已安装并登录az.Kusto cmdlet,然后运行以下命令以获取群集区域的可用性区域列表:
设置群集的资源 ID。 可以从 Azure 门户中你的群集的“属性”页获取群集的资源 ID。
$resource_id = "<ClusterResourceID>"
获取群集的详细信息。
$mycluster = Get-AzKustoCluster -InputObject $resource_id
获取群集的位置。
重要
Get-AzLocation
需要Az.Resources
模块。 如果未安装,请运行Install-Module Az.Resources
。
$___location = (Get-AzLocation | where DisplayName -EQ $mycluster.Location).___location
获取群集的 ID。
$mycluster.Id -match "/subscriptions/(.*?)/" | Out-Null; $subscription = $Matches[1]
获取群集区域的可用性区域列表。
$bearer = (Get-AzAccessToken).Token
$rest_result = (Invoke-RestMethod -Uri https://management.azure.com/subscriptions/$subscription/providers/Microsoft.Kusto/locations/${___location}/skus?api-version=2022-11-11 -Headers @{Authorization="Bearer $bearer"})
$zones = $rest_result | select -ExpandProperty Value | where name -eq $mycluster.SkuName | select -ExpandProperty locationInfo | select zones
$zones
若要将可用性区域添加到现有群集,必须使用目标可用性区域列表更新群集 zones
属性。 按照首选方法的说明操作,使用下表中的信息:
参数 |
值 |
subscriptionId |
群集的订阅 ID |
resourceGroupName |
群集的资源组名称 |
clusterName |
群集的名称 |
apiVersion |
2023-05-02 或更高版本 |
请遵照有关如何部署模板的说明操作。
对以下终结点进行 REST API 调用,在其中将参数替换为你的值:
PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Kusto/clusters/{clusterName}?api-version={apiVersion}
在请求正文中指定可用性区域。 例如,若要将群集配置为使用可用性区域 1、2 和 3,请按如下所示设置正文:
{ "zones": [ "{zone1}", "{zone2}", "{zone3}" ] }
如果未安装 Azure.Identity 和 Azure.ResourceManager.Kusto 库,请使用以下命令进行安装:
dotnet add package Azure.Identity
dotnet add package Azure.ResourceManager.Kusto
在应用程序中,添加以下代码:
"zones": [ "{zone1}", "{zone2}", "{zone3}" ]
例如,若要在“北欧”区域中将区域设置为 1、2 和 3,请使用以下代码:
using Azure.Core;
using Azure.ResourceManager.Kusto;
using Azure.ResourceManager.Kusto.Models;
using ArmClient = Azure.ResourceManager.ArmClient;
using ClientSecretCredential = Azure.Identity.ClientSecretCredential;
using WaitUntil = Azure.WaitUntil;
var tenantId = "{tenantId}";
var clientId = "{clientId}";
var clientSecret = "{clientSecret}";
var subscriptionId = "{subscriptionId}";
var resourceGroupName = "{resourceGroupName}";
var clusterName = "{clusterName}";
var credentials = new ClientSecretCredential(tenantId, clientId, clientSecret);
var resourceManagementClient = new ArmClient(credentials, subscriptionId);
var resourceIdentifier = new ResourceIdentifier($"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Kusto/Clusters/{clusterName}");
var cluster = resourceManagementClient.GetKustoClusterResource(resourceIdentifier);
var kustoClusterPatch = new KustoClusterPatch(AzureLocation.NorthEurope);
kustoClusterPatch.Zones.Clear();
kustoClusterPatch.Zones.Add("1");
kustoClusterPatch.Zones.Add("2");
kustoClusterPatch.Zones.Add("3");
var armOperation = await cluster.UpdateAsync(WaitUntil.Started, kustoClusterPatch).ConfigureAwait(false);
var response = armOperation.UpdateStatus();
Console.WriteLine($"ClientRequestId: {response.ClientRequestId}");
while (true)
{
Console.WriteLine($"{DateTime.UtcNow:o} {response.Status, -5} {response.ReasonPhrase}");
if (armOperation.HasCompleted)
break;
await Task.Delay(60000).ConfigureAwait(false);
response = await armOperation.UpdateStatusAsync().ConfigureAwait(false);
}
运行应用程序。
在应用程序中,添加以下代码:
"zones": [ "{zone1}", "{zone2}", "{zone3}" ]
例如,若要在“北欧”区域中将区域设置为 1、2 和 3,请使用以下代码:
from azure.identity import DefaultAzureCredential
from azure.mgmt.kusto import KustoManagementClient
from azure.mgmt.kusto import models
import time
from azure.core.exceptions import HttpResponseError
subscription_id = "{subscriptionId}"
resource_group_name = "{resourceGroupName}"
cluster_name = "{clusterName}"
client = KustoManagementClient(DefaultAzureCredential(), subscription_id)
lro_poller = client.clusters.begin_update(resource_group_name, cluster_name, models.ClusterUpdate.from_dict({"zones": ["1", "2", "3"]}))
while (not(lro_poller.done())):
time.sleep(60)
print (f"status: {lro_poller.status()}")
try:
lro_poller.result()
except HttpResponseError as e:
print (f"Exception: {e}")
运行应用程序。
可以使用以下 PowerShell 命令将群集配置为使用可用性区域。 确保已安装 Kusto 工具库,并将参数替换为你的值。
Update-AzKustoCluster -SubscriptionId {subscriptionId} -ResourceGroupName {resourceGroupName} -Name {clusterName} -Zone "{zone1}", "{zone2}", "{zone3}"
在 ARM 模板中,向 Microsoft.Kusto/clusters
资源添加以下属性:
"zones": [ "{zone1}", "{zone2}", "{zone3}" ]
例如,若要在“北欧”区域中将区域设置为 1、2 和 3,请使用以下模板:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"clusters_clusterName_name": {
"defaultValue": "clusterName",
"type": "string"
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Kusto/clusters",
"apiVersion": "2023-05-02",
"name": "[parameters('clusters_clusterName_name')]",
"___location": "North Europe",
"sku": {
"name": "{skuName}",
"tier": "Basic",
"capacity": 1
},
"zones": ["1","2","3"],
"identity": {
"type": "SystemAssigned"
},
"properties": {
"trustedExternalTenants": [],
"enableDiskEncryption": false,
"enableStreamingIngest": false,
"languageExtensions": {
"value": []
},
"enablePurge": false,
"enableDoubleEncryption": false,
"engineType": "V3",
"acceptedAudiences": [],
"restrictOutboundNetworkAccess": "Disabled",
"allowedFqdnList": [],
"publicNetworkAccess": "Enabled",
"allowedIpRangeList": [],
"enableAutoStop": true,
"publicIPType": "IPv4"
}
}
]
}
部署 ARM 模板。 有关详细信息,请参阅使用 ARM 模板和 Azure CLI 部署资源。
在迁移过程中,Azure 门户中的群集概述页面上会显示以下消息。 迁移完成后,该消息将被删除。
该群集存储的局域性更改正在进行中。 更新时间可能因数据量而异。
具有可用性区域的群集的体系结构
配置可用性区域后,将部署群集的资源,如下所示:
计算层:Azure 数据资源管理器是具有两个或更多节点的分布式计算平台。 如果已配置可用性区域,计算节点将分布在定义的可用性区域,以实现最大区域内复原能力。 区域故障可能会降低群集性能,直到故障的计算资源被重新部署到未发生故障的区域中。 建议在区域中配置最大可用区域。
注意
- 在某些情况下,由于计算容量的限制,计算层只能使用部分可用性区域。
- 群集的计算层实现将实例均匀分布到所选区域的最佳方法。
持久存储层:群集使用 Azure 存储作为其持久性层。 如果已配置可用性区域,将启用 ZRS,将存储副本放置在所有三个可用性区域中,以实现最大区域内复原能力。
注意
- ZRS 会产生额外的费用。
- 如果未配置可用性区域,存储资源将使用本地冗余存储 (LRS) 默认设置进行部署,将所有 3 个副本放置在一个区域中。
迁移过程
如果部署的现有群集未配置任何可用性区域以支持可用性区域,则迁移过程中将执行以下步骤:
计算分布在定义的可用性区域中
重新分发计算资源的过程涉及一个准备阶段,在此期间预热区域计算资源缓存。 在准备阶段,现有群集的计算资源继续运行,确保服务不间断。 此准备阶段最长可能需要数十分钟。 只有在完全准备好并正常运行后,才会转换到新的计算资源。 这种并行处理方法可确保相对无缝的体验,在切换过程(通常持续一到三分钟)中仅产生尽量少的服务中断。 但是,请务必注意,在 SKU 迁移期间,查询性能可能会受到影响。 影响程度可能因具体使用模式而异。
历史永久性存储数据迁移到 ZRS
迁移过程取决于区域支持从 LRS 到 ZRS 存储的转换,以及所选区域中的可用存储帐户容量。 历史数据的传输是一个耗时的过程,可能需要几个小时甚至长达几周的时间。
所有新数据写入 ZRS
发起迁移到可用性区域的请求后,所有新数据都会被复制并存储在 ZRS 配置中。
注意
- 发出迁移请求后,所有新数据开始写入 ZRS 配置之前可能会有最多几分钟的延迟。
- 如果群集具有流式引入,则回收要作为 ZRS 数据写入的新数据最多可能需要 30 天。
区域状态已更新
完成对可用性区域的迁移请求后,区域状态会更新,以反映支持的区域。 如果区域状态为 “区域不一致”,则表示某些计算或存储资源无法迁移且不是区域性资源。 当某些资源没有足够的区域容量时,通常会发生这种情况。 在这种情况下,建议稍后在容量可用时重试迁移。
注意事项
由于容量限制,迁移到可用性区域的请求可能不会成功。 若要成功迁移,必须有足够的计算和存储容量来支持迁移。 如果存在容量限制,将收到一条错误消息,指示存在问题。
相关内容