So automatisieren Sie die Skalierung Ihrer Webanwendung auf DigitalOcean Ubuntu 14.04-Droplets

Einführung

In diesem Lernprogramm wird gezeigt, wie Sie mit der DigitalOcean-API Ihre Serverkonfiguration horizontal skalieren können. Zu diesem Zweck verwenden wirDOProxy, ein relativ einfaches Ruby-Skript, das nach seiner Konfiguration eine Befehlszeilenschnittstelle bereitstellt, um die Schicht Ihres HTTP-Anwendungsservers nach oben oder unten zu skalieren.

DOProxy, das speziell für dieses Lernprogramm geschrieben wurde, bietet eine einfache Möglichkeit zum Erstellen und Löschen von Anwendungsservertröpfchen mithilfe der DigitalOcean-API und zum automatischen Verwalten dieser Tröpfchen hinter einem HAProxy-Lastenausgleich. Dieses grundlegende Skalierungsmodell ermöglicht Ihren Benutzern den Zugriff auf Ihre Anwendung über den HAProxy-Server, der sie an die Backend-Anwendungsserver mit Lastenausgleich weiterleitet.

DOProxy führt drei Hauptfunktionen aus:

  • Erstellen Sie ein Droplet und fügen Sie es dem Load Balancer hinzu

  • Löschen Sie ein Droplet und entfernen Sie es aus dem Load Balancer

  • Führen Sie ein Inventar der erstellten Tröpfchen, bis sie gelöscht werden

DOProxy create

Note: Der Hauptzweck dieses Lernprogramms besteht darin, die minimal erforderlichen Konzepte zu vermitteln, die zum programmgesteuerten Skalieren Ihrer DigitalOcean-Serverarchitektur über die API erforderlich sind. Sie sollten DOProxy in seiner aktuellen Form nicht in einer Produktionsumgebung ausführen. Es wurde nicht mit Blick auf die Ausfallsicherheit entwickelt und führt gerade genug Fehlerprüfungen durch, um durchzukommen. Wenn Sie jedoch neugierig auf das Erlernen der horizontalen Skalierung über die API sind, ist dies eine gute Möglichkeit, um loszulegen.

Voraussetzungen

Dieses Tutorial behandelt eine Reihe von Technologien, die Sie möglicherweise lesen möchten, bevor Sie fortfahren, darunter:

Da DOProxy in Ruby geschrieben ist, sind Kenntnisse in Ruby von Vorteil, aber nicht erforderlich. Wir werden Pseudocode bereitstellen, um den Kern des DOProxy-Codes zu erklären. Außerdem werden wir den offiziellen DigitalOcean Ruby-WrapperDropletKit verwenden, mit dem wir problemlos API-Aufrufe in unserem Ruby-Code durchführen können.

Bevor wir uns mit den Details von DOProxy befassen, werden wir es auf einem Server installieren und verwenden. Lassen Sie uns DOProxy jetzt auf einem Ubuntu 14.04-Droplet installieren.

Installieren Sie DOProxy

Erstellen Sie zunächst ein Ubuntu 14.04-Droplet in der Region NYC3 (Sie können jede Region verwenden, dieprivate networking unduserdata unterstützt, wenn Sie die Variableregion nach der Installation in der Dateidoproxy.yml konfigurieren DOProxy). In diesem Droplet werden der HAProxy-Lastenausgleich und das DOProxy-Skalierungsskript ausgeführt. Wählen Sie daher eine Größe, die Ihrer Meinung nach für Ihr gewünschtes Skalierungspotenzial geeignet ist. Da dieses Tutorial eine grundlegende Demonstration der Skalierung ist, bei der kein echter Datenverkehr auftritt, ist die Größe von 1 GB wahrscheinlich ausreichend.

Wir werden dieses Tröpfchen alsDOProxy server bezeichnen.

