Kapazitätsplanung und Skalierung für Azure Service Fabric

Vor der Erstellung eines Azure Service Fabric-Clusters oder der Skalierung von Computeressourcen, die den Cluster hosten, ist es wichtig, die Kapazität zu planen. Weitere Informationen zur Planung der Kapazität finden Sie unter Planen der Service Fabric-Clusterkapazität. Weitere bewährte Methoden zur Skalierbarkeit von Clustern finden Sie unter Überlegungen zur Skalierbarkeit bei Service Fabric.

Neben der Berücksichtigung der Merkmale von Knotentypen und Clustern sollten Sie einplanen, dass Skalierungsvorgänge für eine Produktionsumgebung länger als eine Stunde dauern. Dieser Aspekt gilt unabhängig von der Anzahl der hinzugefügten virtuellen Computer.

Automatische Skalierung

Sie sollten Skalierungsvorgänge über Azure Resource Manager-Vorlagen ausführen, da dies als bewährte Methode für Ressourcenkonfigurationen als Code gilt.

Durch die Verwendung der automatischen Skalierung über VM-Skalierungsgruppen definiert Ihre versionierte Resource Manager-Vorlage die Anzahl von Instanzen für VM-Skalierungsgruppen falsch. Durch eine falsche Definition steigt das Risiko, dass zukünftige Bereitstellungen unbeabsichtigte Skalierungsvorgänge verursachen. Im Allgemeinen sollten Sie die automatische Skalierung in folgenden Fällen verwenden:

  • Die Bereitstellung Ihrer Resource Manager-Vorlagen mit der deklarierten geeigneten Kapazität unterstützt Ihren Anwendungsfall nicht.

    Sie können zusätzlich zur manuellen Skalierung eine Continuous Integration- und Continuous Delivery-Pipeline in Azure DevOps Services mithilfe von Bereitstellungsprojekten für Azure-Ressourcengruppen konfigurieren. Diese Pipeline wird meist durch eine Logik-App ausgelöst, die Leistungsmetriken von virtuellen Computern nutzt, die über die Azure Monitor-REST-API abgefragt wurden. Die Pipeline führt eine effektive automatische Skalierung basierend auf Ihren gewünschten Metriken durch und optimiert gleichzeitig die Resource Manager-Vorlagen.

  • Sie müssen jeweils nur einen Knoten einer VM-Skalierungsgruppe horizontal skalieren.

    Zum Erweitern um drei oder mehr Knoten gleichzeitig sollten Sie einen Service Fabric-Cluster durch das Hinzufügen einer VM-Skalierungsgruppe aufskalieren. Es ist am sichersten, das Auf- und Abskalieren von VM-Skalierungsgruppen mit jeweils einem Knoten durchzuführen.

  • Für den Service Fabric-Cluster ist die Zuverlässigkeitsstufe „Silber“ oder höher und die Dauerhaftigkeitsstufe „Silber“ oder höher für alle Skalierungsgruppen festgelegt, für die Sie Regeln für die automatische Skalierung konfigurieren.

    Die Mindestkapazität für Regeln zur automatischen Skalierung beträgt fünf VM-Instanzen. Zudem muss sie gleich oder größer dem der minimalen Zuverlässigkeitsstufe für Ihren primären Knotentyp sein.

Hinweis

Der zustandsbehaftete Service Fabric-Dienst „fabric:/System/InfrastructureService/<NODE_TYPE_NAME>“ wird auf jedem Knotentyp mit der Dauerhaftigkeit „Silber“ oder höher ausgeführt. Dies ist der einzige Systemdienst, dessen Ausführung in Azure auf allen Clusterknotentypen unterstützt wird.

Wichtig

Mit der automatischen Skalierung von Service Fabric werden die Konfigurationen für horizontales Herunterskalieren der VM-Skalierungsgruppen Default und NewestVM unterstützt.

Überlegungen zur vertikalen Skalierung

