許多 Azure 區域提供可用性區域,即區域內分開的資料中心群組。 可用性區域彼此足夠接近,可以與其他可用性區域建立低延遲連線。 它們是由高效能網路所連線,往返延遲小於 2 毫秒。 然而,可用區域間距足夠遠,降低了地方停電或天氣影響多個可用區域的可能性。 每個可用區域都有獨立的電力、冷卻和網路基礎設施。 它們的設計是為了讓若某個區域發生故障,剩下的區域能支援區域服務、容量及高可用性。 更多資訊請參見Azure 可用性區域。
你可以設定 Azure Data Explorer 叢集,讓它們使用支援區域的可用性區域。 藉由使用可用性區域,叢集可以更好地承受區域中單一數據中心的失敗,以支援 商務持續性 案例。
你可以在 Azure 入口網站建立叢集時設定可用性區域,或透過以下其中一種方式以程式化方式設定:
- REST API
- C# SDK
- Python SDK
- PowerShell
- ARM 範本
重要
- 將叢集設定為使用可用性區域後,您就無法將叢集變更為不使用可用性區域。
- 並非所有地區都支援多個區域。 因此,你無法在這些區域設置叢集來使用可用性區。
- 使用可用區會產生額外的儲存成本。
注意
- 在繼續之前,務必熟悉 遷移流程及考量事項。
- 您也可以使用這些步驟來變更使用可用性區域之現有叢集的區域。
在本文中,您會了解:
必要條件
取得叢集區域的可用性區域清單
您可以透過下列方式取得叢集的可用性區域清單:
在Azure入口網站,請前往你叢集的Overview頁面。
在設定底下,選取放大。
在你的叢集列中,可用性區域會出現在 「可用性區域」 欄位。
在開始之前,請先確認您已安裝 az.Kusto Cmdlet,並且已登入。 接著執行以下指令,取得叢集區域的可用區域清單:
設定叢集的資源標識碼。 你可以從 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
取得叢集的標識碼。
$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 |
叢集的訂用帳戶標識碼 |
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 範本。 欲了解更多資訊,請參閱 Deploy resources with ARM templates 及 Azure CLI。
遷移過程中,以下訊息會出現在 Azure 入口網站叢集的總覽頁面。 移轉完成之後會移除訊息。
此叢集記憶體的區域性變更正在進行中。 更新時間可能會根據數據量而有所不同。
具有可用性區域的叢集架構
當您設定可用性區域時,叢集會部署以下資源:
計算層:Azure Data Explorer 是一個擁有兩個或以上節點的分散式運算平台。 如果你設定可用性區域,叢集會將運算節點分散到定義的可用性區域,以達到最大區域內韌性。 區域失敗可能會降低叢集效能,直到在倖存區域中重新部署失敗的計算資源為止。 設定區域內最大可用區域。
注意
- 在某些情況下,由於運算容量限制,計算層僅能提供部分可用性區域。
- 叢集的計算層採用盡力而為(best effort)方法,將實例均勻分布於選定區域。
持久儲存層:叢集使用 Azure 儲存體 作為其持久性層。 若設定可用性區域,叢集會啟用 ZRS,將三個儲存副本分散於多個區域,以達到最大區域內韌性。
注意
- ZRS 會產生額外費用。
- 當你不設定可用性區域時,儲存資源會使用預設的 本地冗餘儲存(LRS),將三個副本放在同一個區域。
遷移過程與考量
當你配置一個沒有任何可用區域的現有叢集以支援可用性區域時,遷移過程會執行以下步驟:
將計算資源分配至定義的可用區域
重新分配計算資源的過程包含一個準備階段,在此期間區域計算資源快取會被加熱。 在準備階段,現有叢集的計算資源會繼續運作,確保服務不會中斷。 此準備階段最多可能需要數十分鐘的時間。 只有當新運算資源完全準備好並投入運作時,才會進行轉換。 這種平行處理方法可確保相對順暢的體驗,在切換程式期間,服務中斷最少,通常持續一到三分鐘。 然而,查詢效能在 SKU 遷移期間可能會受到影響。 影響的程度可能會根據特定的使用模式而有所不同。
將歷史持久儲存資料遷移至 ZRS
遷移過程取決於區域對從 LRS 轉移至 ZRS 儲存的支援,以及所選區域可用的儲存帳戶容量。 歷史數據的傳輸可能是一個耗時的過程,可能需要數小時,甚至延長到數周。
將所有新資料寫入 ZRS
在您啟動遷移至可用性區域的請求後,系統會複製並儲存所有新資料於 ZRS 設定中。
注意
- 在移轉要求之後,在 ZRS 設定中開始寫入所有新數據之前,可能會延遲最多幾分鐘。
- 若叢集有串流擷取,則將新資料回收以寫入 ZRS 資料可能需要長達 30 天。
更新區域狀態
一旦遷移到可用區域的請求完成,系統會更新區域狀態以反映支援區域。 如果區域狀態為 「區域不一致」,表示某些計算或記憶體資源無法移轉且不是區域性。 這種情況通常發生在某些資源的區域容量不足時。 在這種情況下,等容量可用時再重新嘗試遷移。
移轉考慮
容量限制可能阻礙遷移申請的成功。 為了成功遷移,必須有足夠的運算與儲存容量來支援遷移。 如果存在容量限制,你會收到錯誤訊息說明問題。
相關內容