Navigator’s Guide: Hochverfügbarkeit

Es spielt keine Rolle, ob Sie ein kleines Blog, eine große Anwendung oder eine API ausführen. Sie möchten nie, dass es offline ist.

Ein einzelner Fehlerpunkt ist ein Teil Ihrer Infrastruktur, der bei einem Ausfall zu Ausfallzeiten führt. Ein Beispiel wäre, einen Server zu verwenden, um sowohl Ihren Webserver als auch Ihre Datenbank zu hosten. Ausfälle werden häufig durch diese einzelnen Fehlerquellen verursacht, und wir möchten unsere Infrastruktur so gestalten, dass diese Situationen vermieden werden.

Eine hochverfügbare Infrastruktur hat keinen einzigen Ausfallpunkt. In der Regel bedeutet dies, dass Ihre Infrastruktur nach Service unterteilt ist und jeder Service auf mehr als einem Server ausgeführt wird. Wenn ein Server ausfällt, sind andere Server verfügbar, um Anforderungen zu verarbeiten. Eine hochverfügbare Konfiguration ist nicht nur für die Redundanz wichtig, sondern ermöglicht auch eine schnellere und kostengünstigere Skalierung Ihrer Infrastruktur.

Stellen Sie sich einen Webdienst vor, der Ihre Dateien hostet. Stellen Sie sich jetzt vor, dass es auf drei unabhängigen Servern ausgeführt wird. Wir haben ein paar unmittelbare Probleme. Wie können Benutzer auf diese Server zugreifen? Wir könnten DNS-Einträge für jeden der unabhängigen Server hinzufügen. Benutzer würden leider zufällig zu Servern weitergeleitet und könnten an einen Server gesendet werden, der offline ist.

Wir können diese Fallstricke vermeiden, indem wir unserer Infrastruktur einen Load Balancer hinzufügen. Der Lastenausgleich führt Integritätsprüfungen für jeden Server durch, den er in seiner Konfiguration hat. Wenn ein Server offline ist, sendet der Load Balancer keine Benutzeranforderungen an ihn. Ein Lastenausgleich erhöht die Leistung, indem Benutzer effektiver an den besten verfügbaren Server weitergeleitet werden.

Die einzige zusätzliche Sorge, die wir bei dieser Hinzufügung haben würden, besteht darin, sicherzustellen, dass der Lastausgleich selbst kein einzelner Fehlerpunkt ist. Wir haben darüber nachgedacht und verfügen über zwei Komplettlösungen, die sowohl auf der Load-Balancer-Ebene als auch auf den Back-End-Servern hoch verfügbar sind.

Unser Setup

In diesem Kapitel werden zwei Möglichkeiten zum Bereitstellen einer Lösung mit Lastenausgleich und wenigen Webservern vorgestellt. Am Ende dieses Abschnitts (Kapitel 4 - 6) werden mehrere Load Balancer vor den Web- und Datenbankdiensten eingerichtet, um sicherzustellen, dass keine einzelnen Fehlerquellen auftreten.

Es gibt verschiedene Möglichkeiten zum Einrichten des Lastenausgleichs. Wir werden zwei Beispiel-Setups durchgehen, die beide einen Nginx-Webdienst im Backend bereitstellen.

Die erste Lösung verwendet DigitalOcean Load Balancers, einen hoch verfügbaren Dienst, der die Failover-Wiederherstellung automatisch abwickelt. Sie bieten auch die Möglichkeit, Datenverkehr auf der Grundlage von tags anstelle einer manuellen Liste an Droplets weiterzuleiten, um die Skalierung zu vereinfachen.

Die zweite Lösung ist eine benutzerdefinierte Lösung für den Lastenausgleich mit HAProxy und DigitalOcean Floating IPs, bei denen es sich um statische IP-Adressen handelt, die innerhalb von a zugewiesen und neu zugewiesen werden können Region automatisch über die Systemsteuerung oder die API. Sie können sie verwenden, um den Datenverkehr zu einem Standby-Load-Balancer umzuleiten, falls der Haupt-Load-Balancer ausfällt.

