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 Befehlcreate
gibt 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.