
In diesem Artikel sind einige allgemeine Vorlagen zusammengestellt, die Ingenieuren helfen, mit großangelegten Services zu arbeiten, auf die Millionen von Nutzern zugreifen.
Nach der Erfahrung des Autors ist dies keine erschöpfende Liste, aber tatsächlich effektive Tipps. Lassen Sie uns beginnen.
Übersetzt mit Unterstützung von .
Basisstufe
Die unten aufgeführten Maßnahmen sind relativ einfach umzusetzen, bieten jedoch eine hohe Rendite. Wenn Sie diese zuvor nicht ergriffen haben, werden Sie von erheblichen Verbesserungen überrascht sein.
Infrastruktur als Code
Der erste Teil der Tipps besteht darin, Infrastruktur als Code zu implementieren. Das bedeutet, dass Sie eine programmgesteuerte Methode zur Bereitstellung der gesamten Infrastruktur haben sollten. Es klingt kompliziert, aber tatsächlich sprechen wir über folgenden Code:
Bereitstellung von 100 virtuellen Maschinen
- mit Ubuntu
- 2 GB RAM auf jeder
- sie werden folgenden Code haben
- mit diesen Parametern
Sie können Änderungen an der Infrastruktur verfolgen und schnell zu ihnen zurückkehren mit Hilfe eines Versionskontrollsystems.
Der Modernist in mir sagt, dass man Kubernetes/Docker verwenden kann, um alles oben Genannte zu realisieren, und er hat recht.
Außerdem kann die Automatisierung mit Hilfe von Chef, Puppet oder Terraform sichergestellt werden.
Kontinuierliche Integration und Lieferung
Um einen skalierbaren Service zu erstellen, ist es wichtig, eine Build- und Testpipeline für jede Pull-Request zu haben. Selbst wenn der Test am einfachsten ist, garantiert er zumindest, dass der Code, den Sie bereitstellen, kompiliert.
Jedes Mal in diesem Schritt beantworten Sie die Frage: Wird mein Build kompiliert und bestehen die Tests, ist es gültig? Das mag wie eine niedrige Hürde erscheinen, löst aber zahlreiche Probleme.

Es gibt nichts Schöneres, als diese Häkchen zu sehen
Für diese Technologie können Sie Github, CircleCI oder Jenkins in Betracht ziehen.
Lastenausgleich
Also, wir möchten einen Lastenausgleich einrichten, um den Verkehr umzuleiten und eine gleichmäßige Lastverteilung auf allen Knoten sicherzustellen oder den Service im Falle eines Ausfalls zu betreiben:

Lastenausgleich hilft in der Regel gut dabei, den Verkehr zu verteilen. Best Practices umfassen Redundanz im Load Balancer, um einen Single Point of Failure zu vermeiden.
Lastenausgleicher werden normalerweise in der Cloud konfiguriert, die Sie verwenden.
RayID, Korrelation-ID oder UUID für Anfragen
Haben Sie jemals einen Fehler in einer Anwendung mit einer Meldung wie dieser gesehen: „Irgendwas ist schiefgelaufen. Bitte speichern Sie diese ID und senden Sie sie an unseren Support“?

Eine eindeutige Kennung, der Korrelations-ID, RayID oder eine der Varianten – das ist eine eindeutige Kennung, die es ermöglicht, eine Anfrage während ihres Lebenszyklus nachzuverfolgen. Das ermöglicht es, den gesamten Pfad der Anfrage in den Protokollen zu verfolgen.