Da wir Terraform und Ansible in diesem Buch zum ersten Mal verwenden, werden wir diesen Abschnitt etwas manuell durchgehen, um Ihnen die Möglichkeit zu geben, Ihre eigenen Projekte von Hand zu erstellen. Während wir im nächsten Kapitel mit komplexeren Setups fortfahren, werden wir den größten Teil der Konfiguration automatisieren.

Verwenden von DigitalOcean Load Balancern

Einrichten des DigitalOcean Load Balancer

Wechseln Sie auf dem Controller-Droplet zu das Verzeichnis für dieses Kapitel in unserem Repository.

cd /root/navigators-guide/example-code/02-scale/ch04/digitalocean_loadbalancer

In diesem Verzeichnis befindet sich a `+ terraform.tfvars.sample + `file. Diese Beispieldatei enthält Kommentare und Notizen, mit denen Sie die benötigten Informationen finden können. Ohne die Kommentare sieht die Datei folgendermaßen aus:

do_token = ""

project = "DO-LB"

region = "sfo2"

image_slug = "debian-9-x64"

keys = ""

private_key_path = ""

ssh_fingerprint = ""

public_key = ""

Damit erstellen Sie einen DigitalOcean Load Balancer und einige Droplets, auf denen Nginx ausgeführt wird. Auf jedem Webserver wird eine einfache Begrüßungsnachricht mit dem Hostnamen des einzelnen Droplets angezeigt.

Füllen Sie die Variablen gemäß den Anweisungen in den Kommentaren aus und benennen Sie die Datei in "+ terraform.tfvars +" um.

mv terraform.tfvars.sample terraform.tfvars

Für diese Konfiguration ist kein TLS-Zertifikat erforderlich, es kann jedoch dem DigitalOcean Load Balancer hinzugefügt werden. Die DigitalOcean Load Balancer-Funktion ist auch in Let’s Encrypt integriert, das kostenlose Zertifikate bereitstellt. Für Lets Encrypt muss ein Domainname registriert und Ihrem DigitalOcean-Konto hinzugefügt werden.

Bereiten Sie als Nächstes die Terraform-Bereitstellung vor und führen Sie sie aus. Analysieren Sie zuerst die Plandateien und Module mit + terraform init +. Optional können Sie + terraform plan + ausführen, um zu sehen, was passiert, wenn Sie das eigentliche Skript ausführen. Wenn Sie fertig sind, führen Sie "+ terraform apply +" aus, um die Erstellungsanforderungen über die DigitalOcean-API auszuführen.

terraform init
terraform apply

Sie müssen die Ausführung bestätigen, indem Sie "+ yes +" eingeben, und Sie werden benachrichtigt, wenn die Anwendung abgeschlossen ist.

Zu diesem Zeitpunkt können Sie die öffentliche IP-Adresse Ihres Load Balancers (die Sie mit "+ terraform show +" abrufen können) in Ihrem Browser aufrufen, um den Beispielinhalt von Ihren Webservern anzuzeigen.

Terraform kann Ihren Cluster auch automatisch mit der Option + destroy + entfernen. Sie können diesen Workflow für schnelle Tests verwenden, wissen jedoch, dass alle im Cluster gespeicherten Daten entfernt werden. * Die Option + destroy + entfernt Ihren Cluster. * Dies ist der schnellste Weg, um die in diesem Kapitel geleistete Arbeit zu bereinigen. Sie können + apply + erneut ausführen, um einen neuen Cluster zu generieren.

Bevor Sie diesen Beispielcluster auflösen, testen wir, ob er tatsächlich hoch verfügbar ist, wie wir es erwarten.

Testen der Clusterverfügbarkeit

Um die Verfügbarkeit der Back-End-Webserver zu testen, können wir einen Server offline schalten und kontinuierlich Verbindungen vom Load Balancer anfordern. Wenn die Verbindungen weiterhin hergestellt werden, wissen wir, dass der Dienst trotz eines Serverausfalls online geblieben ist. (Das Failover des Load Balancers selbst kann nicht getestet werden, da er als Dienst ausgeführt wird. Dies bedeutet, dass Sie keinen direkten Zugriff auf die einzelnen Komponenten haben oder benötigen.)