Melden Sie sich als Nächstes an und befolgen Sie die AbschnitteInstallation undConfiguration (einschließlichdoproxy config undUserdata) in den AbschnittenDOProxy GitHub repository, um DOProxy auf diesem Server zu installieren. Verwenden Sie die Beispieldateiendoproxy.yml unduser-data.yml, indem Sie sie kopieren, wie in den Anweisungen angegeben. Stellen Sie sicher, dass Sie die Wertetoken undssh_key_ids in der DOproxy-Konfigurationsdatei ersetzen. Andernfalls funktioniert das Skript nicht.

Nachdem Sie DOProxy und HAProxy auf Ihrem Server installiert haben, lassen Sie uns versuchen, unsere Umgebung zu skalieren.

Führen Sie DOProxy aus

Melden Sie sich alsroot bei Ihrem DOProxy-Server an und wechseln Sie in das Verzeichnis, in das Sie DOProxy geklont haben, falls Sie dies noch nicht getan haben.

Führen Sie jetzt DOProxy ohne Argumente aus:

ruby doproxy.rb

Dies sollte die verfügbaren Befehle wie folgt ausdrucken:

Commands:
doproxy.rb print                   # Print backend droplets in inventory file
doproxy.rb create                  # Create a new backend droplet and reload
doproxy.rb delete     # Delete a droplet and reload
doproxy.rb reload                  # Generate HAProxy config and reload HAProxy
doproxy.rb generate                # Generate HAProxy config based on inventory

Derzeit hat DOProxy keine Tröpfchen erstellt. Erstellen wir einige, um unseren HTTP-Service online zu stellen und zu skalieren.

Skalieren (Erstellen)

Führen Sie den Befehl create aus, um das erste von DOProxy verwaltete Droplet zu erstellen:

ruby doproxy.rb create

Dies dauert einige Zeit, bevor Sie zur Eingabeaufforderung zurückkehren (da das Skript über die API ein neues Droplet erstellt und darauf wartet, dass es gestartet wird). Wir werden später beim Durchlaufen des DOProxy-Codes darüber sprechen, wie der API-Aufruf erfolgt.

Wenn der Vorgang abgeschlossen ist, sollte eine Erfolgsmeldung mit der Droplet-ID wie folgt angezeigt werden:

Success: 4202645 created and added to backend.

Wenn Sie die öffentliche IP-Adresse Ihres DOProxy-Servers in einem Webbrowser aufrufen. Sie sollten eine Seite sehen, auf der diehostname,id undpublic IP address Ihres neuen Tröpfchens aufgelistet sind.

Wir werden DOProxy verwenden, um zwei weitere Tröpfchen für insgesamt drei zu erstellen. Sie können gerne mehr erstellen, wenn Sie möchten:

ruby doproxy.rb create
ruby doproxy.rb create

Besuchen Sie nun die öffentliche IP-Adresse Ihres DOProxy-Servers erneut in einem Webbrowser. Wenn Sie die Seite aktualisieren, werden Sie feststellen, dass sich die Informationen auf der Seite ändern. Sie durchlaufen die von Ihnen erstellten Tröpfchen. Dies liegt daran, dass alle von HAProxy Lastenausgleich ausgeführt werden. Jedes Droplet wird bei der Erstellung der Load-Balancer-Konfiguration hinzugefügt.

Wenn Sie in der DigitalOcean-Systemsteuerung nachsehen, werden Sie feststellen, dass diese neuen Tröpfchen dort aufgelistet werden (zusammen mit den restlichen Tröpfchen):

Droplets in Control Panel

Schauen wir uns die Tröpfchen genauer an, die mit dem Inventar von DOProxy erstellt wurden.

Inventar drucken

DOProxy bietet einen Befehlprint, mit dem alle Tröpfchen ausgedruckt werden, die Teil seines Inventars sind:

ruby doproxy.rb print

Sie sollten eine Ausgabe sehen, die ungefähr so ​​aussieht:

0) auto-nginx-0  (pvt ip: 10.132.224.168, status: active, id: 4202645)
1) auto-nginx-1  (pvt ip: 10.132.228.224, status: active, id: 4205587)
2) auto-nginx-2  (pvt ip: 10.132.252.42, status: active, id: 4205675)

