Azure Service Fabric 的容量規劃和調整

在建立任何 Azure Service Fabric 叢集或裝載您的叢集擴展計算資源之前,必須做好容量規劃。 如需規劃容量的詳細資訊,請參閱規劃 Service Fabric 叢集容量。 如需更多叢集可擴縮性的最佳作法指引,請參閱 Service Fabric 可擴縮性考量

除了考量節點類型和叢集特性,您應該預期對生產環境的調整作業需要超過一小時的時間才能完成。 無論您要新增的 VM 數目為何,此考量都成立。

自動調整規模

您應該透過 Azure Resource Manager 範本執行調整規模作業,因為這是將資源設定視為程式碼的最佳做法。

透過虛擬機器擴展集使用自動調整,會讓您設定版本的 Resource Manager 範本不準確地定義虛擬機器擴展集的執行個體計數。 不準確的定義會增加未來部署將導致非預期調整作業的風險。 一般來說,您應該在下列情況下使用自動調整:

  • 部署已宣告適當容量的 Resource Manager 範本,無法為您的使用案例提供支援。

    除了手動調整,您也可以使用 Azure 資源群組部署專案,在 Azure DevOps Services 中設定持續整合和傳遞管線。 此管線通常是由使用透過 Azure 監視器 REST API 查詢的虛擬機器效能計量的邏輯應用程式所觸發。 管線會根據您想要的任何計量有效自動調整,同時針對 Resource Manager 範本最佳化。

  • 您必須一次以水平方式調整僅一個虛擬機器擴展集節點。

    若要一次擴增三個或更多節點,您應該新增虛擬機器擴展集以擴增 Service Fabric 叢集。 縮減與擴增虛擬機器擴展集的最安全方式是以水平方式,一次一個節點。

  • 您的 Service Fabric 叢集具有銀級或更高的可靠性,而您在設定自動調整規則的任何規模上則具有銀級或更高的持久性。

    自動調整規則的容量下限必須等於或大於五個虛擬機器執行個體。 它也必須等於或大於您的主要節點類型的最低可靠性階層。

注意

Service Fabric 具狀態服務網狀架構:/System/InfastructureService/<NODE_TYPE_NAME> 會在具有銀級或更高持久性的每個節點類型上執行。 這是在您的任何叢集節點類型上支援於 Azure 中執行的唯一系統服務。

重要

Service Fabric 自動調整支援 DefaultNewestVM 虛擬機器擴展集縮小設定

垂直調整考量

垂直調整 Azure Service Fabric 中的節點類型,需執行若干步驟並考量相關事項。 例如:

  • 在調整之前,叢集必須處於良好狀態。 否則,您會進一步使得叢集不穩定。
  • 所有裝載具狀態服務的 Service Fabric 叢集節點類型,都需要銀級或更高的持久性層級。

注意

您的裝載具狀態 Service Fabric 系統服務的主要節點類型,必須具備銀級或更高的持久性層級。 啟用銀級持久性之後,諸如升級、新增或移除節點等叢集作業的速度都會變慢,因為此時系統的最佳化是以資料安全為導向,而不是作業速度。

僅僅透過變更虛擬機器擴展集的資源 SKU 來垂直調整它是一項破壞性的作業,因為它會重新建立主機映像,因此會移除所有本機保存的狀態。 相對地,藉由為新的擴展集新增所需的 SKU,然後將服務移轉至新的擴展集來水平調整您的叢集,將可完成安全的垂直調整作業。

您的叢集會使用 Service Fabric 節點屬性和放置條件約束來決定要在何處裝載應用程式服務。 垂直調整主要節點類型時,您將部署第二個主要節點類型,然後在原始主要節點類型上設定 ("isPrimary": false),繼續停用其節點,並移除其擴展集及其相關資源。 如需詳細資料,請參閱擴大 Service Fabric 叢集主要節點類型

注意

請一律先在測試環境中驗證作業,再嘗試對生產環境進行變更。 根據預設,Service Fabric 叢集的系統服務會有僅以主要節點類型為目標的放置條件約束。

