
Wir haben bereits
Tarantool Cartridge vorgestellt , mit dem Sie verteilte Anwendungen entwickeln und verpacken können. Lassen Sie uns nun lernen, wie Sie diese Anwendungen bereitstellen und steuern. Keine Panik, alles unter Kontrolle! Wir haben alle Best Practices für die Arbeit mit Tarantool Cartridge zusammengefasst und eine
Ansible-Rolle geschrieben , die das Paket auf Servern bereitstellt, Instanzen in Replikatsätzen startet und verknüpft, die Autorisierung konfiguriert, vshard bootet, automatisches Failover und die Patch-Cluster-Konfiguration aktiviert.
Interessant, was? Tauchen Sie ein, überprüfen Sie die Details unter dem Schnitt.
Beginnen Sie mit einer Probe
Lassen Sie sich nur durch einige der Funktionen der Rolle führen. Eine vollständige Beschreibung aller Funktionen und Eingabeparameter finden Sie immer in der
Dokumentation . Es ist jedoch besser, es einmal zu versuchen, als es hundertmal zu sehen. Lassen Sie uns daher eine kleine Anwendung bereitstellen.
Tarantool Cartridge verfügt über ein
Lernprogramm zum Erstellen einer kleinen Cartridge-Anwendung, in der Informationen zu Bankkunden und deren Konten gespeichert werden. Außerdem bietet Tarantool Cartridge eine API für die Datenverwaltung über HTTP. Zu diesem Zweck beschreibt die Anwendung zwei mögliche Rollen, die den Instanzen zugewiesen werden können:
api
und
storage
.
Cartridge selbst sagt nichts darüber aus, wie Prozesse gestartet werden - es bietet nur die Möglichkeit, die ausgeführten Instanzen zu konfigurieren. Der Rest liegt also beim Benutzer: Verteilen von Konfigurationsdateien, Ausführen von Diensten und Konfigurieren der Topologie. Aber wir werden nicht alles tun - Ansible wird es für uns tun.
Los geht's
Zunächst stellen wir unsere Anwendung auf zwei virtuellen Maschinen bereit und richten eine einfache Topologie ein:
- Der
app-1
Replikatsatz stellt die api
Rolle dar, die die vshard-router
Rolle enthält. Es wird nur eine Instanz geben. - Der
storage-1
Replikatsatz repräsentiert die storage
(einschließlich der vshard-storage
). Hier werden zwei Instanzen von verschiedenen Computern hinzugefügt.