In der Beispielausgabe werden Informationen zu den drei von uns erstellten Tröpfchen angezeigt, z. B. deren Hostnamen, Status und Tröpfchen-IDs. Die Hostnamen und IDs sollten mit denen übereinstimmen, die Sie beim Zugriff auf den HAProxy-Lastenausgleich (über die öffentliche IP-Adresse von DOProxy) gesehen haben.

Wie Sie vielleicht bemerkt haben, druckte DOProxy nur Informationen über die von ihm erstellten Tröpfchen. Dies liegt daran, dass ein Inventar der von ihm erstellten Tröpfchen geführt wird.

Überprüfen Sie jetzt den Inhalt derinventory-Datei:

cat inventory

Sie sollten die ID jedes Tropfens sehen, eine pro Zeile. Jedes Mal, wenn ein Tropfen erstellt wird, wird seine ID in dieser Inventardatei gespeichert.

Wie Sie vielleicht vermutet haben, durchläuft der Befehlprintvon DOProxy die Tröpfchen-IDs in der Inventardatei und führt einen API-Aufruf aus, um Tröpfcheninformationen zu jedem einzelnen abzurufen.

Es sollte beachtet werden, dass das Speichern Ihres Server-Inventars in einer einzelnen Datei nicht die beste Lösung ist - es kann leicht beschädigt oder gelöscht werden -, aber es demonstriert eine einfache Implementierung, die funktioniert. Ein verteilter Schlüsselwertspeicher wieetcd wäre eine bessere Lösung. Sie möchten auch mehr als nur die Droplet-ID im Inventar speichern (damit Sie nicht jedes Mal API-Aufrufe vornehmen müssen, wenn Sie bestimmte Droplet-Informationen anzeigen möchten).

Verkleinern (Löschen)

DOProxy hat auch einen Löschbefehl, mit dem Sie Tröpfchen in Ihrem Inventar löschen können. Für den Löschbefehl müssen Sie die Zeilennummer des zu löschenden Tropfens angeben (wie im Befehlprintangezeigt).

Bevor Sie diesen Befehl ausführen, möchten Sie wahrscheinlich Ihr Inventar drucken:

ruby doproxy.rb print

Wenn Sie beispielsweise das dritte Tröpfchen löschen möchten, geben Sie2 als Zeilennummer an:

ruby doprorxy.rb delete 2

Nach einem Moment wird die Bestätigungsmeldung angezeigt:

Success: 4205675 deleted and removed from backend.

Der Befehl delete löscht das Droplet über die API, entfernt es aus der HAProxy-Konfiguration und löscht es aus der Bestandsliste. Sie können jederzeit überprüfen, ob das Droplet mit dem DOProxy-Druckbefehl oder über das DigitalOcean-Bedienfeld gelöscht wurde. Sie werden auch feststellen, dass es nicht mehr Teil des Load Balancers ist.

HAProxy-Konfiguration

Das letzte Stück DOProxy, das wir noch nicht besprochen haben, ist die Konfiguration von HAProxy.

Wenn Sie den DOProxy-Befehlcreate oderdelete ausführen, werden die Informationen aller Tröpfchen im Inventar abgerufen und einige der Informationen zum Erstellen einer HAProxy-Konfigurationsdatei verwendet. Insbesondere werden die Droplet-ID und die private IP-Adresse verwendet, um jedes Droplet als Backend-Server hinzuzufügen.

Sehen Sie sich die letzten Zeilen der generiertenhaproxy.cfg-Datei folgendermaßen an:

tail haproxy.cfg

Sie sollten so etwas sehen:

    frontend www-http
       bind 104.236.236.43:80
       reqadd X-Forwarded-Proto:\ http
       default_backend www-backend

    backend www-backend

       server www-4202645 10.132.224.168:80 check # id:4202645, hostname:auto-nginx-0
       server www-4205587 10.132.228.224:80 check # id:4205587, hostname:auto-nginx-1

Der Abschnittfrontendollte die öffentliche IP-Adresse Ihres DOProxy-Servers enthalten, und der Abschnittbackendollte Zeilen enthalten, die sich auf die einzelnen erstellten Tröpfchen beziehen.

