Freigeben über


Architekturstrategien für das Entwerfen einer zuverlässigen Skalierungsstrategie

Gilt für diese Empfehlung der Azure Well-Architected Framework-Zuverlässigkeitsprüfliste:

RE:06 Implementieren Sie eine zeitnahe und zuverlässige Skalierungsstrategie auf Anwendungs-, Daten- und Infrastrukturebene. Basieren Sie auf der Skalierungsstrategie auf tatsächlichen oder vorhergesagten Nutzungsmustern, und minimieren Sie manuelle Eingriffe.

In diesem Leitfaden werden die Empfehlungen für das Entwerfen einer zuverlässigen Skalierungsstrategie beschrieben.

Definitionen

Begriff Definition
Vertikale Skalierung Ein Skalierungsansatz, der vorhandenen Ressourcen Rechenkapazität hinzufügt.
Horizontale Skalierung Ein Skalierungsansatz, der Instanzen eines bestimmten Ressourcentyps hinzufügt.
Automatische Skalierung Ein Skalierungsansatz, der Ressourcen automatisch hinzufügt oder entfernt, wenn eine Reihe von Bedingungen erfüllt ist.

Hinweis

Skalierungsvorgänge können statisch (regelmäßig geplante tägliche Skalierung, um normale Lademuster zu berücksichtigen), automatisch (ein automatisierter Prozess als Reaktion auf erfüllte Bedingungen) oder manuell (ein Operator führt einen einmaligen Skalierungsvorgang als Reaktion auf eine unerwartete Laständerung aus). Sowohl die vertikale als auch die horizontale Skalierung können über jede dieser Methoden ausgeführt werden. Die automatische vertikale Skalierung erfordert jedoch eine zusätzliche benutzerdefinierte Automatisierungsentwicklung und kann abhängig von den skalierten Ressourcen zu Ausfallzeiten führen.

Das System muss so konzipiert sein, dass es horizontal skalierbar ist. Vermeiden Sie Annahmen zur Instanzaffinität. Entwerfen Sie keine Lösungen, die erfordern, dass der Code immer in einer bestimmten Instanz eines Prozesses ausgeführt wird. Gehen Sie beim horizontalen Skalieren eines Clouddiensts oder einer Website nicht davon aus, dass eine Reihe von Anforderungen aus derselben Quelle immer an dieselbe Instanz weitergeleitet werden. Aus demselben Grund entwerfen Sie Dienste so, dass sie zustandslos sind, um zu vermeiden, dass eine Reihe von Anforderungen von einer Anwendung immer an dieselbe Instanz eines Diensts weitergeleitet werden muss. Beim Entwerfen eines Diensts, der Nachrichten aus einer Warteschlange liest und verarbeitet, machen Sie keine Annahmen darüber, welche Instanz des Diensts eine bestimmte Nachricht verarbeitet. Die automatische Skalierung könnte mehr Instanzen eines Diensts starten, da die Warteschlangenlänge wächst. Das Muster "Konkurrierende Verbraucher " beschreibt, wie dieses Szenario behandelt wird.

Um kritische Zeit bei entscheidungen zur automatischen Skalierung zu verwenden, ist es hilfreich, dass eine Bibliothek automatisch die relevanten Informationen zu den Kopfzeilen von Nachrichten hinzufügt, während sie gesendet und verarbeitet werden. Eine Bibliothek, die diese Funktionalität bereitstellt, ist NServiceBus.

Entwerfen nach Lademustern