Der Benutzer sendet eine Anfrage an System A, dann kontaktiert A B, das wiederum C kontaktiert, in X speichert und dann wird die Anfrage an A zurückgegeben.
Wenn Sie sich remote mit den virtuellen Maschinen verbinden und versuchen würden, den Pfad der Anfrage nachzuvollziehen (und manuell nachzuvollziehen, welche Aufrufe erfolgen), würden Sie verrückt werden. Eine eindeutige Kennung macht das Leben erheblich einfacher. Es ist eine der einfachsten Maßnahmen, die Sie ergreifen können, um Zeit zu sparen, während der Dienst wächst.
Mittelstufe
Hier sind die Tipps komplexer als vorherige, aber die richtigen Werkzeuge erleichtern die Aufgabe und sorgen für eine Rendite, selbst für kleine und mittlere Unternehmen.
Zentralisierte Protokollierung
Herzlichen Glückwunsch! Sie haben 100 virtuelle Maschinen bereitgestellt. Am nächsten Tag kommt der CEO und beschwert sich über einen Fehler, den er beim Testen des Dienstes erhalten hat. Er berichtet über die entsprechende ID, über die wir gesprochen haben, aber Sie müssen die Protokolle von 100 Maschinen durchsuchen, um diejenige zu finden, die den Fehler verursacht hat. Und Sie müssen sie bis zur Präsentation morgen finden.
Obwohl das nach einem lustigen Abenteuer klingt, ist es besser, sicherzustellen, dass Sie die Möglichkeit haben, alle Protokolle von einem Ort aus durchsuchen zu können. Ich habe das Problem der zentralisierten Protokollierung mit der integrierten Funktionalität des ELK-Stacks gelöst: hier wird das Sammeln von Protokollen mit Suchfunktionalität unterstützt. Das wird Ihnen wirklich helfen, das spezifische Protokoll zu finden. Bonuspunkt: Sie können Diagramme erstellen und ähnliche interessante Dinge.

Funktionalität des ELK-Stacks
Überwachungsagenten
Jetzt, da Ihr Dienst in Betrieb ist, müssen Sie sicherstellen, dass er ohne Ausfälle läuft. Der beste Weg, dies zu tun, ist, mehrere Agenten, die parallel arbeiten und überprüfen, dass er funktioniert und grundlegende Operationen ausgeführt werden.
In diesem Stadium überprüfen Sie, dass Die gestartete Version läuft gut und funktioniert normal..
Für kleine und mittelgroße Projekte empfehle ich Postman zur Überwachung und Dokumentation von APIs. Insgesamt sollte man jedoch einfach sicherstellen, dass man einen Weg hat, um zu erfahren, wann ein Fehler aufgetreten ist, und rechtzeitig benachrichtigt wird.
Automatisches Skalieren je nach Last.
Es ist sehr einfach. Wenn Sie eine virtuelle Maschine haben, die Anfragen bearbeitet, und sie sich dem Punkt nähert, an dem 80 % des Speichers belegt sind, können Sie entweder deren Ressourcen erhöhen oder mehr virtuelle Maschinen zum Cluster hinzufügen. Das automatische Ausführen dieser Operationen eignet sich hervorragend zum elastischen Anpassen der Leistung unter Last. Aber Sie sollten immer darauf achten, wie viel Geld Sie ausgeben, und vernünftige Grenzen festlegen.