Die vertikale Skalierung eines Knotentyps in Azure Service Fabric erfordert mehrere Schritte und Überlegungen. Beispiel:

  • Der Cluster muss vor der Skalierung fehlerfrei sein. Andernfalls wird der Cluster nur weiter destabilisiert.
  • Für alle Knotentypen des Service Fabric-Clusters, die zustandsbehaftete Dienste hosten, ist die Dauerhaftigkeitsstufe „Silber“ oder höher erforderlich.

Hinweis

Der primäre Knotentyp, der zustandsbehaftete Service Fabric-Systemdienste hostet, muss mindestens die Dauerhaftigkeitsstufe „Silber“ aufweisen. Nachdem Sie die Dauerhaftigkeitsstufe „Silber“ aktiviert haben, werden Clustervorgänge wie das Aktualisieren, Hinzufügen oder Entfernen von Knoten langsamer durchgeführt, da im System die Optimierung der Datensicherheit Vorrang vor der Geschwindigkeit von Vorgängen hat.

Die vertikale Skalierung einer VM-Skalierungsgruppe durch einfaches Ändern der SKU ist ein destruktiver Vorgang, weil für die Hosts ein Reimaging durchgeführt wird, bei dem alle lokal persistenten Zustände entfernt werden. Skalieren Sie den Cluster stattdessen horizontal durch Hinzufügen einer neuen Skalierungsgruppe mit der gewünschten SKU, und migrieren Sie die Dienste dann zur neuen Skalierungsgruppe, um den vertikalen Skalierungsvorgang sicher abzuschließen.

Für Ihren Cluster werden Knoteneigenschaften und Platzierungseinschränkungen in Service Fabric verwendet, um festzulegen, wo die Anwendungsdienste gehostet werden. Wenn Sie einen primären Knotentyp vertikal skalieren, stellen Sie einen zweiten primären Knotentyp bereit und legen dann ("isPrimary": false) für den ursprünglichen primären Knotentyp fest. Anschließend deaktivieren Sie die Knoten und entfernen die Skalierungsgruppe und die zugehörigen Ressourcen. Weitere Informationen finden Sie unter Hochskalieren des primären Knotentyps eines Service Fabric-Clusters.

Hinweis

Überprüfen Sie Vorgänge immer in Testumgebungen, bevor Sie Änderungen in der Produktionsumgebung vornehmen. Standardmäßig weisen die Systemdienste des Service Fabric-Clusters nur für den primären Zielknotentyp eine Platzierungseinschränkung auf.

Führen Sie nach dem Deklarieren der Knoteneigenschaften und Platzierungseinschränkungen die folgenden Schritte für jeweils eine VM-Instanz aus. Dies ermöglicht, dass die Systemdienste (und Ihre zustandsbehafteten Dienste) ordnungsgemäß auf der VM-Instanz heruntergefahren werden, die Sie entfernen, und gleichzeitig neue Replikate an anderer Stelle erstellt werden.

  1. Führen Sie in PowerShell Disable-ServiceFabricNode mit der Absicht RemoveNode aus, um den Knoten zu deaktivieren, der entfernt werden soll. Entfernen Sie den Knotentyp mit der höchsten Zahl. Entfernen Sie bei einem Cluster mit sechs Knoten beispielsweise die VM-Instanz „MyNodeType_5“.
  2. Führen Sie Get-ServiceFabricNode aus, um sicherzustellen, dass der Status des Knotens tatsächlich in „Deaktiviert“ geändert wurde. Falls nicht, warten Sie, bis der Knoten deaktiviert ist. Dies kann für jeden Knoten einige Stunden dauern. Fahren Sie erst fort, nachdem der Status des Knotens in „Deaktiviert“ geändert wurde.
  3. Verringern Sie die Anzahl der virtuellen Computer in diesem Knotentyp um 1. Damit wird die höchste VM-Instanz entfernt.
  4. Wiederholen Sie den Anforderungen entsprechend die Schritte 1 bis 3. Skalieren Sie allerdings auf keinen Fall die Anzahl der Instanzen auf den primären Knotentypen auf einen Wert ab, der unter dem für die Zuverlässigkeitsstufe erforderlichen liegt. Eine Liste der empfohlenen Instanzen finden Sie unter Planen der Service Fabric-Clusterkapazität .
  5. Nachdem alle virtuellen Computer ausgeschaltet sind (dargestellt als „Inaktiv“), zeigt „fabric:/System/InfrastructureService/[Knotenname]“ einen Fehlerstatus an. Anschließend können Sie die Clusterressource aktualisieren, um den Knotentyp zu entfernen. Sie können entweder die Bereitstellung per ARM-Vorlage verwenden oder die Clusterressource über Azure Resource Manager bearbeiten. Dadurch wird ein Clusterupgrade gestartet, bei dem der Dienst „fabric:/System/InfrastructureService/[Knotentyp]“ mit dem Fehlerzustand entfernt wird.
  6. Anschließend können Sie optional die VM-Skalierungsgruppe löschen – die Knoten werden aber in der Ansicht im Service Fabric Explorer weiterhin als „Inaktiv“ angezeigt. Der letzte Schritt ist die Bereinigung mit dem Befehl Remove-ServiceFabricNodeState.