Um eine zuverlässige Skalierungsstrategie für Ihre Workloads zu entwerfen, konzentrieren Sie sich auf die Identifizierung von Lademustern für die Benutzer- und Systemflüsse für jede Workload, die zu einem Skalierungsvorgang führt. Hier sind Beispiele für verschiedene Lademuster und ihre entsprechenden Skalierungsstrategien:

  • Statisch: Jede Nacht um 11 PM EST fällt die Anzahl der aktiven Benutzer Ihrer Anwendung unter 100, und die CPU-Auslastung für die App-Server sinkt um 90% über alle Knoten hinweg. Um dies zu behandeln, können Sie die Skalierung Ihrer Computeknoten auf die Mindestanzahl (2) zwischen 11:00 und 6:00 Uhr EST planen.

  • Dynamisch, normal und vorhersagbar: Jeden Montagmorgen melden sich 1000 Mitarbeiter in mehreren Regionen beim ERP-System an. Um dies zu verwalten, können Sie die Skalierung Ihrer Computeknoten auf die normale tägliche Kapazität planen, bevor die erste Region mit der Arbeit beginnt.

  • Dynamisch, unregelmäßig und vorhersagbar: Ein Produktstart erfolgt am ersten Tag des Monats, und es gibt historische Daten aus früheren Starts, wie der Datenverkehr in diesen Situationen steigt. Um dies zu beheben, können Sie eine einmalige geplante Skalierung Ihrer Compute- und Datenbankinstanzen am Morgen eines Produktstarts definieren und nach einer Woche zurückskalieren.

  • Dynamisch, unregelmäßig und unvorhersehbar: Ein großes Ereignis führt zu einer Spitzennachfrage für ein Produkt. Beispielsweise können Unternehmen, die Entfeuchter produzieren und verkaufen, einen plötzlichen Verkehrsanstieg nach einem Hurrikan oder einem anderen Hochwasserereignis erleben, wenn Menschen in betroffenen Gebieten Räume in ihren Häusern trockenen müssen. Um dies zu behandeln, können Sie Schwellenwerte für die automatische Skalierung festlegen, um ungeplante Datenverkehrsspitzen zu berücksichtigen.

Anpassen von Skalierungsstrategien an einzelne Komponenten oder Abläufe

Es gibt keine 1-size-fits-all-Skalierungsstrategie. Verschiedene Clouddienste haben unterschiedliche Unterstützungsgrade bei der Skalierung und verschiedene Ansätze für die Skalierung. Aus diesem Grund ist es wichtig zu verstehen, wie die Skalierung in allen Arbeitsauslastungskomponenten unterstützt und implementiert wird, um Ihre allgemeine Skalierungsstrategie zu entwerfen. Je nach Architekturdesign können Sie Skalierungsstrategien auf einzelner Komponentenebene oder auf Flussebene anwenden. Berücksichtigen Sie bei der Ermittlung der Implementierung der Skalierung über Ihre Workload hinweg die folgenden Faktoren:

  • Diese Komponenten, die nicht skaliert werden können. Ein Beispiel wäre große relationale Datenbanken, die keine Sharding aktiviert haben und ohne erhebliche Auswirkungen nicht umgestaltet werden können. Dokumentieren Sie die von Ihrem Cloudanbieter veröffentlichten Ressourcenlimits, und überwachen Sie diese Ressourcen genau. Fügen Sie diese spezifischen Ressourcen in Ihre zukünftige Planung für die Migration zu skalierbaren Diensten ein.

  • Die Beziehung der Komponenten des Flusses in Bezug auf die Reihenfolge der Skalierungsvorgänge. Stellen Sie sicher, dass Sie eine nachgelagerte Komponente nicht versehentlich überladen, indem Sie zuerst eine Upstreamkomponente skalieren.

  • Alle zustandsbehafteten Anwendungselemente, die durch einen Skalierungsvorgang und jede implementierte Sitzungsaffinität (oder Sitzungsverknüppelung) unterbrochen werden können. Klebigkeit kann Ihre Skalierungsfähigkeit einschränken und einzelne Fehlerpunkte einführen. Gestalten Sie Ihre Arbeitsauslastung so, dass sie in praktischer Weise zustandslos ist.

  • Potenzielle Engpässe. Durch das Skalieren wird nicht jedes Leistungsproblem behoben. Wenn beispielsweise Ihre Back-End-Datenbank der Engpass ist, hilft das Hinzufügen weiterer Webserver nicht. Identifizieren und beheben Sie zuerst die Engpässe im System, bevor Sie nur weitere Instanzen hinzufügen. Zustandsbehaftete Teile des Systems sind die wahrscheinlichste Ursache von Engpässen.

  • Behandeln von lang ausgeführten Aufgaben. Entwerfen Sie eine lange ausgeführte Aufgabe, um sowohl das Skalieren als auch die Skalierung zu unterstützen. Ohne sorgfalt könnte eine solche Aufgabe verhindern, dass eine Instanz eines Prozesses sauber heruntergefahren wird, wenn das System skaliert wird. Oder es können Daten verloren gehen, wenn der Prozess forcibly beendet wird. Im Idealfall sollten Sie eine lang andauernde Aufgabe umgestalten und die Verarbeitung, die sie ausführt, in kleinere, diskrete Blöcke aufteilen. Das Muster "Rohre und Filter " bietet ein Beispiel dafür, wie Sie diese Lösung erreichen können.

