So arbeiten Sie mit DigitalOcean Load Balancern mit Doctl

Einführung

Mit DigitalOcean Load Balancern können Sie auf einfache Weise HTTP-, HTTPS- und TCP-Datenverkehr zwischen mehreren Back-End-Servern verteilen. In diesem Tutorial verwenden wirdoctl - den offiziellen Befehlszeilenclient für die DigitalOcean-API -, um einen Load Balancer für mehrere Backend-Webserver zu erstellen und zu konfigurieren.

Voraussetzungen

Bevor Sie mit diesem Lernprogramm beginnen, sollten Sie sich mitdoctl und DigitalOcean Load Balancers vertraut machen. Die folgenden Artikel werden hilfreich sein:

Sie sollten sicherstellen, dassdoctl Version 1.6.0 oder höher installiert und authentifiziert ist, bevor Sie fortfahren. Überprüfen Sie Ihredoctl-Version, indem Siedoctl version ausführen. Sie müssen außerdem einen SSH-Schlüssel zu Ihrem DigitalOcean-Konto hinzufügen.

[[Schritt 1 - Einrichten der Backend-Webserver]] == Schritt 1 - Einrichten der Backend-Webserver

Zuerst verwenden wirdoctl, um die beiden Webserver zu erstellen, auf die unser Load Balancer den Datenverkehr leitet. Wir beginnen mit zwei Servern, auf denen der LAMP-Stack (Linux, Apache, MySQL, PHP) vorinstalliert ist, und aktualisieren sie für jede einzelne Webseite. Auf diese Weise können wir überprüfen, ob der Lastenausgleich tatsächlich Verbindungen zwischen mehreren Servern verteilt.

Um die beiden Server zu erstellen, müssen wir zuerst die Region kennen, in der sie sich befinden sollen, und den Fingerabdruck des SSH-Schlüssels, den wir verwenden möchten. Wir werden dienyc1-Region für dieses Tutorial verwenden. Sie können alle Regionen und ihre verkürzten Schnecken mitdoctl auflisten:

doctl compute region list
OutputSlug    Name               Available
nyc1    New York 1         true
sfo1    San Francisco 1    true
nyc2    New York 2         true
ams2    Amsterdam 2        true
sgp1    Singapore 1        true
lon1    London 1           true
nyc3    New York 3         true
ams3    Amsterdam 3        true
fra1    Frankfurt 1        true
tor1    Toronto 1          true
sfo2    San Francisco 2    true
blr1    Bangalore 1        true

Wählen Sie den Slug für die Region, die Sie verwenden möchten.

[.note] #Note: Ihr Load Balancer und seine Zieltröpfchen müssen sich alle in derselben Region befinden.
#

Verwenden Sie erneutdoctl, um den Fingerabdruck Ihres SSH-Schlüssels zu ermitteln:

doctl compute ssh-key list
OutputID         Name          FingerPrint
7738555    sammy@host    your_ssh_key_fingerprint

Notieren Sie sich in der Ausgabe den Fingerabdruck des von Ihnen verwendeten SSH-Schlüssels. Wir werden es für den nächsten Befehl brauchen.

Wir werden ein Ein-Klick-LAMP-Stack-Image unter Ubuntu 16.04 verwenden und dieses auf ein 512-MB-Droplet übertragen. Die verschiedenen Optionen für Bilder und Tröpfchengrößen können mit dem Befehllist auch mitdoctl aufgelistet werden. Weitere Informationen hierzu finden Sie inCreating, Deleting, and Inspecting Droplets section des vorausgesetzten Artikels.

Nachdem wir alle Informationen haben, können wir die beiden Server in einem einzigen Befehl erstellen:

doctl compute droplet create web-1 web-2 \
    --region nyc1 \
    --image lamp-16-04 \
    --ssh-keys your_ssh_key_fingerprint \
    --enable-private-networking \
    --size 512mb

web-1 undweb-2 sind die Namen der Server. Wir haben auch--enable-private-networking ausgewählt. Dadurch wird sichergestellt, dass der Datenverkehr vom Load Balancer zu den Ziel-Droplets im nicht gemessenen privaten Netzwerk von DigitalOcean verbleibt.

