Skalierung basierend auf Amazon SQS - Amazon EC2 Auto Scaling

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Skalierung basierend auf Amazon SQS

Wichtig

Die folgenden Informationen und Schritte zeigen Ihnen, wie Sie den Amazon SQS-Warteschlangen-Backlog pro Instance anhand des ApproximateNumberOfMessages Queue-Attributs berechnen, bevor Sie ihn als benutzerdefinierte Metrik für veröffentlichen. CloudWatch Sie können jetzt jedoch die Kosten und den Aufwand für die Veröffentlichung Ihrer eigenen Metrik sparen, indem Sie metrische Berechnungen verwenden. Weitere Informationen finden Sie unter Erstellen einer Zielnachverfolgungs-Skalierungsrichtlinie für Amazon EC2 Auto Scaling mit Metrikberechnungen.

In diesem Abschnitt erfahren Sie, wie Sie Ihre Auto-Scaling-Gruppe als Reaktion auf Änderungen der Systemauslastung in einer Amazon Simple Queue Service (Amazon SQS)-Warteschlange skalieren. Weitere Informationen zur Verwendung von Amazon SQS finden Sie im Amazon Simple Queue Service-Entwicklerhandbuch.

Es gibt einige Szenarien, in denen Sie als Reaktion auf Aktivitäten in einer Amazon SQS-Warteschlange eine Skalierung erwägen könnten. Angenommen, Sie haben eine Webanwendung, mit der Benutzer Bilder hochladen und online verwenden können. In diesem Szenario erfordert jedes Image eine Größenanpassung und Codierung, bevor es veröffentlicht werden kann. Die App wird auf EC2-Instances einer Auto-Scaling-Gruppe ausgeführt und ist für die Verarbeitung Ihrer typischen Upload-Raten konfiguriert. Fehlerhafte Instances werden beendet und ersetzt, um stets dieselbe Anzahl an Instances zu nutzen. Die App platziert die Raw-Bitmap-Daten der Bilder in eine SQS-Warteschlange für die Verarbeitung. Sie verarbeitet die Bilder und veröffentlicht die verarbeiteten Bilder, wo sie von Benutzern angezeigt werden können. Die Architektur für dieses Szenario funktioniert gut, wenn die Anzahl der Image-Uploads nicht im Laufe der Zeit variiert. Wenn sich die Anzahl der Uploads jedoch mit der Zeit ändert, könnten Sie eine dynamische Skalierung in Betracht ziehen, um die Kapazität Ihrer Auto-Scaling-Gruppe zu skalieren.

Zielverfolgung mit der richtigen Metrik verwenden

Wenn Sie eine Skalierungsrichtlinie für die Ziel-Nachverfolgung verwenden, die auf einer benutzerdefinierten Amazon SQS-Warteschlangenmetrik basiert, kann die dynamische Skalierung eine effektivere Anpassung an die Bedarfskurve Ihrer Anwendung vornehmen. Weitere Informationen zum Auswählen von Metriken für die Zielverfolgung finden Sie unter Auswahl von Metriken.

Das Problem bei der Verwendung einer CloudWatch Amazon SQS-Metrik wie ApproximateNumberOfMessagesVisible für die Zielverfolgung besteht darin, dass sich die Anzahl der Nachrichten in der Warteschlange möglicherweise nicht proportional zur Größe der Auto Scaling Scaling-Gruppe ändert, die Nachrichten aus der Warteschlange verarbeitet. Das liegt daran, dass die Anzahl der Nachrichten in der SQS-Warteschlange nicht alleine die Anzahl der erforderlichen Instances definiert. Tatsächlich kann die Anzahl der Instances in Ihrer Auto-Scaling-Gruppe von mehreren Faktoren abhängen, einschließlich der für die Verarbeitung einer Nachricht benötigten Zeit und der akzeptablen zeitlichen Latenz (Warteschlangenverzögerung).

Die Lösung besteht darin, eine Rückstand pro Instance-Metrik zu verwenden, deren Zielwert der zulässige Rückstand pro Instance ist, der aufrechterhalten werden soll. Sie können diese Zahlen wie folgt berechnen:

  • Rückstand pro Instance: Um den Rückstand pro Instance zu berechnen, verwenden Sie zunächst das Warteschlangenattribut ApproximateNumberOfMessages, um die Länge der SQS-Warteschlange (Anzahl der Nachrichten, die zum Abrufen aus der Warteschlange verfügbar sind) zu bestimmen. Dividieren Sie diese Zahl durch die laufende Kapazität der Flotte, welche bei einer Auto-Scaling-Gruppe die Anzahl der Instances mit dem Status InService ist, um so den Rückstand pro Instance zu erhalten.

  • Zulässiger Rückstand pro Instance: Um Ihren Zielwert zu berechnen, bestimmen Sie zunächst, welche zeitliche Latenz Ihre Anwendung akzeptieren kann. Teilen Sie diesen akzeptablen Latenzwert dann durch die durchschnittliche Zeit, die eine EC2-Instance für die Verarbeitung einer Nachricht benötigt.