Auswählen der richtigen Technologie

Wenn Sie fundierte Technologieentscheidungen treffen, die die Skalierung berücksichtigen, können Sie sicherstellen, dass Ihre Workload Ihre Zuverlässigkeitsziele erfüllen kann, während sich Ihre Workload weiterentwickelt. Recherchieren Sie die Skalierungsfähigkeiten für verschiedene Ressourcen, die ähnliche Funktionen bieten, und wählen Sie die beste Kombination für Ihre zukünftigen Wachstumspläne aus. Sie können z. B. mehrere Optionen für Datenspeicher haben, die die jeweilige Art von Datenbanken hosten können, die Sie verwenden werden. Eine Wahl kann jedoch eine bessere Skalierungsfunktionalität haben als andere, was eine bessere Wahl für Ihre Workload machen könnte.

  • Nutzen Sie Dienste, die automatisch skaliert werden. Verwenden Sie saaS-Dienste, die automatisch ohne Konfiguration oder Eingabe skaliert werden. Globale Dienste wie Microsoft Entra ID bieten diese Funktionalität. Serverlose Lösungen bieten auch eine automatische Skalierung und können für viele Anwendungsfälle eine gute Wahl sein.

  • Nutzen Sie die Vorteile von Diensten, die out-of-the-box scaling bieten. Viele PaaS-Dienste bieten integrierte, einfach zu verwendende Skalierungsfunktionen, die Sie so konfigurieren können, dass sie Ihren Zuverlässigkeitsanforderungen entsprechen. Sie können z. B. die Durchsatzskalierung für Cosmos DB so konfigurieren, dass sie Ihren speziellen Anforderungen entspricht.

Automatisieren der Skalierung

Automatisieren Sie die Skalierungsvorgänge für Ihre Workloadkomponenten, soweit sie praktisch sind. Wenn Sie Ressourcen verwenden, die über konfigurierbare Funktionen für die automatische Skalierung verfügen, erstellen Sie die Konfigurationslogik in Ihren Infrastruktur-as-Code (IaC)-Bereitstellungscode. Wenn Sie Ressourcen verwenden, die keine automatische Skalierung bieten, erstellen Sie die Automatisierung, um Skalierungsvorgänge mit systemeigenen Automatisierungstools durchzuführen und den Automatisierungscode in Ihren IaC-Code einzuschließen.

Wenn Sie Ihre automatische Skalierungsstrategie auf Leistungsindikatoren basieren, die Geschäftsprozesse messen, z. B. die Anzahl der Bestellungen pro Stunde oder die durchschnittliche Laufzeit einer komplexen Transaktion, stellen Sie sicher, dass Sie die Beziehung zwischen den Ergebnissen dieser Arten von Leistungsindikatoren und den tatsächlichen Anforderungen an die Berechnungskapazität vollständig verstehen. Es kann erforderlich sein, mehr als eine Komponente oder Computeeinheit als Reaktion auf Änderungen an Geschäftsprozesszählern zu skalieren.

Denken Sie daran, dass die automatische Skalierung möglicherweise nicht der am besten geeignete Mechanismus ist, um einen plötzlichen Platz in einer Workload zu behandeln. Es dauert Zeit, um neue Instanzen eines Diensts bereitzustellen und zu starten oder Ressourcen zu einem System hinzuzufügen, und die Spitzennachfrage kann bis zum Zeitpunkt der Verfügbarkeit dieser zusätzlichen Ressourcen übergeben werden. In diesem Szenario ist es möglicherweise besser, den Dienst zu drosseln. Weitere Informationen finden Sie unter Muster „Drosselung“.