Zum Ausführen des Beispiels benötigen wir
Vagrant und
Ansible (Version 2.8 oder höher).
Die Rolle selbst wird in
Ansible Galaxy gespeichert - einem Repository, in dem Sie Ihre Arbeit freigeben und die vorgefertigten Rollen verwenden können.
Klonen Sie nun das Beispielrepository:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git $ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Stellen Sie dann die virtuellen Maschinen bereit:
$ vagrant up
Installieren Sie anschließend die Rolle "Tarantool Cartridge Ansible":
$ ansible-galaxy install tarantool.cartridge,1.0.1
Und starte die installierte Rolle:
$ ansible-playbook -i hosts.yml playbook.yml
Warten Sie nun, bis der Playbook-Vorgang abgeschlossen ist. Wechseln Sie zu
http: // localhost: 8181 / admin / cluster / dashboard, und genießen Sie die Ergebnisse:
Sie können die Daten jetzt hochladen. Genial, nicht wahr?
Lassen Sie uns nun herausfinden, wie Sie damit arbeiten, und wir können der Topologie auch einen weiteren Replikatsatz hinzufügen.
Tiefer ins Detail gehen
Also, was ist passiert?
Wir haben zwei virtuelle Maschinen in Betrieb genommen und das Ansible-Playbook gestartet, mit dem unser Cluster konfiguriert wurde. Schauen wir uns nun die Datei
playbook.yml
:
--- - name: Deploy my Tarantool Cartridge app hosts: all become: true become_user: root tasks: - name: Import Tarantool Cartridge role import_role: name: tarantool.cartridge
Hier passiert nichts Interessantes; Starten wir die Ansible-Rolle mit dem Namen
tarantool.cartridge
.
Das Wichtigste (nämlich die Cluster-Konfiguration) befindet sich in der Inventardatei
hosts.yml
:
--- all: vars: # common cluster variables cartridge_app_name: getting-started-app cartridge_package_path: ./getting-started-app-1.0.0-0.rpm # path to package cartridge_cluster_cookie: app-default-cookie # cluster cookie # common ssh options ansible_ssh_private_key_file: ~/.vagrant.d/insecure_private_key ansible_ssh_common_args: '-o IdentitiesOnly=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' # INSTANCES hosts: storage-1: config: advertise_uri: '172.19.0.2:3301' http_port: 8181 app-1: config: advertise_uri: '172.19.0.3:3301' http_port: 8182 storage-1-replica: config: advertise_uri: '172.19.0.3:3302' http_port: 8183 children: # GROUP INSTANCES BY MACHINES host1: vars: # first machine connection options ansible_host: 172.19.0.2 ansible_user: vagrant hosts: # instances to be started on the first machine storage-1: host2: vars: # second machine connection options ansible_host: 172.19.0.3 ansible_user: vagrant hosts: # instances to be started on the second machine app-1: storage-1-replica: # GROUP INSTANCES BY REPLICA SETS replicaset_app_1: vars: # replica set configuration replicaset_alias: app-1 failover_priority: - app-1 # leader roles: - 'api' hosts: # replica set instances app-1: replicaset_storage_1: vars: # replica set configuration replicaset_alias: storage-1 weight: 3 failover_priority: - storage-1 # leader - storage-1-replica roles: - 'storage' hosts: # replica set instances storage-1: storage-1-replica:
Sie müssen lediglich lernen, wie Sie Instanzen und Replikatsätze verwalten, indem Sie diese Datei ändern. Später werden wir neue Abschnitte hinzufügen. Um beim Hinzufügen der Abschnitte Verwirrung zu vermeiden,
hosts.updated.yml
die endgültige Version dieser Datei oder
hosts.updated.yml
, die sich im Beispielrepository befindet.
Instanzen verwalten
In Ansible-Begriffen ist jede Instanz ein Host (nicht zu verwechseln mit einem physischen Server), d. H. Der Infrastrukturknoten, den Ansible verwalten wird. Für jeden Host können Verbindungsparameter (wie
ansible_host
und
ansible_user
) und die
ansible_host
ansible_user
. Die Instanzbeschreibung befindet sich im Abschnitt
hosts
.
Schauen wir uns die Konfiguration der
storage-1
Instanz an:
all: vars: ... # INSTANCES hosts: storage-1: config: advertise_uri: '172.19.0.2:3301' http_port: 8181 ...
In der
config
haben wir die Instanzparameter angegeben:
advertise URI
und
HTTP port
.
Unten sind die Parameter der Instanzen von
app-1
und
storage-1-replica
.
Wir sollten Ansible für jede Instanz Verbindungsparameter zur Verfügung stellen. Es erscheint sinnvoll, die Instanzen nach virtuellen Maschinen zu gruppieren. Zu diesem Zweck werden die Instanzen unter
host1
und
host2
, und jede Gruppe im Abschnitt
vars
enthält die Parameterwerte
ansible_host
und
ansible_user
für eine einzelne virtuelle Maschine. Der Abschnitt
hosts
enthält Hosts (oder Instanzen), die zu dieser Gruppe gehören:
all: vars: ... hosts: ... children: # GROUP INSTANCES BY MACHINES host1: vars: # first machine connection options ansible_host: 172.19.0.2 ansible_user: vagrant hosts: # instances to be started on the first machine storage-1: host2: vars: # second machine connection options ansible_host: 172.19.0.3 ansible_user: vagrant hosts: # instances to be started on the second machine app-1: storage-1-replica:
Beginnen wir mit der Bearbeitung von
hosts.yml
. Jetzt fügen wir zwei weitere Instanzen hinzu:
storage-2-replica
auf der ersten virtuellen Maschine und
storage-2
auf der zweiten:
all: vars: ... # INSTANCES hosts: ... storage-2: # <== config: advertise_uri: '172.19.0.3:3303' http_port: 8184 storage-2-replica: # <== config: advertise_uri: '172.19.0.2:3302' http_port: 8185 children: # GROUP INSTANCES BY MACHINES host1: vars: ... hosts: # instances to be started on the first machine storage-1: storage-2-replica: # <== host2: vars: ... hosts: # instances to be started on the second machine app-1: storage-1-replica: storage-2: # <== ...
Starten Sie das Ansible-Playbook:
$ ansible-playbook -i hosts.yml \ --limit storage-2,storage-2-replica \ playbook.yml
Beachten Sie die Option
--limit
. Da jede Cluster-Instanz in Bezug auf Ansible ein Host ist, können wir explizit angeben, welche Instanzen beim Ausführen des Playbooks konfiguriert werden sollen.
Also kehren wir zur Web-Benutzeroberfläche unter
http: // localhost: 8181 / admin / cluster / dashboard zurück und sehen uns unsere neuen Instanzen an:
Lassen Sie uns als Nächstes das Topologie-Management beherrschen.
Topologie verwalten
Gruppieren Sie unsere neuen Instanzen in der Replikatgruppe "
storage-2
, fügen Sie eine neue Gruppe "
replicaset_storage_2
und beschreiben Sie die Replikatgruppenparameter in den Variablen wie bei "
replicaset_storage_1
. Im Abschnitt
hosts
legen wir fest, welche Instanzen in dieser Gruppe enthalten sein sollen (dh unser Replikatsatz):
--- all: vars: ... hosts: ... children: ... # GROUP INSTANCES BY REPLICA SETS ... replicaset_storage_2: # <== vars: # replicaset configuration replicaset_alias: storage-2 weight: 2 failover_priority: - storage-2 - storage-2-replica roles: - 'storage' hosts: # replicaset instances storage-2: storage-2-replica:
Dann führen wir das Playbook erneut aus:
$ ansible-playbook -i hosts.yml \ --limit replicaset_storage_2 \ --tags cartridge-replicasets \ playbook.yml
Dieses Mal übergeben wir den Namen der Gruppe, die unserem Replikatsatz im Parameter
--limit
.
Sehen wir uns die Option
tags
.
Unsere Rolle führt nacheinander verschiedene Aufgaben aus, die mit den folgenden Tags gekennzeichnet sind:
cartridge-instances
: Instanzverwaltung (Konfiguration, Mitgliedschaft);cartridge-replicasets
: Topologie-Management (Replikat-Set-Management und permanente Entfernung (Vertreibung) von Instanzen aus dem Cluster);cartridge-config
: Steuerung anderer Cluster-Parameter (vshard-Bootstrapping, automatisches Failover, Autorisierungsparameter und Anwendungskonfiguration).
Wir können explizit angeben, welcher Teil der Arbeit erledigt werden soll - und die Rolle überspringt den Rest der Aufgaben. In diesem Fall möchten wir nur mit der Topologie arbeiten und geben daher
cartridge-replicasets
.
Lassen Sie uns das Ergebnis unserer Bemühungen bewerten. Suchen Sie den neuen Replikatsatz unter
http: // localhost: 8181 / admin / cluster / dashboard .
Ja
Versuchen Sie, die Konfiguration der Instanzen und Replikatsätze zu ändern, und überprüfen Sie, wie sich die Topologie des Clusters ändert. Sie können verschiedene Anwendungsfälle ausprobieren, z. B.
memtx_memory
Aktualisierung oder
memtx_memory
Erhöhung. Die Rolle würde versuchen, dies zu tun, ohne die Instanz neu zu starten, um die mögliche Ausfallzeit Ihrer Anwendung zu verringern.
Vergessen Sie nicht,
vagrant halt
anzuhalten, um die virtuellen Maschinen anzuhalten, wenn Sie mit ihnen fertig sind.
Was ist drin
Hier erzähle ich Ihnen mehr darüber, was unter der Haube der Ansible-Rolle während unserer Tests passiert ist.
Betrachten wir die Schritte zum Bereitstellen einer Cartridge-Anwendung.
Paket installieren und Instanzen starten
Das erste, was Sie tun müssen, ist, das Paket an den Server zu liefern und es zu installieren. Jetzt kann die Rolle mit RPM-Paketen und DEB-Paketen arbeiten.
Als nächstes starten wir die Instanzen. Es ist sehr einfach: Jede Instanz ist ein separater
systemd
Dienst. Zum Beispiel:
$ systemctl start myapp@storage-1
Dieser Befehl startet die
storage-1
Instanz von
myapp
anwendung. Die ausgeführte Instanz sucht nach ihrer
Konfiguration in
/etc/tarantool/conf.d/
. Sie können die
journald
mit
journald
.
Die Unit-Datei
/etc/systemd/systemd/myapp@.sevice
für den systemd-Dienst wird mit dem Paket geliefert.
Ansible verfügt über integrierte Module für die Installation von Paketen und die Verwaltung von Systemd-Diensten. Daher haben wir hier nichts Neues erfunden.
Cluster-Topologie konfigurieren
Hier passieren die aufregendsten Dinge. Ich bin sicher, Sie stimmen zu, dass es seltsam ist, sich mit einer speziellen Ansible-Rolle für die Installation von Paketen und die Ausführung von
systemd
Diensten zu beschäftigen.
Sie können den Cluster manuell konfigurieren:
- Die erste Möglichkeit besteht darin, die Web-Benutzeroberfläche zu öffnen und auf die Schaltflächen zu klicken. Es eignet sich sehr gut für den einmaligen Start mehrerer Instanzen.
- Die zweite Option ist die Verwendung der GraphQL-API. Hier kann man schon etwas automatisieren, zum Beispiel ein Skript in Python schreiben.
- Die dritte Option ist für Mutige: Gehen Sie zum Server, stellen Sie mit Hilfe von
tarantoolctl connect
eine Verbindung zu einer der Instanzen tarantoolctl connect
und führen Sie alle erforderlichen Aktionen mit dem cartridge
Lua-Modul aus.
Die Hauptaufgabe unserer Erfindung ist es, diesen schwierigsten Teil der Arbeit für Sie zu erledigen.
Mit Ansible können Sie Ihr eigenes Modul schreiben und es in Ihrer Rolle verwenden. Unsere Rolle verwendet diese Module, um die verschiedenen Clusterkomponenten zu verwalten.
Wie funktioniert es Sie beschreiben den gewünschten Status des Clusters in einer deklarativen Konfiguration, und die Rolle gibt jedem Modul einen eigenen Konfigurationsabschnitt als Eingabe. Das Modul empfängt den aktuellen Status des Clusters und vergleicht ihn mit dem Eingang. Anschließend wird der Code für den erforderlichen Clusterstatus über den Socket einer der Instanzen gestartet.
Ergebnisse
Heute haben wir Ihnen gezeigt, wie Sie Ihre Tarantool Cartridge-Anwendung bereitstellen und eine einfache Topologie konfigurieren. Dazu haben wir Ansible verwendet, ein leistungsstarkes Tool, das einfach zu verwenden ist und es Ihnen ermöglicht, mehrere Infrastrukturknoten gleichzeitig zu konfigurieren (in unserem Fall die Clusterinstanzen).
Oben haben wir eine der vielen Möglichkeiten durchgespielt, die Cluster-Konfiguration mit Ansible zu beschreiben. Wenn Sie sich für mehr bereit fühlen, lernen Sie die
besten Methoden zum Schreiben von Spielbüchern. Möglicherweise ist es einfacher, die Topologie mit
group_vars
und
host_vars
.
In Kürze erfahren Sie, wie Sie Instanzen dauerhaft aus der Topologie entfernen (entfernen), vshard booten, das automatische Failover verwalten, die Autorisierung konfigurieren und die Cluster-Konfiguration patchen. In der Zwischenzeit können Sie die
Dokumentation selbst überprüfen und versuchen, die Clustereinstellungen zu ändern.
Wenn etwas schief geht, teilen
Sie uns das Problem unbedingt mit. Wir werden unser Bestes tun, um jedes Problem zu lösen!