Ein Beispiel: Angenommen, Sie verfügen über eine Auto-Scaling-Gruppe mit 10 Instances und die Anzahl sichtbarer Nachrichten in der Warteschlange (ApproximateNumberOfMessages) ist 1 500. Wenn die durchschnittliche Verarbeitungszeit pro Nachricht 0,1 Sekunden beträgt und die längste akzeptable Latenz 10 Sekunden ist, dann ist der zulässige Rückstand pro Instance 10/0,1, was 100 Nachrichten entspricht. Dies bedeutet, dass 100 der Zielwert für Ihre Ziel-Nachverfolgungsrichtlinie ist. Wenn der Rückstand pro Instance den Zielwert erreicht, wird ein Aufskalierungsereignis ausgelöst. Da der Rückstand pro Instance bereits bei 150 Nachrichten liegt (1 500 Nachrichten / 10 Instances), wird Ihre Gruppe um fünf Instances aufskaliert, um die Proportion zum Zielwert beizubehalten.

Die folgenden Verfahren veranschaulichen, wie Sie die benutzerdefinierte Metrik veröffentlichen und die Skalierungsrichtlinie für die Ziel-Nachverfolgung erstellen, die Ihre Auto-Scaling-Gruppe zum Skalieren basierend auf diesen Berechnungen konfiguriert.

Wichtig

Denken Sie daran, zur Kostensenkung stattdessen metrische Berechnungen zu verwenden. Weitere Informationen finden Sie unter Erstellen einer Zielnachverfolgungs-Skalierungsrichtlinie für Amazon EC2 Auto Scaling mit Metrikberechnungen.

Es gibt drei Hauptkomponenten dieser Konfiguration:

  • Eine Auto-Scaling-Gruppe zur Verwaltung von EC2-Instances für die Verarbeitung von Nachrichten aus einer SQS-Warteschlange.

  • Eine benutzerdefinierte Metrik, die an Amazon CloudWatch gesendet wird und die Anzahl der Nachrichten in der Warteschlange pro EC2-Instance in der Auto Scaling Scaling-Gruppe misst.

  • Eine Zielverfolgungsrichtlinie, die Ihre Auto Scaling Scaling-Gruppe so konfiguriert, dass sie auf der Grundlage der benutzerdefinierten Metrik und eines festgelegten Zielwerts skaliert. CloudWatch Alarme rufen die Skalierungsrichtlinie auf.

Das folgende Diagramm illustriert die Architektur dieser Konfiguration.


                        Warteschlangen-Architekturdiagramm für Amazon EC2 Auto Scaling

Einschränkungen und Voraussetzungen

Um diese Konfiguration verwenden zu können, müssen Sie die folgenden Einschränkungen beachten:

  • Sie müssen das AWS CLI oder ein SDK verwenden, um Ihre benutzerdefinierte Metrik zu CloudWatch veröffentlichen. Anschließend können Sie Ihre Metrik mit dem überwachen AWS Management Console.

  • Die Amazon EC2 Auto Scaling-Konsole unterstützt Skalierungsrichtlinien zur Ziel-Nachverfolgung, die benutzerdefinierte Metriken verwenden. Sie müssen das AWS CLI oder ein SDK verwenden, um eine benutzerdefinierte Metrik für Ihre Skalierungsrichtlinie anzugeben.

In den folgenden Abschnitten erfahren Sie, wie Sie das AWS CLI für die Aufgaben verwenden, die Sie ausführen müssen. Um beispielsweise metrische Daten abzurufen, die die aktuelle Nutzung der Warteschlange widerspiegeln, verwenden Sie den get-queue-attributesSQS-Befehl. Stellen Sie sicher, dass die CLI installiert und konfiguriert ist.

Bevor Sie beginnen, müssen Sie über eine Amazon SQS-Warteschlange verfügen. In den folgenden Abschnitten wird davon ausgegangen, dass Sie bereits über eine Warteschlange (Standard oder FIFO), eine Auto-Scaling-Gruppe und EC2-Instances mit der Anwendung verfügen, welche die Warteschlange verwendet. Weitere Informationen zu Amazon SQS, finden Sie unter Entwicklerhandbuch für Amazon Simple Queue Service.

Konfigurieren der Skalierung basierend auf Amazon SQS

Schritt 1: Erstellen Sie eine CloudWatch benutzerdefinierte Metrik