Der Befehlcreate gibt Informationen zu den neuen Tröpfchen aus:

OutputID          Name     Public IPv4    Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48463543    web-1                                                  512       1        20      nyc1      Ubuntu LAMP on 16.04    new
48463544    web-2                                                  512       1        20      nyc1      Ubuntu LAMP on 16.04    new

Unsere beiden Server werden jetzt bereitgestellt. Warten Sie einige Minuten, bis der Vorgang abgeschlossen ist, und listen Sie dann Ihre Web-Droplets auf:

doctl compute droplet list web-*

Der Befehllist akzeptiert das Platzhalterzeichen*. In diesem Fall werden nur Tröpfchen mit mindestensweb- im Namen angezeigt:

OutputID          Name      Public IPv4        Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48603683    web-1    111.111.111.111     111.111.111.333                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active
48603684    web-2    111.111.111.222     111.111.111.444                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active

Beachten Sie, dass den Droplets jetzt IPv4-Adressen zugewiesen sind und alsactive aufgeführt sind. Wenn Sie in Ihrem Webbrowser zu einer der öffentlichen Adressen der Droplets navigieren, wird eine standardmäßige Apache-Platzhalterseite geladen. Fügen wir jeder Seite eine neue eindeutige Seite hinzu, damit wirweb-1 vonweb-2 unterscheiden können.

Wir können überdoctl SSH an unseren Server senden:

doctl compute ssh web-1

Dadurch werden Sie mit dem bei der Erstellung angegebenen SSH-Schlüssel alsroot verbunden und angemeldet. Öffnen Sie eine neue HTML-Datei auf dem Server. Wir verwenden den Texteditor vonnano:

nano /var/www/html/test.html

Fügen Sie das folgende HTML-Snippet ein:

/var/www/html/test.html

Hello from web-1!

Speichern Sie die Datei und beenden Sie den Texteditor. Dies ist keine vollständige HTML-Datei, aber die Browser sind verzeihend und für unsere Zwecke ausreichend.

Navigieren Sie zu der folgenden Adresse, um sicherzustellen, dass die neue Seite ordnungsgemäß geschaltet wird. Stellen Sie sicher, dass der hervorgehobene Teil durch die richtige IP-Adresse ersetzt wird:

http://web-1_public_ip_address/test.html

Auf der Seite sollten Sie die ÜberschriftHello from web-1! sehen, die wir gerade erstellt haben.

Beenden Sie die SSH-Sitzung:

exit

Stellen Sie nun eine SSH-Verbindung zum zweiten Server her und wiederholen Sie den Vorgang mit einer anderen Meldung auf der HTML-Seite:

doctl compute ssh web-2

Öffnen Sie die neue HTML-Datei:

nano /var/www/html/test.html

Fügen Sie den Inhalt ein:

/var/www/html/test.html

Hello from web-2!

Speichern und beenden Sie den Texteditor und beenden Sie dann die SSH-Sitzung:

exit

Verwenden Sie Ihren Browser, um zu überprüfen, obweb-2 auch die neue Webseite ordnungsgemäß bereitstellt. In diesem Fall sind wir bereit, einen Lastenausgleich zu erstellen, um die Last zwischen unseren beiden Servern zu verteilen.

[[Schritt-2 - Erstellen eines Load-Balancers]] == Schritt 2 - Erstellen eines Load-Balancers

Wir werden unseren neuen Load Balancer in der Regionnyc1erstellen. Beachten Sie erneut, dass sich der Load Balancer und seine Ziel-Droplets in derselben Region befinden müssen. Verwenden Sie daher unbedingt die Region, in der sich Ihre Droplets befinden:

doctl compute load-balancer create \
    --name load-balancer-1 \
    --region nyc1 \
    --forwarding-rules entry_protocol:http,entry_port:80,target_protocol:http,target_port:80

Dieser Befehl erstellt einen Load Balancer mit dem Namenload-balancer-1 in der Regionnyc1. Jeder Load Balancer benötigt mindestens eine Regel unter dem Flag--forwarding-rules. Diese Regeln beschreiben, wie der Load Balancer Datenverkehr akzeptiert und an die Ziele weiterleitet. Die obige Weiterleitungsregel gibt an, dass HTTP-Datenverkehr über Port 80 direkt an die Zielserver weitergeleitet wird.