Führen Sie den folgenden Befehl in einem Terminal aus, das einmal pro Sekunde eine Verbindung zum Load Balancer herstellt.

while true; do curl -k load_balancer_ip; sleep 1; done

Sie sehen eine kontinuierliche Ausgabe wie folgt:

Welcome to DO-LB-backend-01!
Welcome to DO-LB-backend-02!
Welcome to DO-LB-backend-03!
Welcome to DO-LB-backend-01!
Welcome to DO-LB-backend-02!
Welcome to DO-LB-backend-03!

Schalten Sie eines der Backend-Droplets aus. Wenn das Droplet offline ist, sollte der Test weiterhin gültige Antworten von den Backends Ihres anderen Load Balancers zurückgeben. Sie werden feststellen, dass das von Ihnen deaktivierte Droplet nicht mehr reagiert. Wenn Sie es wieder einschalten, wird es automatisch wieder in Rotation versetzt, sobald es die vom Load Balancer konfigurierten Prüfungen bestanden hat.

_ (Wenn Sie Hilfe beim Stoppen des laufenden Tests benötigen, können Sie die Schleife mit einem Tastenkommando + CTRL-C + verlassen.) _

Den Cluster skalieren

Das anfängliche Cluster-Setup verwendet 3 Backend-Droplets. Die Einstellung für die Anzahl der Backend-Droplets befindet sich in der Standardvariablendeklaration in der Datei variables.tf. Sie können dies überschreiben, indem Sie der Datei "+ terraform.tfvars " eine Zeile hinzufügen und die Variable " node_count +" auf 5 setzen. Sobald die Linie hinzugefügt wurde, müssen Sie den Terraform-Plan erneut anwenden.

terraform apply

Hier strahlt Terraform wirklich. Es verwaltet die Logik zum Ändern der Anzahl der Tröpfchen basierend auf dieser Variablen, sodass automatisch Tröpfchen erstellt oder zerstört werden, wenn die Variable "+ node_count +" zunimmt oder abnimmt.

Sehen Sie sich die Ausgabe im Terminal an, in dem "+ curl +" für Ihren Load Balancer ausgeführt wird. Sobald die neuen Droplets bereitgestellt wurden, werden Sie sehen, dass sie automatisch reagieren.

Welcome to DO-LB-backend-02!
Welcome to DO-LB-backend-03!
Welcome to DO-LB-backend-01!
Welcome to DO-LB-backend-02!
Welcome to DO-LB-backend-03!
Welcome to DO-LB-backend-04!
Welcome to DO-LB-backend-05!
Welcome to DO-LB-backend-01!
Welcome to DO-LB-backend-02!
Welcome to DO-LB-backend-03!
Welcome to DO-LB-backend-04!
Welcome to DO-LB-backend-05!
Welcome to DO-LB-backend-01!

Bevor Sie fortfahren, möchten Sie dieses Testprojekt zerstören. Terraform behält den aktuellen Status des Plans im aktuellen Arbeitsverzeichnis. Wenn Sie die Ressourcen über Terraform zerstören, wird der Status automatisch gelöscht.

terraform destroy

Verwendung von HAProxy und einer DigitalOcean Floating IP-Adresse

Die Bereitstellung einer benutzerdefinierten Lastausgleichslösung ist möglicherweise die richtige Wahl. Es gibt einige Optionen, die der DigitalOcean Load Balancer derzeit nicht unterstützt. Beispiele hierfür sind das Hosten mehrerer Sites oder Anwendungen als Backends, mehrere TLS-Zertifikate, die Unterstützung von Proxy-Protokollen oder die Optimierung bestimmter TCP-Parameter.

In diesem Beispiel werden HAProxy v1.8-Load-Balancer verwendet, die mithilfe einer DigitalOcean-Floating-IP für das Failover in Clustern zusammengefasst sind.

Einrichten von HAProxy

Wechseln Sie im Controller-Droplet zu das Verzeichnis für dieses Kapitel in unserem Repository.

cd /root/navigators-guide/example-code/02-scale/ch04/haproxy_loadbalancer

In diesem Verzeichnis befindet sich a `+ terraform.tfvars.sample + `file. Diese Beispieldatei enthält Kommentare und Notizen, mit denen Sie die benötigten Informationen finden können. Ohne die Kommentare sieht die Datei folgendermaßen aus:

do_token = ""

project = "HAPROXY-LB"

region = "sfo2"

image_slug = "debian-9-x64"

keys = ""

private_key_path = ""

ssh_fingerprint = ""

public_key = ""

Füllen Sie die Variablen gemäß den Anweisungen in den Kommentaren aus und benennen Sie die Datei in "+ terraform.tfvars +" um.

mv terraform.tfvars.sample terraform.tfvars

Bereiten Sie als Nächstes die Terraform-Bereitstellung vor und führen Sie sie aus. Analysieren Sie zuerst die Plandateien und Module mit + terraform init +. Optional können Sie + terraform plan + ausführen, um zu sehen, was passiert, wenn Sie das eigentliche Skript ausführen. Wenn Sie fertig sind, führen Sie "+ terraform apply +" aus, um die Erstellungsanforderungen über die DigitalOcean-API auszuführen.

terraform init
terraform apply

Sie müssen die Ausführung bestätigen, indem Sie "+ yes +" eingeben, und Sie werden benachrichtigt, wenn die Anwendung abgeschlossen ist.

Wenn Sie jetzt "+ terraform show " ausführen, werden die von Ihnen bereitgestellten Ressourcen angezeigt. Jeder Satz von Ressourcen (d. H. Droplets) wird entsprechend dem Ressourcennamen in der Terraform-Konfigurationsdatei in einen Gruppennamen eingefügt. In diesem Beispiel gibt https://github.com/digitalocean/navigators-guide/blob/master/example-code/02-scale/ch04/haproxy_loadbalancer/haproxy.tf die Ressource ` haproxy.tf +` an Deklaration bestimmt diese Gruppen.

Die drei Gruppen sind "+ load_balancer " für HAProxy, " web_node " für Nginx und " fip " für die Floating IP. Sie können mit ` terraform-inventory -inventory ` nachsehen, um ein Ansible-Inventar im INI-Format zu erhalten, oder JSON mit der Option ` -list` ausgeben.

Zu diesem Zeitpunkt werden die benötigten Droplets erstellt und ausgeführt, sie müssen jedoch noch konfiguriert werden.

Konfigurieren der Droplets mit Ansible

Wir werden die Konfiguration der Droplets mit Ansible automatisieren. Wir haben ein Ansible-Basisspielbuch, das vorkonfiguriert ist, um einige Ansible-Rollen herunterzuladen. Sie finden diese Ansible-Rollen in der Datei "https://github.com/digitalocean/navigators-guide/blob/master/example-code/02-scale/ch04/haproxy_loadbalancer/requirements.yml" ]. Sie müssen sie nicht einzeln installieren. Sie können die erforderlichen Rollen mit Ansible Galaxy herunterladen.

Dieser Befehl platziert die Rollen im Verzeichnis "+ role +".

ansible-galaxy install -r requirements.yml

Für diese Rolle müssen noch einige weitere Variablen festgelegt werden. Wir kehren zum Verzeichnis _ / root / navigators-guide / beispielcode / 02-scale / ch04 / haproxyloadbalancer / groupvars / load_balancer / _ zurück. Wenn Sie die vorhandene * vars.yml * -Datei anzeigen, sehen Sie, dass "+ do_token " und " ha_auth_key " die Werte von " vault_do_token " bzw. " vault_ha_auth_key " zugewiesen bekommen. Wir werden eine sekundäre Datei mit dem Namen * vault.yml * erstellen und die Variablen ` vault_ +` initialisieren.

Sie benötigen zwei Dinge, um die Variablen festzulegen. Ein DigitalOcean-API-Token, das zur Verarbeitung der unverankerten IP-Zuweisung für Failover-Szenarien verwendet wird, und ein SHA-1-Hash, der zur Authentifizierung von Clustermitgliedern verwendet wird. Wir haben ein Tool, um dies für Sie zu erstellen.

cd /root/navigators-guide/example-code/02-scale/ch04/haproxy_loadbalancer/
./gen_auth_key

Sobald dieser authkey erstellt wurde, erstellen Sie die Datei groupvars / load_balancer / vault.yml