Was Sie verlangen, ist im Grunde eine hohe Verfügbarkeit. Um ein System hoch verfügbar zu machen, benötigen Sie drei Dinge:
- Beseitigen Sie einzelne Fehlerstellen
- Ein Mechanismus zum Wechseln von einem Endpunkt zu einem anderen
- Eine Möglichkeit, Fehler zu erkennen
Beseitigen Sie einzelne Fehlerstellen
Im Fall von S3 wird der Punkt # 1, wie Evgeny hervorhob, durch S3-Cross-Region-Replikation adressiert .
Die Replikation erfolgt jedoch nicht sofort, und Sie möchten überprüfen, ob die Anwendungsreplikation aktiviert werden soll oder nicht. Im Falle eines Ausfalls ist es möglich, dass etwas, das in Ihren Quell-Bucket geschrieben wurde, noch nicht in den Ziel-Bucket kopiert wurde (nicht repliziert wurde). Sie müssen sich überlegen, wie die Anwendung mit einem solchen Szenario umgehen würde. Das hängt wirklich von der Art der Daten ab, was damit gemacht wird und (möglicherweise) von den Endbenutzern oder den Erwartungen des Managements.
Ein Mechanismus zum Wechseln von einem Endpunkt zu einem anderen
Für S3 bedeutet dies, dass die Anwendung im Falle eines Ausfalls das Lesen und Schreiben von / zu Bucket A beenden und stattdessen Bucket B verwenden soll.
Wie dies erreicht wird, liegt meines Wissens vorerst bei Ihnen. Einige andere AWS-Services bieten vollständig transparente Failover-Funktionen, aber mir ist dies für S3 derzeit nicht bekannt.
Es gibt verschiedene Möglichkeiten, dies zu erreichen. Ein Beispiel ist die Verwendung eines Proxys, der den Datenverkehr an den entsprechenden Bucket weiterleitet. Während eines Ausfalls würden Sie den Proxy aktualisieren / ändern, um den Datenverkehr an einen von dem Ausfall nicht betroffenen Bucket weiterzuleiten. Ein weiteres Beispiel wäre, die Anwendungskonfiguration dynamisch zu gestalten und in einem Schlüsselwertspeicher zu speichern. Wenn die Anwendung den KV-Speicher häufig genug nach aktualisierten Eigenschaften durchsucht, können Sie den Speicherort für das Lesen und Schreiben wechseln (Spring Cloud unterstützt beispielsweise einen Listener "EnvironmentChange").
Eine Möglichkeit, Fehler zu erkennen
Nun, das ist einfach, denke ich. Richten Sie einfach eine Write + Read-Schleife ein und alarmieren Sie, sobald etwas nicht stimmt :)
Notizen schließen
- Wenn Ihre Anwendung in den Bucket schreibt, müssen Sie überlegen, was im Falle eines Failovers passieren würde. Haben alle Schreibvorgänge den Ziel-Bucket erreicht (und können Sie das beurteilen)? Können Sie das Schreiben in den Ziel-Bucket zulassen (und ihn zum neuen "primären" Bucket machen)? Eine sorgfältige Planung vermeidet Split-Brain-Szenarien oder den Verlust von Updates.
- Abhängig von Ihrem SLA möchten Sie möglicherweise, dass die Punkte 2 und 3 automatisiert oder automatisch ausgeführt werden. Dies erfordert zusätzliche Planung, Tools und Tests, aber gut geschriebene Skripte reagieren immer schneller und vorhersehbarer als Menschen (Fehler haben auch die ärgerliche Angewohnheit, mitten in der Nacht aufzutreten, wenn menschliches Eingreifen gefährlich ist.
- Erwähnenswert ist, dass selbst die Replikation über Regionen hinweg einzelne Fehlerquellen nicht vollständig eliminiert. Klar, wenn eine Region untergeht, sind Sie abgesichert. Aber was ist, wenn ein US-weites AWS-Problem auftritt? Azure hatte letztes Jahr einen teilweisen, aber globalen Ausfall und auch 2014 einen.