Andere--forwarding-rules Protokolloptionen sindhttps undtcp, und Sie können beliebige gültige Ports für Eintrag und Ziel auswählen. Wenn Sie mehrere Weiterleitungsregeln angeben müssen, müssen Sie die gesamte Liste der Regeln in Anführungszeichen setzen und zwischen den einzelnen Regeln ein Leerzeichen einfügen. Hier ist ein Beispiel, das sowohl die HTTP- als auch die HTTPS-Weiterleitung ermöglicht:

--forwarding-rules "entry_protocol:http,entry_port:80,target_protocol:http,target_port:80 entry_protocol:https,entry_port:443,target_protocol:https,target_port:443"

Der gerade ausgeführte Befehlcreategibt Informationen zu unserem neuen Load Balancer aus:

OutputID                                      IP    Name               Status    Created At              Algorithm      Region    Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                   Forwarding Rules
ae3fa042-bfd2-5e94-b564-c352fc6874ef          load-balancer-1    new       2017-05-10T19:28:30Z    round_robin    nyc1                            false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3    entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false

Notieren Sie sich die oben hervorgehobene ID des Load Balancers, die wir im nächsten Schritt zum Hinzufügen unserer Zieltröpfchen verwenden werden. Es gibt auch Informationen zu einigen Standardkonfigurationen, die wir nicht festgelegt haben, z. B. Zustandsüberprüfungsregeln und Sticky-Sitzungen. Weitere Informationen zu diesen Optionen finden Sie inprerequisite load balancer article. Um Details zum Festlegen dieser Optionen mitdoctl zu erhalten, können Sie den Befehlcreate immer mit einem--help-Flag ausführen. Für die Erstellung von Load Balancer sieht das folgendermaßen aus:

doctl compute load-balancer create --help

Dadurch wird eine Liste aller verfügbaren Befehlszeilen-Flags und -Optionen ausgegeben. Sie können dieses--help-Flag für jedendoctl-Befehl verwenden.

Nachdem unser Load Balancer erstellt wurde, müssen wir ihm die Zieltröpfchen hinzufügen. Das machen wir im nächsten Abschnitt.

[[Schritt 3 - Hinzufügen von Tröpfchen zum Load Balancer]] == Schritt 3 - Hinzufügen von Tröpfchen zum Load Balancer

Lassen Sie uns die Informationen für unsere beiden Droplets noch einmal auflisten, damit wir ihre IDs erhalten können:

doctl compute droplet list web-*
OutputID          Name      Public IPv4        Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48603683    web-1    111.111.111.111    111.111.111.333                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active
48603684    web-2    111.111.111.222     111.111.111.444                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active

Die IDs sind in der obigen Beispielausgabe hervorgehoben. Be sure to use your actual IDs, not the examples.

Jetzt verwenden wir den Befehladd-droplets, um die Zieltröpfchen zu unserem Load Balancer hinzuzufügen. Geben Sie die ID des im vorherigen Schritt erstellten Load Balancers an:

doctl compute load-balancer add-droplets
    ae3fa042-bfd1-4e94-b564-c352fc6874ef \
    --droplet-ids 48463543,48463544

Wir können jetzt den Befehlget verwenden, um die aktualisierten Informationen für unseren Load Balancer abzurufen:

doctl compute load-balancer get ae3fa042-bfd1-4e94-b564-c352fc6874ef
OutputID                                      IP                Name               Status    Created At              Algorithm      Region    Tag    Droplet IDs          SSL      Sticky Sessions                                Health Check                                                                                                                   Forwarding Rules
ae3fa042-bfd1-4e94-b564-c352fc6874ef    111.111.111.555    load-balancer-1    active    2017-05-10T19:28:30Z    round_robin    nyc1             48603683,48603684    false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3    entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false

Beachten Sie, dass der Status jetztactive ist, wir eine IP zugewiesen haben und unsere Zieltröpfchen aufgelistet sind. Navigieren Sie in Ihrem Browser zu dieser neuen IP mit Lastenausgleich und laden Sie erneut die Seitetest.html. Die URL sieht folgendermaßen aus:

http://load-balancer-1_ip_address/test.html

Ihr Browser lädt die Nachricht entweder vonweb-1 oderweb-2. Aktualisieren Sie die Seite und Sie sollten die Nachricht des anderen Servers sehen. Unser Load Balancer befindet sich im Modusround robin, dh er sendet für jede Anforderung Verbindungen zum nächsten Droplet in der Liste. Die Alternative ist derleast connections-Modus, in dem der Load Balancer neuen Datenverkehr an das Ziel sendet, das die wenigsten aktiven Verbindungen hat.

Nachdem wir wissen, dass unser Load Balancer funktioniert, deaktivieren wir einen Server und sehen, wie er mit der Unterbrechung umgeht.

[[Schritt 4 - Testen des Failovers]] == Schritt 4 - Testen des Failovers

Ein großer Vorteil von Load Balancern ist die erhöhte Toleranz gegenüber Problemen mit einzelnen Backend-Webservern. Der Load Balancer führt in festgelegten Intervallen (standardmäßig alle 10 Sekunden) eine Integritätsprüfung durch. Die Standardintegritätsprüfung besteht darin, eine Webseite auf dem Zielserver abzurufen. Wenn diese Prüfung mehrmals hintereinander fehlschlägt, wird das Ziel aus der Rotation entfernt und es wird kein Verkehr an das Ziel gesendet, bis es wiederhergestellt ist.

Testen Sie die Failover-Funktion, indem Sie die Integritätsprüfung nicht bestehen. SSH zurück inweb-2:

doctl compute ssh web-2

Fahren Sie nun den Apache-Webserver herunter:

systemctl stop apache2

Kehren Sie zum Browser zurück und aktualisieren Sie die Seite mit dem Lastenausgleich einige Male. Zuerst könnten einige503 Service UnavailableFehler auftreten. Standardmäßig wartet der Load Balancer, bis drei Integritätsprüfungen fehlgeschlagen sind, bevor ein Server aus dem Pool entfernt wird. Dies dauert ungefähr 30 Sekunden. Danach werden nur noch Antworten vonweb-1 angezeigt.

Starten Sie Apache Backup aufweb-2:

systemctl start apache2

Nach kurzer Zeit erkennt der Load Balancer erneut, dassweb-2 aktiv ist, und wird wieder zum Pool hinzugefügt. Beim Aktualisieren der Seite werden die Antworten vonweb-2angezeigt.

Ihr Load Balancer ist jetzt wieder voll funktionsfähig.

Lesen Sie die nächsten Schritte, mit denen Sie Ihren Load Balancer produktionsbereit machen können.

Fazit

In diesem Lernprogramm haben wirdoctl verwendet, um einen DigitalOcean Load Balancer und einige Backend-Webserver zu erstellen, den Load Balancer so konfiguriert, dass HTTP-Verkehr an die Backend-Server gesendet wird, und die Integritätsprüfungsfunktion des Load Balancers getestet. Sie können noch einige weitere Schritte ausführen, um Ihren Load Balancer für die Produktion vorzubereiten:

  • Sie möchten einen Domain-Namen auf Ihren Load Balancer verweisen, damit Ihre Benutzer keine unfreundliche IP-Adresse eingeben. Wie das geht, erfahren Sie in unserem TutorialHow To Set Up a Host Name with DigitalOcean.

  • Mit DigitalOcean können Sie Ihre Tropfen markieren, damit Sie sie organisiert halten und ganze Sätze von Tropfen als Gruppe ansprechen können. Sie können Ihren Load Balancer so konfigurieren, dass Datenverkehr an alle Droplets in einem bestimmten Tag gesendet wird, anstatt einzelne Droplets hinzuzufügen. Auf diese Weise können Sie dem Pool neue Back-End-Server dynamischer hinzufügen. Informationen zu DigitalOcean-Tags finden Sie inHow To Tag DigitalOcean Droplets.

  • Wenn Sie Ihrer Website mit Lastenausgleich HTTPS-Sicherheit hinzufügen müssen, finden Sie in den Tutorials zwei Möglichkeiten, wie Sie dies erreichen können:SSL passthrough undSSL termination.