In den meisten Cloud-Diensten können Sie automatisches Skalieren einrichten, indem Sie mehr Server oder leistungsstärkere Server verwenden.
Experimentiersystem.
Eine gute Möglichkeit, Updates sicher bereitstellen, ist die Möglichkeit, etwas für 1 % der Benutzer für eine Stunde zu testen. Sie haben solche Mechanismen sicherlich schon in Aktion gesehen. Beispielsweise zeigt Facebook einem Teil der Nutzer eine andere Farbe oder ändert die Schriftgröße, um zu sehen, wie die Benutzer die Änderungen wahrnehmen. Das nennt man A/B-Tests.
Sogar die Einführung einer neuen Funktion kann als Experiment gestartet werden, um dann zu bestimmen, wie man sie bereitstellt. Darüber hinaus haben Sie die Möglichkeit, die Konfiguration in Echtzeit zu "widerrufen" oder zu ändern, wenn eine Funktion zu einer Verschlechterung Ihres Dienstes führt.
Fortgeschrittenes Niveau.
Hier sind Ratschläge, die ziemlich schwer umzusetzen sind. Wahrscheinlich benötigen Sie etwas mehr Ressourcen, sodass es für ein kleines oder mittelständisches Unternehmen schwierig sein wird, dies zu bewältigen.
Blue-Green-Deployments.
Das ist es, was ich als "Erlang-artige" Bereitstellung bezeichne. Erlang wurde weit verbreitet, als Telefonunternehmen entstanden. Software-Schalter wurden zur Routing von Telefonanrufen eingesetzt. Die Hauptaufgabe der Software dieser Schalter bestand darin, die Anrufe während eines Systemupdates nicht abzubrechen. Erlang hat eine wunderbare Möglichkeit, ein neues Modul ohne Absturz des vorherigen zu laden.
Dieser Schritt hängt von der Verfügbarkeit des Load Balancers ab. Nehmen wir an, Sie haben Version N Ihrer Software und möchten dann Version N+1 bereitstellen.
Sie könnten Sie einfach den Dienst anhalten und die nächste Version zu einem für Ihre Benutzer geeigneten Zeitpunkt bereitstellen, was eine gewisse Ausfallzeit zur Folge hat. Aber nehmen wir an, Sie haben tatsächlich strenge SLA-Vorgaben. Ein SLA von 99,99% bedeutet, dass Sie offline gehen können nur für 52 Minuten im Jahr.
Wenn Sie wirklich solche Werte erreichen möchten, benötigen Sie zwei gleichzeitige Bereitstellungen:
- die aktuelle (N);
- die nächste Version (N+1).
Sie weisen den Load Balancer an, einen Prozentsatz des Traffics auf die neue Version (N+1) umzuleiten, während Sie aktiv Regressionen überwachen.

Hier haben wir ein grünes Deployment von N, das einwandfrei funktioniert. Wir versuchen, zur nächsten Version dieses Deployments überzugehen.
Zuerst senden wir wirklich einen kleinen Test, um zu sehen, ob unser Deployment N+1 mit wenig Traffic funktioniert:

Schließlich haben wir eine Reihe automatisierter Prüfungen, die wir letztendlich ausführen, bis unser Deployment abgeschlossen ist. Wenn Sie sehr, sehr vorsichtig sind, können Sie auch Ihr Deployment N für einen schnellen Rollback im Falle einer schlechten Regression dauerhaft behalten:

Wenn Sie auf ein noch fortschrittlicheres Niveau gehen möchten, lassen Sie alles im blue-green Deployment automatisch ablaufen.
Anomalieerkennung und automatisches Abmildern von Auswirkungen
Angesichts von zentralisierten Protokollen und einer guten Protokollsammlung können Sie bereits höhere Ziele setzen. Zum Beispiel proaktiv Ausfälle vorhersagen. Auf Monitoren und in Protokollen werden Funktionen verfolgt und verschiedene Diagramme erstellt – und es kann im Voraus vorhergesagt werden, was schiefgehen könnte:

Mit der Anomalieerkennung beginnen Sie, einige Hinweise zu analysieren, die der Dienst liefert. Zum Beispiel kann ein Anstieg der CPU-Auslastung darauf hindeuten, dass die Festplatte ausfällt, und ein Anstieg der Anfragen bedeutet, dass Sie skalieren müssen. Solche statistischen Daten ermöglichen es, den Dienst proaktiv zu gestalten.
Durch solche Analyse-Daten können Sie in jeder Dimension skalieren und proaktiv sowie reaktiv die Eigenschaften von Maschinen, Datenbanken, Verbindungen und anderen Ressourcen ändern.
Das ist alles!
Diese Prioritätenliste wird Ihnen viele Probleme ersparen, wenn Sie einen Cloud-Service bereitstellen.
Der Autor des ursprünglichen Artikels lädt die Leser ein, Kommentare zu hinterlassen und Änderungen vorzunehmen. Der Artikel wird als Open Source veröffentlicht, Pull-Requests akzeptiert der Autor .
Was Sie sonst noch zum Thema lesen sollten:
Quelle: habr.com