Wenn Sie hingegen die Kapazität benötigen, alle Anforderungen zu verarbeiten, wenn das Volumen schnell schwankt und die Kosten kein wichtiger Faktor sind, sollten Sie eine aggressive Autokalierungsstrategie verwenden, die mehr Instanzen schneller startet. Sie können auch eine geplante Richtlinie verwenden, die eine ausreichende Anzahl von Instanzen für die maximale Auslastung startet, bevor diese Auslastung erwartet wird.

Wählen Sie geeignete Skalierungseinheiten aus.

Basieren Sie ihre Skalierungsstrategie auf Skalierungseinheiten, bei denen es sich um die logische Gruppierung von Komponenten handelt, die zusammen skaliert werden sollen, und die zu verwendenden Skalierungsschritte (z. B. das Verschieben von einer VM-SKU zu einer anderen). Zu berücksichtigende Optionen sind:

  • Ressourcen einzeln skalieren: Möglicherweise müssen Sie nur einzelne virtuelle Computer oder Datenbanken skalieren.

  • Gleichzeitiges Skalieren einer vollständigen Komponente: Beispielsweise verfügen Sie möglicherweise über eine Microservice-API, die aus einem App-Dienst, einer Datenbank und einer Warteschlange besteht, die gleichzeitig skaliert werden muss.

  • Skalieren der vollständigen Lösung: Bei komplexen oder unternehmenskritischen Workloads kann die Skalierung der gesamten Lösung als Bereitstellungsstempel Ihre Skalierungsstrategie vereinfachen. Anstatt die Skalierungszeitpläne und die automatischen Skalierungsschwellenwerte vieler unterschiedlicher Ressourcen zu verwalten, können Sie einen begrenzten Satz von Skalierungsdefinitionen auf einen Bereitstellungsstempel anwenden und diese dann bei Bedarf spiegeln.

Von Bedeutung

Legen Sie einen Höchstgrenzwert für die Anzahl der Skalierungseinheiten fest, die automatisch zugeordnet werden können, um übermäßige Kosten zu vermeiden.

Optimieren der Initialisierungszeit der Skalierungseinheit

Beachten Sie beim Entwerfen Ihrer Skalierungsstrategie, dass unterschiedliche Dienste auf unterschiedlichen Zeitskalen skaliert werden. Es gibt einige Dienste, die nahezu sofort skaliert werden und andere, die viel langsamer skaliert werden. Beispielsweise können API-Verwaltungsinstanzen bis zu 45 Minuten dauern, um ihre Skalierungsvorgänge abzuschließen. Um die Zeitskala des Skalierungsvorgangs zu berücksichtigen, planen Sie ordnungsgemäß, den Skalierungsvorgang auszuführen, bevor die erwartete erhöhte Last auf Ihre Workload trifft. Weitere Empfehlungen, die sie berücksichtigen sollten, sind:

  • Initialisieren Sie Knoten, die bereitgestellt werden, um die für die Initialisierung erforderliche Zeit zu reduzieren.

  • Lassen Sie eine Pufferzeit um Konfigurationsänderungen zu, bevor Sie weitere Änderungen vornehmen oder das System auf ungewöhnliche Weise verwenden. Beispielsweise können Sie eine App-Gateway-Back-End-Instanz über eine Regeländerung verlagern. Sie müssen warten, bis Verbindungen aus dieser Instanz entwässert werden, bevor sie sicher entfernt werden können.

  • Überbereitstellungsressourcen zur Verarbeitung erhöhter Last während der Skalierung. Sie können sicherstellen, dass VMs normalerweise mit 75% Auslastungskapazität ausgeführt werden, um sicherzustellen, dass sie erhöhte Last verarbeiten können, während die horizontale Skalierung stattfindet.

  • Optimieren Sie Ihre Skalierungsschwellenwerte mit Überwachung. Verwenden Sie Ihre Kapazitätsüberwachung, um sicherzustellen, dass Ihre Skalierungsschwellenwerte zum Auslösen von Skalierungsvorgängen verwendet werden.

Skalieren von Datenspeichern mithilfe von Sharding und Partitionierung

