So entwerfen Sie eine Hochverfügbarkeitsanwendung

9

Wir haben derzeit eine klassische n-Tier-Anwendung: DB / Web Service / Front-End. Es hat andere Komponenten, aber es ist das Grundlayout.

Wir möchten die Verfügbarkeit von Anwendungen aus drei Hauptgründen verbessern:

  1. Bei unserem Host kommt es manchmal zu Ausfällen (wie bei allen anderen), und wir möchten die Auswirkungen auf unsere Kunden minimieren. So schalten sie beispielsweise das Rechenzentrum B ein, wenn das Rechenzentrum A nicht verfügbar ist.
  2. Wenn wir die Version aktualisieren, fahren wir die Site zur Wartung herunter. Dies dauert normalerweise einige Stunden (Migrationsskripte usw.). Wir möchten, dass die Benutzer einen nahtloseren Übergang mit möglichst geringen Ausfallzeiten haben (sie verwenden Server B, während Server A aktualisiert wird).
  3. Optional sind unsere Kunden auf der ganzen Welt ansässig und wir möchten, dass sie trotz ihrer möglicherweise beschissenen Verbindungen die bestmögliche Erfahrung machen (jeder, der mit indischen Entwicklern zusammengearbeitet hat, sollte wissen, was ich meine). Idealerweise möchten wir in der Lage sein, einen Server in ihr Büro einzubinden (oder ein Rechenzentrum in der Nähe ihrer Stadt zu verwenden), und es würde sich nahtlos in unsere Architektur integrieren.

Wir benötigen keine Verfügbarkeit von 99%, nicht einmal 95%. Es ist eine Dokumentenverwaltungs-App. Niemanden interessierts. Da Migrationen jedoch eine Weile dauern können und es Kunden auf der ganzen Welt gibt, verhindern wir manchmal, dass ein Kunde den größten Teil seines Tages arbeitet.

Für den SQL-Teil kennen wir die SQL-Möglichkeiten , obwohl es keine "richtigen" Datenbankadministratoren gibt : Replikation, Spiegelung usw. Auf der DB-Seite ist es ziemlich einfach, Ressourcen dafür zu finden. Was schwieriger ist, ist alles andere: Speichern von Sitzungen, Code usw. Wenn mein Webservice-Server ausfällt, woher weiß meine Benutzeroberfläche, dass er wechseln muss? Wie bleiben meine Sitzungen zwischen Servern bestehen?

Leider hat keiner von uns Erfahrung in diesem Bereich und wir wissen nicht einmal, wo wir anfangen sollen zu suchen. Gibt es dafür Best Practices? Designmuster? Bibliotheken (die kostenlos sein sollten, weil wir kein Geld haben)?

Wir verwenden ASP.Net und SQL Server mit einem WCF-Webservice in der Mitte. Wir haben eine Reihe von Windows-Diensten herumliegen, aber sie sind nicht geschäftskritisch, und ich gehe davon aus, dass die Methoden für den Umgang mit der Website auf die Dienste anwendbar sind.

Ich verstehe, dass die meisten Cloud-Plattformen ein integriertes System dafür bieten, aber Cloud-Hosting ist aufgrund unseres Systemadministrators, der alles selbst verwalten und sich auf niemanden verlassen möchte, ein No-Go.