在宣告節點屬性和放置條件約束後,請逐一對各個 VM 執行個體執行下列步驟。 如此,在其他位置建立新複本時,系統服務 (以及您的具狀態服務) 將可在您要移除的 VM 執行個體上正常關閉。

  1. 從 PowerShell,執行 Disable-ServiceFabricNode 搭配意圖 RemoveNode,以停用您要移除的節點。 移除具有最高編號的節點類型。 例如,如果您有六個節點叢集,請移除 "MyNodeType_5" 虛擬機器執行個體。
  2. 執行 Get-ServiceFabricNode 以確保節點已轉換為停用狀態。 如果沒有,請等到節點停用。 每個節點可能需要幾小時的時間。 請等到節點已轉換為停用狀態後,再繼續操作。
  3. 將該節點類型的 VM 數目減少一個。 此時將會移除最高的 VM 執行個體。
  4. 視需要重複步驟 1 到 3,但是請永遠不要將主要節點類型的執行個體數目縮減到少於可靠性層級所需的數目。 如需建議的行個體清單,請參閱規劃 Service Fabric 叢集容量
  5. 一旦所有 VM 都消失 (呈現為「關閉」) fabric:/System/InfrastructureService/[node name] 將會顯示錯誤狀態。 然後,您可以更新叢集資源以移除節點類型。 您可以使用 ARM 範本部署,或透過 Azure Resource Manager 編輯叢集資源。 這將會開始叢集升級,其會移除處於錯誤狀態的 fabric:/System/InfrastructureService/[node type] 服務。
  6. 之後,您可以選擇性地刪除 VMScaleSet,不過您仍會從 Service Fabric Explorer 檢視看到節點為「關閉」。 最後一個步驟就是使用 Remove-ServiceFabricNodeState 命令來清除它們。

水平調整規模

您可以手動以程式設計方式進行水平調整。

注意

調整具有銀級或金級持久性的節點類型時,調整速度將會變慢。

擴增

藉由增加特定虛擬機器擴展集的執行個體計數,將 Service Fabric 叢集擴增。 您可以使用 AzureClient 和所需擴展集的識別碼以程式設計方式進行擴增,以增加容量。

var scaleSet = AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId);
var newCapacity = (int)Math.Min(MaximumNodeCount, scaleSet.Capacity + 1);
scaleSet.Update().WithCapacity(newCapacity).Apply(); 

若要手動擴增,請在所需的虛擬機器擴展集資源的 SKU 屬性中更新容量。

"sku": {
    "name": "[parameters('vmNodeType0Size')]",
    "capacity": "[parameters('nt0InstanceCount')]",
    "tier": "Standard"
}

相應縮小

相應縮小所需考量的因素會比相應放大多一些。例如:

  • Service Fabric 系統服務會在叢集內的主要節點類型中執行。 切勿關閉該節點類型的執行個體,或將其數目縮減到低於可靠性層級保證所需的執行個體數目。
  • 針對具狀態服務,您需要一些始終啟動的節點來維持可用性,以及維持服務的狀態。 您至少需要與分割區或服務的目標複本集計數相等的節點數目。

若要手動縮減,請遵循下列步驟︰

  1. 從 PowerShell,執行 Disable-ServiceFabricNode 搭配意圖 RemoveNode,以停用您要移除的節點。 移除具有最高編號的節點類型。 例如,如果您有六個節點叢集,請移除 "MyNodeType_5" 虛擬機器執行個體。
  2. 執行 Get-ServiceFabricNode 以確保節點已轉換為停用狀態。 如果沒有,請等到節點停用。 每個節點可能需要幾小時的時間。 請等到節點已轉換為停用狀態後,再繼續操作。
  3. 將該節點類型的 VM 數目減少一個。 此時將會移除最高的 VM 執行個體。
  4. 視需要重複步驟 1 到 3,直到佈建您需要的容量為止。 切勿將主要節點類型的執行個體數目縮小到低於可靠性層級保證所需的數目。 如需建議的行個體清單,請參閱規劃 Service Fabric 叢集容量

若要手動縮減,請在所需的虛擬機器擴展集資源的 SKU 屬性中更新容量。

"sku": {
    "name": "[parameters('vmNodeType0Size')]",
    "capacity": "[parameters('nt0InstanceCount')]",
    "tier": "Standard"
}

您必須做好節點的關機準備,才能以程式設計方式進行縮減。 尋找要移除的節點 (最高的執行個體節點)。 例如:

using (var client = new FabricClient())
{
    var mostRecentLiveNode = (await client.QueryManager.GetNodeListAsync())
        .Where(n => n.NodeType.Equals(NodeTypeToScale, StringComparison.OrdinalIgnoreCase))
        .Where(n => n.NodeStatus == System.Fabric.Query.NodeStatus.Up)
        .OrderByDescending(n =>
        {
            var instanceIdIndex = n.NodeName.LastIndexOf("_");
            var instanceIdString = n.NodeName.Substring(instanceIdIndex + 1);
            return int.Parse(instanceIdString);
        })
        .FirstOrDefault();

使用您在先前的程式碼中使用的相同 FabricClient 的執行個體 (在此案例中為 client) 和節點執行個體 (在此案例中為 instanceIdString) 來停用和移除節點:

var scaleSet = AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId);

// Remove the node from the Service Fabric cluster
ServiceEventSource.Current.ServiceMessage(Context, $"Disabling node {mostRecentLiveNode.NodeName}");
await client.ClusterManager.DeactivateNodeAsync(mostRecentLiveNode.NodeName, NodeDeactivationIntent.RemoveNode);

// Wait (up to a timeout) for the node to gracefully shut down
var timeout = TimeSpan.FromMinutes(5);
var waitStart = DateTime.Now;
while ((mostRecentLiveNode.NodeStatus == System.Fabric.Query.NodeStatus.Up || mostRecentLiveNode.NodeStatus == System.Fabric.Query.NodeStatus.Disabling) &&
        DateTime.Now - waitStart < timeout)
{
    mostRecentLiveNode = (await client.QueryManager.GetNodeListAsync()).FirstOrDefault(n => n.NodeName == mostRecentLiveNode.NodeName);
    await Task.Delay(10 * 1000);
}

// Decrement virtual machine scale set capacity
var newCapacity = (int)Math.Max(MinimumNodeCount, scaleSet.Capacity - 1); // Check min count 

scaleSet.Update().WithCapacity(newCapacity).Apply();

注意

縮減叢集時,您會看到已移除的節點/VM 執行個體在 Service Fabric Explorer 中顯示為狀況不良狀態。 如需此行為的說明,請參閱您可能在 Service Fabric Explorer 中觀察到的行為。 您可以:

可靠性層級

可靠性層級是 Service Fabric 叢集資源的屬性。 無法針對個別節點類型進行不同的設定。 它會控制叢集系統服務的複寫因子,是屬於叢集資源層級的設定。

可靠性層級將決定您的主要節點類型必須具備的節點數目下限。 可靠性層級可以採用以下的值:

  • 白金級:執行包含七個目標複本集和九個種子節點的系統服務。
  • 金級:執行包含七個目標複本集和七個種子節點的系統服務。
  • 銀級:執行包含五個目標複本集和五個種子節點的系統服務。
  • 銅級:執行包含三個目標複本集和三個種子節點的系統服務。

建議的最低可靠性層級為銀級。

可靠性層級設定於 Microsoft.ServiceFabric/clusters resource 的屬性區段中,如下所示:

"properties":{
    "reliabilityLevel": "Silver"
}

持久性層級

警告

執行 Bronze 持久性的節點類型「沒有權限」。 會對您的無狀態工作負載造成影響的基礎結構作業將不會停止或延遲,其可能會影響工作負載。

銅級持久性僅適用於執行無狀態工作負載的節點類型。 對於生產工作負載,請執行銀級或更高層級,以確保狀態的一致性。 請根據容量規劃文件中的指導方針選擇正確的可靠性。

持久性層級必須設定於兩個資源中。 一個為虛擬機器擴展集資源的擴充功能設定檔:

"extensionProfile": {
    "extensions":          {
        "name": "[concat('ServiceFabricNodeVmExt','_vmNodeType0Name')]",
        "properties": {
            "settings": {
                "durabilityLevel": "Bronze"
            }
        }
    }
}

另一個為 Microsoft.ServiceFabric/clusters resource 下的 nodeTypes

"nodeTypes": [
    {
        "name": "[variables('vmNodeType0Name')]",
        "durabilityLevel": "Bronze"
    }
]

下一步