Note: An dieser Stelle möchten Sie möglicherweise den Rest der mit DOProxy erstellten Tröpfchen löschen (ruby doproxy.rb delete 0, bis alle Server verschwunden sind).

Nachdem Sie die Skalierung von DOProxy in Aktion gesehen haben, schauen wir uns den Code genauer an.

DOProxy Code

In diesem Abschnitt werden wir uns die relevanten Dateien und Codezeilen ansehen, mit denen DOProxy funktioniert. Wenn Sie sehen, wie DOProxy implementiert wurde, erhalten Sie einige Ideen, wie Sie die API zum Verwalten und Automatisieren Ihrer eigenen Serverinfrastruktur verwenden können.

Da Sie das Repository auf Ihren Server geklont haben, können Sie sich die Dateien dort oder die Dateien im DOProxy-Repository(https://github.com/thisismitch/doproxy) ansehen.

Wichtige Dateien:

  • doproxy.rb: DOProxy Ruby-Skript. Stellt die Befehlszeilenschnittstelle und die Gehirne hinter DOProxy bereit

  • doproxy.yml: DOProxy-Konfigurationsdatei. Enthält API-Token und gibt Optionen zum Erstellen von Tröpfchen an

  • haproxy.cfg.erb: HAProxy-Konfigurationsvorlage. Wird verwendet, um eine Load Balancer-Konfiguration mit den richtigen Backend-Serverinformationen zu generieren

  • inventory: Droplet-Inventardatei. Speichert IDs der erstellten Tröpfchen

  • user-data.yml: Benutzerdatendatei. Eine Cloud-Konfigurationsdatei, die beim Erstellen auf einem neuen Droplet ausgeführt wird

Lassen Sie uns zuerst in die Konfigurationsdateien eintauchen.

doproxy.yml

Die wichtigen Zeilen in der DOProxy-Konfigurationsdateidoproxy.yml lauten wie folgt:

token: 878a490235d53e34b44369b8e78
ssh_key_ids:           # DigitalOcean ID for your SSH Key
  - 163420
...
droplet_options:
  hostname_prefix: auto-nginx
  region: nyc3
  size: 1gb
  image: ubuntu-14-04-x64

Intoken können Sie das API-Tokenread and writekonfigurieren.

Die anderen Zeilen geben die Optionen an, die verwendet werden, wenn DOProxy ein neues Droplet erstellt. Beispielsweise wird der angegebene SSH-Schlüssel (nach ID oder Fingerabdruck) installiert und den Hostnamen wird das Präfix "auto-nginx" vorangestellt.

Weitere Informationen zu gültigen Tröpfchenoptionen finden Sie unterDigitalOcean API documentation.

user-data.yml

Die Benutzerdatendateiuser-data.yml ist eine Datei, die von Cloud-Init für jedes neue Droplet ausgeführt wird, wenn es erstellt wird. Dies bedeutet, dass Sie eine Cloud-Konfigurationsdatei oder ein Skript bereitstellen können, um Ihre Anwendungssoftware auf jedem neuen Droplet zu installieren.

Die Beispiel-Benutzerdatendatei enthält ein einfaches Bash-Skript, das Nginx auf einem Ubuntu-Server installiert und dessen Standardkonfigurationsdatei durch den Hostnamen, die ID und die öffentliche IP-Adresse des Droplets ersetzt:

#!/bin/bash

apt-get -y update
apt-get -y install nginx
export DROPLET_ID=$(curl http://169.254.169.254/metadata/v1/id)
export HOSTNAME=$(curl -s http://169.254.169.254/metadata/v1/hostname)
export PUBLIC_IPV4=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
echo Droplet: $HOSTNAME, ID: $DROPLET_ID, IP Address: $PUBLIC_IPV4 > /usr/share/nginx/html/index.html

Die Tröpfcheninformationen (Hostname, ID und IP-Adresse) werden über den DigitalOcean-Metadatendienst abgerufen - genau das tun diesecurl-Befehle.

Offensichtlich möchten Sie etwas Nützlicheres tun, wie das Installieren und Konfigurieren Ihrer Anwendung. Auf diese Weise können Sie die Integration Ihrer Droplets in Ihre gesamte Infrastruktur automatisieren, indem Sie beispielsweise SSH-Schlüssel automatisch installieren und eine Verbindung zu Ihren Konfigurationsverwaltungs- oder Überwachungstools herstellen.

Weitere Informationen zu Benutzerdaten, Cloud-Konfiguration und Metadaten finden Sie unter den folgenden Links:

haproxy.cfg.erb

Die HAProxy-Konfigurationsvorlagehaproxy.cfg.erb enthält den größten Teil der Load-Balancer-Konfiguration mit Ruby-Code, der durch Backend-Droplet-Informationen ersetzt wird.

Wir schauen uns nur den Ruby-Abschnitt an, der die Backend-Konfiguration generiert:

backend www-backend
   <% @droplets.each_with_index do |droplet, index| %>
   server www-<%= droplet.id %> <%= droplet.private_ip %>:80 check # id:<%= droplet.id %>, hostname:<%= droplet.name -%>
   <% end %>

Dieser Code durchläuft jedes der Droplets im Inventar und fügt für jedes ein neues HAProxy-Backend hinzu (basierend auf der privaten IP-Adresse).

Zum Beispiel wird eine Linie wie diese für jedes Tröpfchen erzeugt:

server www-4202645 10.132.224.168:80 check # id:4202645, hostname:auto-nginx-0

Immer wenn ein Droplet erstellt oder gelöscht wird, generiert DOProxy eine neue HAProxy-Konfigurationsdatei - diehaproxy.cfg-Datei, die Sie zuvor angesehen haben.

doproxy.rb

Das DOProxy Ruby-Skriptdoproxy.rb besteht hauptsächlich aus einer DOProxy-Klasse, die die Methoden zum Erstellen und Löschen von Tröpfchen, zur Bestandsverwaltung und zur Generierung der HAProxy-Konfiguration enthält.

Wenn Sie Ruby verstehen, überprüfen Sie die Datei auf GitHub:https://github.com/thisismitch/doproxy/blob/master/doproxy.rb.

Wenn Sie Ruby nicht verstehen, finden Sie hier einen vereinfachten Pseudocode, der die einzelnen Methoden erläutert. Es kann nützlich sein, dies mit dem tatsächlichen Ruby-Code abzugleichen, um zu verstehen, was gerade passiert.

def initialisieren

Wird bei jeder Ausführung von DOProxy ausgeführt, sofern keine Argumente angegeben sind.

  1. Lesen Sie die Konfigurationsdatei vondoproxy.yml(API-Token und Droplet-Optionen abrufen). 2ifiziert.

def get_inventory

Ruft Informationen für jedes Tröpfchen in der Inventardatei ab. Es muss ausgeführt werden, bevor eine der folgenden Methoden ausgeführt wird.

  1. Inventardatei lesen (die Tröpfchen-IDs enthält)

  2. Verwenden Sie für jede Tropfen-ID die API, um Tropfeninformationen abzurufen

def print_inventory

Wenn der Befehl "doproxy.rb print" verwendet wird, werden Tröpfcheninformationen auf dem Bildschirm gedruckt. Es basiert aufget_inventory.

  1. Drucken Sie für jedes Tröpfchen im Inventar den Hostnamen, die private IP-Adresse, den Status und die ID (die vonget_inventory abgerufen wurden).

def create_server

Wenn der Befehl "doproxy.rb create" verwendet wird, wird ein neues Droplet erstellt und zur Inventardatei hinzugefügt. Anschließend wirdreload_haproxy aufgerufen, um die HAProxy-Konfiguration zu generieren und den Load Balancer neu zu laden.

  1. Lesen Sie die Benutzerdaten-Datei

  2. Verwenden Sie die API, um ein Droplet basierend auf den angegebenen Benutzerdaten und Optionen zu erstellen

  3. Warten Sie, bis der Tröpfchenstatus "aktiv" wird. Verwenden Sie die API, um alle 15 Sekunden Tröpfcheninformationen abzurufen, bis sich der Status ändert

  4. Wenn der Status "aktiv" ist, fügen Sie die Tröpfchen-ID zur Inventardatei hinzu

  5. Rufen Siereload_haproxy auf, um die HAProxy-Konfiguration zu generieren und den Load Balancer neu zu laden

def delete_server (line_number)

Wenn der Befehl "doproxy.rb delete" verwendet wird, wird das angegebene Droplet gelöscht und seine ID aus der Inventardatei gelöscht. Anschließend wirdreload_haproxy aufgerufen, um die HAProxy-Konfiguration zu generieren und den Load Balancer neu zu laden.

  1. Entfernen Sie die angegebene Zeile aus der Inventardatei (Droplet-ID löschen).

  2. Verwenden Sie die API, um Tröpfchen anhand ihrer ID zu löschen

  3. Rufen Siereload_haproxy auf, um die HAProxy-Konfiguration zu generieren und den Load Balancer neu zu laden

def generate_haproxy_cfg

Dies ist eine unterstützende Methode, mit der neue HAProxy-Konfigurationsdateien basierend auf den Tröpfchen im Inventar erstellt werden.

  1. Öffnen Sie die HAProxy-Konfigurationsvorlagehaproxy.cfg.erb

  2. Fügen Sie für jedes Droplet im Inventar einen entsprechenden Backend-Server hinzu

  3. Schreiben Sie die resultierendehaproxy.cfg-Datei auf die Festplatte

def reload_haproxy

Dies ist eine unterstützende Methode, die die HAProxy-Konfigurationsdatei an den richtigen Speicherort kopiert und HAProxy neu lädt. Dies hängt vongenerate_haproxy_cfg ab.

  1. Kopieren Sie die HAProxy-Konfigurationsdateihaproxy.cfg an den Speicherort, an dem HAProxy beim erneuten Laden liest

  2. Laden Sie HAProxy neu

Das ist der wichtigste Code, mit dem DOProxy funktioniert. Das letzte, was wir diskutieren werden, ist DropletKit, der API-Wrapper, den wir in DOProxy verwendet haben.

DropletKit Gem

DOProxy verwendetDropletKit gem, den offiziellen Ruby-Wrapper für DigitalOcean API v2, um DigitalOcean-API-Aufrufe durchzuführen. Mit DropletKit können wir ganz einfach Ruby-Programme schreiben, die folgende Aufgaben ausführen:

  • Erstellen Sie neue Tröpfchen

  • Löschen Sie vorhandene Tröpfchen

  • Hier erhalten Sie Informationen zu vorhandenen Tröpfchen, z. B. Status, IP - Adresse, Tröpfchen - ID, Region usw

Dieses Lernprogramm konzentrierte sich auf diese speziellen API-Endpunkte. Beachten Sie jedoch, dass es viele andere Endpunkte gibt, die die programmgesteuerte Verwaltung Ihrer DigitalOcean-Serverinfrastruktur erleichtern können.

Fazit

Nachdem Sie nun gesehen haben, wie Sie mithilfe eines einfachen Skripts mithilfe der DigitalOcean-API, der Cloud-Konfiguration und der Metadaten eine Serverumgebung skalieren können, können Sie diese Konzepte hoffentlich anwenden, um Ihr eigenes Server-Setup zu skalieren. Obwohl DOProxy noch nicht produktionsbereit ist, sollte es Ihnen einige Ideen für die Implementierung Ihrer eigenen Skalierungslösung geben.

Denken Sie daran, dass die hier beschriebene Skalierungskonfiguration mit DOProxy großartig ist, aber durch die Verwendung in Verbindung mit einem Überwachungssystem erheblich verbessert werden könnte. Auf diese Weise können Sie die Ebene Ihres Anwendungsservers abhängig von bestimmten Bedingungen, z. B. der Auslastung der Serverressourcen, automatisch nach oben und unten skalieren.

Haben Sie Fragen oder Kommentare? Fühlen Sie sich frei, sie unten zu posten!