thomasb
quelle
1
"Was ist, wenn sie plötzlich beschließen, unsere Daten an unsere Konkurrenten zu verkaufen?" "Ja wirklich?" Das ist das beste Argument, das sie haben? 1) Ziemlich sicher, dass das illegal wäre. 2) Kein seriöser Hosting-Anbieter würde dies tun (dies würde sein gesamtes Geschäft untergraben). 3) Wenn Sie wirklich besorgt sind, stellen Sie sicher, dass unterzeichnete Vereinbarungen solche Dinge verbieten, und klagen Sie, wenn sie gegen die Vereinbarung verstoßen. 4) Verschlüsseln Sie Ihre Daten. 5) Was hindert Ihren aktuellen Host daran, dasselbe zu tun?
Becuzz
1
In aller Ernsthaftigkeit führt die Vermeidung der Verwendung von Vorgefertigten für genau das, was Sie wollen, nur zu Problemen. Sie müssen jede Lektion lernen, wie Sie ein Hochverfügbarkeitssystem, das diese Anbieter bereits gelernt haben, ordnungsgemäß hosten. Und Sie werden wahrscheinlich nicht über die Ressourcen und das Fachwissen verfügen, um auf Probleme so gut wie möglich zu reagieren. Wenn Sie (oder die Systemadministratoren) weiterhin darauf bestehen, sollten Sie sich mit dem Lastenausgleich, dem nicht im Speicher befindlichen Sitzungsspeicher (wie dem SQL-Sitzungsspeicher), automatisierten Bereitstellungen usw.
befassen
Die Kosten für Bibliotheken sind die geringsten Kosten
Dan Pichelman
@Becuzz: Ich übertreibe dort ein bisschen, aber sie haben (meiner Meinung nach) meist unbegründete und unlogische Argumente gegen Cloud-Hosting. Sie denken ziemlich genau, dass sie selbst besser sind als die meisten Hoster. Was kann ich sagen? Für den zweiten Punkt sind wir nicht gegen die Verwendung einer Bibliothek, aber sie muss kostenlos oder billig sein, da wir kein Budget dafür haben.
Thomasb
1
HA kostet sowohl Capex als auch Opex, da Sie redundante Hardware und eine angemessene Menge an Dev & Devops-Arbeit benötigen, damit HA funktioniert. Wenn Sie kein Budget für den Kauf einiger Tools haben, können Sie es sich zweifellos leisten, ein HA-Setup weiterzuentwickeln und zu betreiben.
Frederik

Antworten:

5

Sie müssen klären, nach welcher Art von Hochverfügbarkeit Sie suchen. Es gibt hochverfügbare Anwendungen, die ich ausführe und die in 95% der Fälle aktiv sein müssen. Es gibt andere, die zu 99% ausgeführt werden müssen. Ich kann mir Lebens- oder Todesszenarien vorstellen, die eine 100% ige Verfügbarkeit erfordern. Nur diese drei haben drastisch unterschiedliche Ansätze und Kosten.

Nur Vermutungen basierend auf Ihren Anforderungen und einer SLA von 95-99% Verfügbarkeit:

  • Datenbankmigrationen sollten für die meisten Änderungen in Echtzeit erfolgen können. Üben Sie das evolutionäre Datenbankdesign . Für Änderungen, die ein invasiveres Verhalten erfordern, stehen Ihnen einige Optionen zur Verfügung. Eine davon ist die Ausfallzeit. Wenn möglich, funktioniert das Ausführen Ihres Dienstes möglicherweise im schreibgeschützten Modus. Für die volle Funktionalität wollte ich schon seit einiger Zeit ScaleArc ausprobieren. Es sieht aus wie ein wirklich schickes Tool für Skalierung und Ausfallsicherheit in der SQL Server-Welt.
  • Das Einfügen von Servern in die Standorte Ihrer Kunden ist ein Rezept für eine unüberschaubare Katastrophe, es sei denn, Sie verfügen über erstklassige Bereitstellungsstrategien (die Sie basierend auf Ihrer Beschreibung Ihrer Migrationen noch nicht haben). Schieben Sie Cloud-Dienste nicht vor Ort, da Sie Leistungsprobleme haben. Lösen Sie ab und zu die Leistungsprobleme, und Sie müssen sich nicht mit teureren Problemen auf der Straße befassen.
  • Ihr Statusserver sollte eine Datenbank sein. Befolgen Sie die HA-Richtlinien. Sie können hierfür SQL Server verwenden, da Sie es bereits zur Verfügung haben.
  • In Bezug auf Datenbanken aktiviert die Replikation HA nicht. Tatsächlich verursacht die SQL-Replikation in jeder Runde Kopfschmerzen (aus Erfahrung mit Replikationsszenarien mit mehreren Knoten). Das Spiegeln kann funktionieren, aber zuletzt erinnere ich mich, dass das SQL-Clustering 1-5 Minuten dauert, um ein Failover auf den neuen Server durchzuführen. Ich habe gute Dinge über AlwaysOn gehört, bin aber angesichts der Erfolgsbilanz von Microsoft immer noch misstrauisch. So etwas wie ScaleArc könnte hier mehr Hilfe sein.
  • Ihr Webserver sollte zustandslos sein. Drehen Sie drei oder vier hoch und stellen Sie sie hinter einen Load Balancer. Das löst Ihre Betriebszeitprobleme dort. Wie Frederik bereits erwähnt hat, können Sie auf diese Weise auch rollierende Bereitstellungen durchführen.
  • Ihr Webdienst sollte wahrscheinlich zustandslos sein. Wenn nicht, prüfen Sie, ob Sie es in zustandslose und zustandsbehaftete Teile zerlegen können. Wenn Sie mehrere Instanzen davon erneut hinter denselben Load Balancer stellen, werden die Probleme mit der Verfügbarkeit behoben und interessiertere Bereitstellungsszenarien (z. B. blau / grüne Bereitstellungen) ermöglicht.