Horizontale Skalierung

Sie können die horizontale Skalierung entweder manuell oder programmgesteuert durchführen.

Hinweis

Wenn Sie einen Knotentyp mit der Dauerhaftigkeitsstufe „Silber“ oder „Gold“ skalieren, wird der Skalierungsvorgang langsam durchgeführt.

Horizontales Skalieren

Skalieren Sie einen Service Fabric-Cluster auf, indem Sie die Anzahl der Instanzen für eine bestimmte VM-Skalierungsgruppe erhöhen. Sie können das Aufskalieren programmgesteuert durchführen, indem Sie mithilfe von AzureClient und der ID für die gewünschte Skalierungsgruppe die Kapazität erhöhen.

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

Für ein manuelles Aufskalieren aktualisieren Sie die Kapazität in der SKU-Eigenschaft der gewünschten VM-Skalierungsgruppe.

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

Horizontales Herunterskalieren

Beim horizontalen Herunterskalieren müssen mehr Aspekte berücksichtigt werden als beim horizontalen Hochskalieren. Beispiel:

  • Service Fabric-Systemdienste werden auf dem primären Knotentyp in Ihrem Cluster ausgeführt. Sie dürfen somit niemals die Anzahl der Instanzen für diesen Knotentyp herunterfahren oder so abskalieren, dass weniger Instanzen vorhanden sind, als durch die Zuverlässigkeitsstufe vorgegeben ist.
  • Für einen zustandsbehafteten Dienst muss eine bestimmte Anzahl von Knoten stets aktiv sein, um die Verfügbarkeit sicherzustellen und den Zustand des Diensts beizubehalten. Sie benötigen mindestens eine Anzahl von Knoten, die der Anzahl der Zielreplikatgruppen der Partition oder des Diensts entspricht.

Beim manuellen Abskalieren gehen Sie folgendermaßen vor:

  1. Führen Sie in PowerShell Disable-ServiceFabricNode mit der Absicht RemoveNode aus, um den Knoten zu deaktivieren, der entfernt werden soll. Entfernen Sie den Knotentyp mit der höchsten Zahl. Entfernen Sie bei einem Cluster mit sechs Knoten beispielsweise die VM-Instanz „MyNodeType_5“.
  2. Führen Sie Get-ServiceFabricNode aus, um sicherzustellen, dass der Status des Knotens tatsächlich in „Deaktiviert“ geändert wurde. Falls nicht, warten Sie, bis der Knoten deaktiviert ist. Dies kann für jeden Knoten einige Stunden dauern. Fahren Sie erst fort, nachdem der Status des Knotens in „Deaktiviert“ geändert wurde.
  3. Verringern Sie die Anzahl der virtuellen Computer in diesem Knotentyp um 1. Damit wird die höchste VM-Instanz entfernt.
  4. Wiederholen Sie ggf. die Schritte 1 bis 3, bis die gewünschte Kapazität bereitgestellt wird. Skalieren Sie auf keinen Fall die Anzahl der Instanzen des primären Knotentyps auf einen Wert ab, der unter dem von der Zuverlässigkeitsstufe vorgegebenen liegt. Eine Liste der empfohlenen Instanzen finden Sie unter Planen der Service Fabric-Clusterkapazität .

