Tarantool Cartridge-Anwendungen ohne Aufwand bereitstellen (Teil 1)



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!

Source: https://habr.com/ru/post/de480468/


All Articles