Im Gegensatz zu Frederik werde ich Ihre Cloud-Paranoia nicht als ungerechtfertigt bezeichnen. Dies hängt von Ihren Verfügbarkeitsanforderungen ab. Es ist denkbar, dass ein Dienst aus Redundanzgründen in mehreren Rechenzentren ausgeführt werden muss, die von verschiedenen Anbietern in verschiedenen Ländern betrieben werden. In Anbetracht Ihres aktuellen Status stimme ich jedoch zu, dass AWS, Azure oder ähnliches wahrscheinlich sichere Wetten für Ihr Unternehmen sind.

mgw854
quelle
1
Informationen zur On-Premise-Installation: Es handelt sich nicht um ein Leistungsproblem, sondern um ein Bandbreitenproblem des Kunden. Sie können sich an Orten mit instabilen oder langsamen Verbindungen befinden. Aber es ist kein wichtiges Merkmal. Danke für den Rest, ich werde mich
darum
5

Erhalten Sie ein gewisses Maß an HA auf Ihrer Web- und Anwendungsebene:

  1. Berücksichtigen Sie im Idealfall jeden Status, einschließlich des Sitzungsstatus, in Systemen mit gemeinsamem Status wie einer Datenbank oder einem In-Memory-Sitzungsstatus-Server. Abhängig von Ihrem Anwendungsdesign kann dies zu Leistungsproblemen führen, da die zusätzliche Latenz einen hohen Status erhält.

  2. Ihre Website und Anwendungsebene sollte jeweils einen unabhängigen Load Balancer vor sich haben. NGINX wird den Trick machen, aber IIS kann dies auch (ARR).

  3. Wenn eine einzelne Datenbank das Laden nicht bewältigen kann, nutzen Sie die Sitzungsstatuspartitionierung (oder Sharding oder konsistentes Hashing), um bestimmte Anforderungen an eine bestimmte Datenbankbox weiterzuleiten.

Wenn das Ausklammern des Status zu schwierig ist, können Sie die Serveraffinität für den Lastenausgleich verwenden (dh Benutzer werden konsistent an dieselbe Box weitergeleitet, häufig auf Cookies basierend). Es ist nicht so hoch verfügbar wie ein zustandsloser Round-Robin-Ansatz, da ein Box-Ausfall alle Benutzer und den Status dieser Box betrifft, aber einen vollständigen Ausfall übertrifft (je nach Anwendungsfall).