Um manuell abzuskalieren, aktualisieren Sie die Kapazität in der SKU-Eigenschaft der gewünschten VM-Skalierungsgruppe.

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

Damit das Abskalieren programmgesteuert durchgeführt werden kann, müssen Sie den Knoten auf das Herunterfahren vorbereiten. Ermitteln Sie den Knoten, der entfernt werden soll (der Knoten der höchsten Instanz). Beispiel:

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();

Deaktivieren und entfernen Sie den Knoten, und verwenden Sie dabei die gleiche FabricClient-Instanz (in diesem Fall client) und die gleiche Knoteninstanz (in diesem Fall instanceIdString), die Sie im vorherigen Code verwendet haben:

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();

Hinweis

Wenn Sie einen Cluster abskalieren, wird der entfernte Knoten bzw. die entfernte VM-Instanz im Service Fabric Explorer mit einem fehlerhaften Zustand angezeigt. Eine Erklärung dieses Verhaltens finden Sie unter Verhaltensweisen von Service Fabric Explorer, die Sie möglicherweise beobachten. Ihre Möglichkeiten:

Zuverlässigkeitsstufen

Die Zuverlässigkeitsstufe ist eine Eigenschaft der Service Fabric-Clusterressource. Sie kann für die einzelnen Knotentypen nicht unterschiedlich konfiguriert werden. Sie steuert den Replikationsfaktor der Systemdienste für den Cluster und ist eine Einstellung auf Ebene der Clusterressource.

Die Zuverlässigkeitsstufe bestimmt die Mindestanzahl von Knoten, über die Ihr primärer Knotentyp verfügen muss. Für die Zuverlässigkeitsstufe können folgende Werte festgelegt werden:

  • Platin: Die Systemdienste werden mit der Replikatgruppen-Zielanzahl 7 und 9 Startknoten ausgeführt.
  • Gold: Die Systemdienste werden mit der Replikatgruppen-Zielanzahl 7 und 7 Startknoten ausgeführt.
  • Silber: Die Systemdienste werden mit der Replikatgruppen-Zielanzahl 5 und 5 Startknoten ausgeführt.
  • Bronze: Die Systemdienste werden mit der Replikatgruppen-Zielanzahl 3 und 3 Startknoten ausgeführt.

Die minimale empfohlene Zuverlässigkeitsstufe ist „Silber“.

Die Zuverlässigkeitsstufe wird im Abschnitt der Eigenschaften der Ressource Microsoft.ServiceFabric/clusters wie folgt festgelegt:

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

Dauerhaftigkeitsstufen

Warnung

Knotentypen, die mit der Dauerhaftigkeitsstufe „Bronze“ ausgeführt werden, erhalten keine Berechtigungen. Die Infrastrukturaufträge, die sich auf die zustandslosen Workloads auswirken, werden nicht angehalten oder verzögert. Dies kann sich auf Ihre Workloads auswirken.

Verwenden Sie die Dauerhaftigkeitsstufe „Bronze“ nur für Knotentypen, die zustandslose Workloads ausführen. Verwenden Sie für Produktionsworkloads mindestens die Dauerhaftigkeitsstufe „Silber“, um Zustandskonsistenz sicherzustellen. Wählen Sie die entsprechende Zuverlässigkeitsstufe basierend auf den Anweisungen in der Dokumentation zur Kapazitätsplanung aus.

Die Dauerhaftigkeitsstufe muss in zwei Ressourcen festgelegt werden: Eine ist das Erweiterungsprofil der VM-Skalierungsgruppenressource:

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

Die andere finden Sie unter nodeTypes in der Ressource Microsoft.ServiceFabric/Clusterressource:

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

Nächste Schritte