Eine benutzerdefinierte Metrik wird mit einem Metriknamen und Namespace Ihrer Wahl definiert. Namespaces für benutzerdefinierte Metriken können nicht mit AWS/ beginnen. Weitere Informationen zum Veröffentlichen von benutzerdefinierten Metriken finden Sie unter dem Thema Veröffentlichen von benutzerdefinierten Kennzahlen im CloudWatch Amazon-Benutzerhandbuch.

Gehen Sie wie folgt vor, um die benutzerdefinierte Metrik zu erstellen, indem Sie zunächst die Informationen aus Ihrem AWS Konto lesen. Berechnen Sie dann den Rückstand pro Instance-Metrik, wie in einem früheren Abschnitt empfohlen. Veröffentlichen Sie diese Zahl abschließend mit CloudWatch einer Genauigkeit von 1 Minute. Wenn möglich, empfehlen wir dringend, anhand von Metriken mit einer Granularität von 1 Minute zu skalieren, um eine schnellere Reaktion auf Änderungen der Systemauslastung zu gewährleisten.

Um eine CloudWatch benutzerdefinierte Metrik zu erstellen ()AWS CLI
  1. Verwenden Sie den get-queue-attributesSQS-Befehl, um die Anzahl der Nachrichten abzurufen, die in der Warteschlange warten (ApproximateNumberOfMessages).

    aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456789/MyQueue \ --attribute-names ApproximateNumberOfMessages
  2. Verwenden Sie den describe-auto-scaling-groupsBefehl, um die laufende Kapazität der Gruppe abzurufen, d. h. die Anzahl der Instanzen im InService Lebenszyklusstatus. Dieser Befehl gibt die Instances einer Auto-Scaling-Gruppe zusammen mit ihren Lebenszyklusstatus zurück.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg
  3. Berechnen Sie den Rückstand pro Instance, indem Sie die ungefähre Anzahl der Nachrichten, die für den Abruf aus der Warteschlange verfügbar sind, durch die laufende Kapazität der Gruppe dividieren.

  4. Erstellen Sie ein Skript, das jede Minute ausgeführt wird, um den Backlog-Wert pro Instanz abzurufen und ihn in einer CloudWatch benutzerdefinierten Metrik zu veröffentlichen. Beim Veröffentlichen einer benutzerdefinierten Metrik geben Sie den Namen, den Namespace, die Einheit, den Wert und null oder mehr Dimensionen für die Metrik an. Dimensionen bestehen aus einem Dimensionsnamen und einem Dimensionswert.

    Um Ihre benutzerdefinierte Metrik zu veröffentlichen, ersetzen Sie kursiv gedruckte Platzhalterwerte durch Ihren bevorzugten Metriknamen, den Wert der Metrik, einen Namespace (sofern er nicht mit "AWS„beginnt) und Dimensionen (optional) und führen Sie dann den folgenden Befehl aus. put-metric-data

    aws cloudwatch put-metric-data --metric-name MyBacklogPerInstance --namespace MyNamespace \ --unit None --value 20 --dimensions MyOptionalMetricDimensionName=MyOptionalMetricDimensionValue

Nachdem Ihre Anwendung die gewünschte Metrik ausgegeben hat, werden die Daten an gesendet. CloudWatch Die Metrik ist in der CloudWatch Konsole sichtbar. Sie können darauf zugreifen, indem Sie sich bei der anmelden AWS Management Console und zu der CloudWatch Seite navigieren. Anschließend können Sie die Metrik anzeigen, indem Sie zur Seite der Metriken navigieren oder im Suchfeld danach suchen. Informationen zum Anzeigen von Metriken finden Sie unter Verfügbare Metriken anzeigen im CloudWatch Amazon-Benutzerhandbuch.

Schritt 2: Erstellen einer Skalierungsrichtlinie für die Ziel-Nachverfolgung

Die von Ihnen erstellte Metrik kann jetzt zu einer Skalierungsrichtlinie für die Zielnachverfolgung hinzugefügt werden.

So erstellen Sie eine Skalierungsrichtlinie für die Ziel-Nachverfolgung (AWS CLI)
  1. Verwenden Sie den folgenden cat-Befehl, um einen Zielwert für Ihre Skalierungsrichtlinie und eine benutzerdefinierte Metrikspezifikation in einer JSON-Datei namens config.json in Ihrem Stammverzeichnis zu speichern. Ersetzen Sie jedes Platzhalter für Benutzereingaben durch Ihre eigenen Informationen. Berechnen Sie für den TargetValue die Metrik für den akzeptablen Rückstand pro Instance und geben Sie sie hier ein. Basieren Sie die Berechnung dieser Zahl auf einem normalen Latenzwert und teilen Sie ihn durch die durchschnittliche Zeit, die für die Verarbeitung einer Nachricht benötigt wird, wie in einem vorherigen Abschnitt beschrieben.

    Wenn Sie keine Dimensionen für die Metrik angegeben haben, die Sie in Schritt 1 erstellt haben, nehmen Sie keine Dimensionen in die benutzerdefinierte Metrikspezifikation auf.

    $ cat ~/config.json { "TargetValue":100, "CustomizedMetricSpecification":{ "MetricName":"MyBacklogPerInstance", "Namespace":"MyNamespace", "Dimensions":[ { "Name":"MyOptionalMetricDimensionName", "Value":"MyOptionalMetricDimensionValue" } ], "Statistic":"Average", "Unit":"None" } }
  2. Verwenden Sie den put-scaling-policyBefehl zusammen mit der config.json Datei, die Sie im vorherigen Schritt erstellt haben, um Ihre Skalierungsrichtlinie zu erstellen.

    aws autoscaling put-scaling-policy --policy-name sqs100-target-tracking-scaling-policy \ --auto-scaling-group-name my-asg --policy-type TargetTrackingScaling \ --target-tracking-configuration file://~/config.json

    Dabei werden zwei Alarme erstellt: einer für die Aufwärtsskalierung und einer für die Abwärtsskalierung. Es gibt auch den Amazon-Ressourcennamen (ARN) der Richtlinie zurück CloudWatch, mit der die CloudWatch Skalierung aufgerufen wird, wenn der metrische Schwellenwert überschritten wird.

Schritt 3: Testen Ihrer Skalierungsrichtlinie

Wenn die Einrichtung abgeschlossen ist, überprüfen Sie, ob Ihre Skalierungsrichtlinie funktioniert. Sie testen sie, indem Sie die Anzahl der Nachrichten in der SQS-Warteschlange vergrößern und dann prüfen, ob die Auto-Scaling-Gruppe eine weitere EC2-Instance gestartet hat. Gleichermaßen testen Sie sie, indem Sie die Anzahl der Nachrichten in der SQS-Warteschlange verkleinern und dann prüfen, ob die Auto-Scaling-Gruppe eine EC2-Instance beendet hat.

So testen Sie die Funktion für die horizontale Skalierung nach oben
  1. Folgen Sie den Schritten unter Erstellen einer Amazon SQS SQS-Standardwarteschlange und Senden einer Nachricht oder Erstellen einer Amazon SQS SQS-FIFO-Warteschlange und Senden einer Nachricht, um Nachrichten zu Ihrer Warteschlange hinzuzufügen. Stellen Sie sicher, dass Sie die Anzahl der Nachrichten in der Warteschlange so erhöht haben, dass die Metrik für den Rückstand pro Instance den Zielwert überschreitet.

    Es kann einige Minuten dauern, bis Ihre Änderungen den Alarm auslösen.

  2. Verwenden Sie den describe-auto-scaling-groupsBefehl, um zu überprüfen, ob die Gruppe eine Instance gestartet hat.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg
So testen Sie die Funktion für die horizontale Skalierung nach oben
  1. Folgen Sie den Schritten unter Nachricht empfangen und löschen (Konsole), um Nachrichten aus der Warteschlange zu löschen. Stellen Sie sicher, dass Sie die Anzahl der Nachrichten in der Warteschlange so verringert haben, dass die Metrik für den Rückstand pro Instance den Zielwert unterschreitet.

    Es kann einige Minuten dauern, bis Ihre Änderungen den Alarm auslösen.

  2. Verwenden Sie den describe-auto-scaling-groupsBefehl, um zu überprüfen, ob die Gruppe eine Instanz beendet hat.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg

Amazon SQS und Instance-Skaliterungsschutz

Sofern beim Beenden einer Instance noch nicht verarbeitete Nachrichten vorhanden sind, werden diese an die SQS-Warteschlange zurückgegeben und können von einer anderen ausgeführten Instance verarbeitet werden. Für Anwendungen, in denen Aufgaben mit langer Ausführung ausgeführt werden, können Sie optional den Instance-Scale-in-Schutz verwenden, um die Kontrolle darüber zu haben, welche Warteschlangen-Worker beendet werden, wenn Ihre Auto-Scaling-Gruppe skaliert wird.

Der folgende Pseudocode zeigt eine Möglichkeit zum Schutz langjähriger, warteschlangengesteuerter Worker-Prozesse vor Scale-In-Beendigung.

while (true) { SetInstanceProtection(False); Work = GetNextWorkUnit(); SetInstanceProtection(True); ProcessWorkUnit(Work); SetInstanceProtection(False); }

Weitere Informationen finden Sie unter Entwerfen Sie Ihre Anwendungen auf Amazon EC2 Auto Scaling, um die Instance-Beendigung ordnungsgemäß zu handhaben.