Auf der Upgrade-Seite:

  1. Entwerfen Sie Ihre Datenbankskripte so, dass Datenbank-Upgrades durchgeführt werden können, während das System ausgeführt wird. Mit anderen Worten, die Abwärtskompatibilität bleibt erhalten. Ein Muster, das dafür gut funktioniert, ist "erweitern, dann verkleinern" -> nur additive, abwärtskompatible Änderungen vornehmen, aber Abhängigkeiten von den Feldern (usw.) entfernen, die Sie entfernen möchten; Aktualisieren Sie dann alle Clients der Datenbank auf v-latest. Führen Sie dann ein weiteres Datenbank-Upgrade durch, um die alten Felder (usw.) in der Datenbank zu entfernen. Dies kann ein langsamer Prozess sein, wenn Sie über eine große Datenbank verfügen und darauf achten müssen, die Leistung Ihres Systems nicht zu beeinträchtigen.

  2. Aktualisieren Ihrer App-Ebene: Da Sie keine Cloud-Umgebung verwenden, empfehle ich Ihnen, das kanarische Bereitstellungsmuster zu befolgen: Führen Sie ein fortlaufendes Upgrade Ihrer Web- und Middle Tier-Boxen durch. Wenn die Bereitstellung fehlschlägt, nehmen Sie die Box aus dem Load Balancer, so als ob dies fehlgeschlagen wäre.

Ein Wort der Warnung: Die Entwicklung eines Systems, das nicht für HA entwickelt wurde, kann zu einem langen und kostspieligen Prozess werden. Auf dem Weg müssen Sie Kompromisse eingehen (Kosten gegen Aufwand, um ein bestimmtes Verfügbarkeitsniveau zu erreichen).

Ihre Cloud-Paranoia ist nicht gerechtfertigt - Anbieter wie AWS können in Verbindung mit bewährten Verfahren Ihrerseits die meisten Risiken kontrollieren / mindern. Sehen Sie auf ihrer Compliance-Seite nach, welche Vorschriften sie einhalten: https: // aws .amazon.com / Compliance /

Frederik
quelle
1

TL; DR: Redundant, modular erstellen; Verfügbarkeit prüfen; genau überwachen.

Nachdem ich erkannt habe, dass der Versuch, eine Erklärung einzudrücken, sehr lange dauern kann, werde ich alle Beobachtungen aufschreiben, die ich gemacht habe.

Die Prämisse in Frage stellen

Cloud-System ist Allheilmittel

Selbst wenn Sie bei einem Top-Cloud-Anbieter vollständig auf die Cloud umsteigen möchten, müssen Sie Ihre Anwendung grundsätzlich auf Ausfallsicherheit ausrichten. AWS ersetzt möglicherweise Ihre VM, Ihre Anwendung sollte jedoch neu gestartet werden können, wenn sie sich mitten in der Berechnung befindet.

Wir wollen wegen x / y / z kein Cloud-System verwenden

Wenn Sie kein sehr großes Unternehmen sind, sind Sie mit Cloud-Systemen besser dran. Top-3-Cloud-Systeme (AWS, MSFT, Google) beschäftigen Tausende von Ingenieuren, um Ihnen versprochene SLAs und das einfach zu verwaltende Dashboard zu bieten. Es ist eigentlich ein gutes Geschäft, sie zu verwenden, anstatt einen Cent für dieses Inhouse auszugeben.

Probleme bei Umfang und Design

Das Definieren, Quantifizieren und anschließende kontinuierliche Messen der Verfügbarkeit eines Dienstes ist eine größere Herausforderung als das Schreiben einer Lösung für Verfügbarkeitsprobleme.

Das Definieren und Messen der Verfügbarkeit ist schwieriger als erwartet

Mehrere Stakeholder haben unterschiedliche Ansichten zur Verfügbarkeit, und was passieren kann, ist die Definition, die von einer Person mit dem höchsten Gehalt bevorzugt wird, die andere Definition übertrifft. Dies ist manchmal eine korrekte Definition, aber oft ist das Ökosystem nicht darauf ausgelegt, dasselbe zu messen, da diese ideale Definition sehr schwierig zu messen ist, geschweige denn in Echtzeit zu überwachen. Wenn Sie eine Definition der Verfügbarkeit haben, die nicht in Echtzeit überwacht werden kann, werden Sie feststellen, dass Ihr selbst durchgeführtes ähnliches Projekt immer wieder unheimliche Ähnlichkeiten aufweist. Halten Sie sich an etwas, das Sinn macht und das leicht überwacht werden kann.

Die Menschen unterschätzen die Komplexität des immer verfügbaren Systems.