Optimieren Sie die Zuverlässigkeit Ihrer Datenmenge, indem Sie sie in Ihre Skalierungsstrategie einschließen. Durch die Partitionierung von Daten wird eine Datenbank über logische oder physische Speicherressourcen verteilt, wobei einzelne Fehlerpunkte entfernt werden. Wählen Sie die beste Partitionierungsstrategie für Ihren Anwendungsfall aus.

  • Horizontale Partitionierung (Sharding): Partitionen (Shards) werden in separaten Datenspeichern platziert, aber alle Partitionen weisen dasselbe Schema auf. Jeder Shard enthält eine Teilmenge der Datenbank. Dies ist ein guter Ansatz zur Optimierung der Zuverlässigkeit, da es hilft, den Lastenausgleich zu erleichtern und den Aufwand für Vorgänge beim Umgang mit Problemen zu minimieren. Shards können für höhere Zuverlässigkeit repliziert werden.

  • Vertikale Partitionierung: Jede Partition enthält eine Teilmenge der Felder für Elemente im Datenspeicher. Die Felder werden nach ihrem Verwendungsmuster unterteilt.

  • Funktionale Partitionierung: Daten werden so aggregiert, wie jeder begrenzungsbezogene Kontext im System die Daten verwendet.

Erwägen Sie die Kombination dieser Strategien beim Entwerfen eines Partitionierungsschemas. Beispielsweise können Sie Daten in Shards unterteilen und dann die vertikale Partitionierung verwenden, um die Daten in den einzelnen Shards weiter zu unterteilen.

Optimieren Sie Ihre Partitionsstrategie für Skalierbarkeit. Analysieren Sie Datenzugriffsmuster, um zu bestimmen, welche Vorgänge die meisten Verarbeitungsressourcen erfordern und ihre Partitionen ausgleichen, um sicherzustellen, dass jeder über genügend Ressourcen verfügt, um Skalierbarkeitsanforderungen zu erfüllen.

Ausführliche Anleitungen zum Partitionieren und Sharding finden Sie im Entwurfshandbuch

Überwachen der Skalierungsvorgänge

Der Automatische Skalierungsmechanismus sollte den automatischen Skalierungsprozess überwachen und die Details der einzelnen automatischen Ereignisse protokollieren (was ausgelöst wurde, welche Ressourcen hinzugefügt oder entfernt wurden und wann). Wenn Sie einen benutzerdefinierten Mechanismus für die automatische Skalierung erstellen, stellen Sie sicher, dass sie diese Funktion enthält. Analysieren Sie die Informationen proaktiv, um die Effektivität der automatischen Skalierungsstrategie zu messen und bei Bedarf zu optimieren.

Azure-Unterstützung

Eine automatische Skalierungsfunktion ist in vielen Azure-Diensten verfügbar. Dadurch können Sie bedingungen ganz einfach konfigurieren, um Instanzen automatisch horizontal zu skalieren. Einige Dienste verfügen über eingeschränkte oder keine integrierte Funktionalität, die automatisch skaliert werden kann. Dokumentieren Sie daher diese Fälle, und definieren Sie Prozesse für die Skalierung.

Viele Azure-Dienste bieten APIs, mit denen Sie benutzerdefinierte automatische Skalierungsvorgänge mithilfe von Azure Automation entwerfen können, z. B. die Codebeispiele bei Autoscale Ihres Azure IoT Hub. Sie können Tools wie KEDA für die ereignisgesteuerte Automatische Skalierung verwenden, die in Azure Kubernetes Service und Azure Container Apps verfügbar ist.

Azure Monitor autoscale bietet eine allgemeine Reihe von automatischen Skalierungsfunktionen für Azure Virtual Machine Scale Sets, Azure App Service, Azure Spring Apps und vieles mehr. Die Skalierung kann für einen Zeitplan oder basierend auf einer Laufzeitmetrik ausgeführt werden, z. B. CPU- oder Arbeitsspeicherauslastung. Im Azure Monitor-Handbuch finden Sie bewährte Methoden.

Kompromisse

Kompromiss: Die Skalierung nach oben hat Kostenauswirkungen. Optimieren Sie ihre Strategie also so schnell wie möglich, um Kosten unter Kontrolle zu halten. Stellen Sie sicher, dass die Automatisierung, die Sie zum Skalieren nach oben verwenden, auch Trigger zum Herunterskalieren hat.

Beispiel

Weitere Informationen finden Sie in den AKS-Referenzarchitekturskalierungsanleitungen.

Zuverlässigkeitscheckliste

Lesen Sie die vollständigen Empfehlungen.