许多 Azure 区域都提供可用性区域,这些区域是区域中的独立数据中心组。 可用性区域之间不能相距过远,要足以与其他可用性区域建立低延迟连接。 它们彼此间以高性能网络连接,往返延迟小于 2 毫秒。 但是,可用性区域相距足够远,以减少本地中断或天气影响多个可用性区域的可能性。 每个可用性区域都有独立的电源、冷却和网络基础结构。 其设计旨在确保:如果某个可用区发生中断,其余可用区仍可支撑区域服务、容量和高可用性。 有关详细信息,请参阅 Azure 可用性区域。
可以将Azure 数据资源管理器群集配置为在受支持的区域中使用可用性区域。 通过使用可用性区域,群集可以更好地承受区域内单个数据中心的故障,以支持业务连续性方案。
可以在Azure门户中创建群集时或使用以下方法之一以编程方式配置可用性区域:
- REST API
- C# SDK
- Python SDK
- PowerShell
- ARM 模板
重要
- 使用可用性区域配置群集后,无法将群集更改为不使用可用性区域。
- 并非所有区域都支持多个区域。 因此,不能在这些区域中设置群集以使用可用性区域。
- 使用可用性区域会产生额外的存储费用。
注意
- 在继续操作之前,请确保熟悉 迁移过程和注意事项。
- 还可以使用这些步骤更改使用可用性区域的现有群集的区域。
在本文中,您将学习:
先决条件
获取群集区域的可用性区域列表
可以通过以下方式获取群集的可用性区域列表:
在 Azure 门户中,转到群集的概述页。
在设置下选择扩展规模。
在您的集群所在行中,可用区会显示在 可用区 列中。
开始之前,请确保已安装 az.Kusto cmdlets 并且已登录。 然后运行以下命令,获取群集区域的可用性区域列表:
设置群集的资源 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.chinacloudapi.cn/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.chinacloudapi.cn/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)的默认设置,将所有三个副本放置在单个区域中。
迁移过程和注意事项
配置在没有任何可用性区域的情况下部署的现有群集以支持可用性区域时,迁移过程将执行以下步骤:
跨定义的可用性区域分配计算资源
重新分发计算资源的过程涉及一个准备阶段,在该阶段中,区域计算资源缓存会预热。 在准备阶段,现有群集的计算资源继续运行,确保服务不间断。 此准备阶段最长可能需要数十分钟。 转换到新的计算资源仅在完全准备好并正常运行后才会发生。 这种并行处理方法可确保相对无缝的体验,在切换过程(通常持续一到三分钟)中仅产生尽量少的服务中断。 但是,在 SKU 迁移期间,查询性能可能会受到影响。 影响程度可能因具体使用模式而异。
将历史持久性存储数据迁移到 ZRS
迁移过程取决于区域支持从 LRS 到 ZRS 存储的转换,以及所选区域中的可用存储帐户容量。 历史数据的传输是一个耗时的过程,可能需要几个小时甚至长达几周的时间。
将所有新数据写入 ZRS
启动迁移到可用性区域的请求后,系统会在 ZRS 配置中复制并存储所有新数据。
注意
- 发出迁移请求后,所有新数据开始写入 ZRS 配置之前可能会有最多几分钟的延迟。
- 如果群集具有流式引入,则以 ZRS 数据形式写入的新数据的回收可能需要长达 30 天的时间。
更新区域状态
完成对可用性区域的迁移请求后,系统会更新区域状态以反映支持的区域。 如果区域状态为 “区域不一致”,则表示某些计算或存储资源无法迁移且不是区域性资源。 当某些资源可用的区域容量不足时,通常会发生这种情况。 在这种情况下,请稍后在容量可用时重试迁移。
迁移注意事项
容量约束可能会阻止成功的迁移请求。 若要成功迁移,足够的计算和存储容量必须支持迁移。 如果存在容量限制,则会收到一条指示问题的错误消息。
相关内容