Um den Elefanten im Raum anzusprechen, lassen Sie mich Folgendes sagen: "Kein Multi-Computer-System ist zu 100% verfügbar, möglicherweise in Zukunft, aber nicht mit der aktuellen Technologie." Hier beziehe ich mich nach der aktuellen Technologie auf unsere Unfähigkeit, Signale schneller als mit Lichtgeschwindigkeit und dergleichen zu senden. Alle Comp-Sci-Ingenieure, die ihr Geld wert sind, kennen die Einschränkungen des verteilten Rechnens , und die meisten von ihnen werden dies in Besprechungen nicht erwähnen, weil sie befürchten, dass sie wie Noobs aussehen werden. Um all diejenigen auszugleichen, die die Einschränkungen des verteilten Rechnens nicht erwähnen, werde ich sagen, dass es kompliziert ist, aber Computern nicht immer vertraut .

Die Leute überschätzen die Fähigkeiten ihres Ingenieurs

Leider fällt die Verfügbarkeit in die Kategorie, in der Sie nicht wissen, was Sie wollen, aber wissen, was Sie nicht wollen. Es ist etwas kniffliger, die Kategorie "Kenne die Wünsche" wie die Benutzeroberfläche zu kennen. Es erfordert ein wenig Erfahrung und viel Lesen, um aus den Erfahrungen anderer zu lernen und vieles mehr.

Aufbau eines verfügbaren Systems von Grund auf

Stellen Sie sicher, dass Sie jedem Architektur- und Designteam die richtige Priorität der Verfügbarkeit als Systemanforderung mitteilen.

Attribute des Systems, die die Verfügbarkeit unterstützen

Folgende Systemmerkmale haben nachweislich zur Systemverfügbarkeit beigetragen:

Redundanz

Einige Beispiele hierfür sind, niemals nur eine einzige VM hinter einem VIP zu haben oder niemals nur eine einzige Kopie Ihrer Daten zu speichern. Dies sind die Fragen, die eine gute IAAS für Sie leichter zu lösen erleichtert, aber Sie müssen diese Entscheidungen noch treffen.

Modularität

Ein modularer REST ist besser als eine monolithische SOA. Ein noch modularer Mikroservice ist tatsächlich verfügbarer als der übliche HATEOS REST . Die Argumentation finden Sie in der Ertragsdiskussion im nächsten Abschnitt. Wenn Sie eine Stapelverarbeitung durchführen, ist es besser, eine Stapelverarbeitung in einer angemessenen Charge von 10 Sekunden durchzuführen, als mit einer Charge von 1.000.000.

Elastizität

"I am always angry"
                    - Hulk

Ein ausfallsicheres System ist immer zur Wiederherstellung bereit. Diese Ausfallsicherheit gilt für Instanzen wie das Bestätigen von ACK für einen Schreibvorgang erst nach dem Schreiben auf eine RAID-Festplatte und möglicherweise über mindestens zwei Rechenzentren. Ein weiterer aktueller Trend ist die Verwendung konfliktfreier Datenstrukturen , bei denen die Datenstruktur die Verantwortung für die Lösung von Konflikten übernimmt, wenn zwei verschiedene Versionen angezeigt werden. Ein System kann nachträglich nicht belastbar sein, es muss vorhergesagt und eingebaut werden. Ein Ausfall ist langfristig garantiert, daher sollten wir immer auf einen Plan zur Wiederherstellung vorbereitet sein.

Log Trail

Dies ist technisch gesehen ein Subtyp von Resilience, aber ein ganz besonderer, da alle Funktionen erfasst werden. Trotz aller Bemühungen können wir das Muster der Nichtverfügbarkeit möglicherweise nicht vorhersagen. Wenn möglich, führen Sie genügend Protokollspuren der Systemaktivitäten, um Systemereignisse wiedergeben zu können. Auf diese Weise können Sie sich zu hohen manuellen Kosten von unvorhergesehenen Situationen erholen.

Attribute der Verfügbarkeit

Die nicht erschöpfende Top-of-Mind-Attributliste "Verfügbarkeit": Nehmen wir zur Diskussion an, die Frage, die der Benutzer stellt, lautet: "Wie viele Artikel habe ich in meinem Warenkorb?"

Richtigkeit

Haben Sie müssen eine möglichst genaue Antwort produzieren , oder ist es in Ordnung , Fehler zu machen? Nur als Referenz: Wenn Sie Geld am Geldautomaten abheben, kann nicht garantiert werden, dass es korrekt ist. Wenn die Bank feststellt, dass ein Fehler aufgetreten ist, können Sie die Transaktionen möglicherweise rückgängig machen. Wenn Ihr System Primzahlen erzeugt, möchten Sie wahrscheinlich immer die richtigen Antworten.

Ausbeute

Überspringen Sie diesen Punkt, wenn Sie die Frage zum vorherigen Thema immer richtig beantwortet haben. Manchmal muss die Antwort auf Fragen nicht präzise sein, z. B. wie viele Freunde habe ich gerade auf Facebook? Es wird jedoch erwartet, dass die Antwort die ganze Zeit im Stadion +/- 1 liegt. Wenn Sie das erwartete Ergebnis erzielen, beträgt Ihre Ausbeute 100.

Konsistenz

Ihre Antwort mag zu einem bestimmten Zeitpunkt richtig sein, aber bis das Licht den Bildschirm verlassen und in die Netzhaut des Betrachters eingedrungen ist, könnten sich die Dinge geändert haben. Macht es Ihre Antwort falsch? Nein, es macht es nur inkonsistent. Die meisten Anwendungen sind letztendlich konsistent, aber der Trick besteht darin, zu definieren, welche Art von Konsistenzmodell Ihre Anwendung bereitstellen wird. Durch Zufall kann Ihre Anwendung auf einem einzelnen Computer ausgeführt werden. Sie können diese schöne Lektüre des CAP-Theorems überspringen .

Kosten

Viel hängt davon ab, welche Auswirkungen kurzfristige Auswirkungen (Umsatzverlust) und langfristige Auswirkungen (schlechter Ruf, Kundenbindung) insgesamt haben. Je nach Kundentyp (Bezahlen / Kostenlos, Wiederholen / Einzigartig, Gefangen) und Ressourcenverfügbarkeit sollten unterschiedliche Verfügbarkeitsgarantien eingebaut werden.

Auf dem Weg zur Verbesserung der Verfügbarkeit eines bestehenden Systems

Das Betriebsmanagement einzelner Maschinen und eines Netzwerks ist so komplex, dass ich davon ausgehe, dass Sie es dem Cloud-Anbieter überlassen haben oder bereits kompetent genug sind, um zu wissen, was Sie tun. Ich werde andere Themen unter Verfügbarkeit berühren. Für die langfristige Strategie Define-Measure-Analyze-Control ist ein himmlisches Spiel, etwas, das ich selbst gesehen habe.

  1. Definieren Sie, was für Ihre Stakeholder verfügbar ist
  2. Wie werden Sie messen, was Sie definiert haben?
  3. Ursachenanalyse Engpässe zu identifizieren
  4. Aufgaben für Verbesserungen
  5. Kontinuierliche Überwachung ( Kontrolle ) des Systems

Ursachen der Nichtverfügbarkeit

Da wir uns einig waren, dass das Betriebsmanagement, das jedes physische Infrastrukturmanagement abdecken würde, von Fachleuten durchgeführt werden sollte, werde ich der Vollständigkeit halber andere Ursachen für die Nichtverfügbarkeit ansprechen. Die IMO-Verfügbarkeit sollte auch das Fehlen eines erwarteten Verhaltens beinhalten. Wenn dem Benutzer die erwartete Erfahrung nicht angezeigt wird, ist etwas nicht verfügbar. In Anbetracht dieser umfassenden Definition kann Folgendes zur Nichtverfügbarkeit führen: - Codefehler - Sicherheitsvorfälle - Leistungsprobleme

Ajeet Ganga
quelle
Interessant, aber nicht sehr hilfreich und etwas abseits des Themas. Danke trotzdem.
Thomasb