Einfache und übersichtliche Bereitstellung von Anwendungen auf Tarantool Cartridge (Teil 1)


Wir haben bereits über Tarantool Cartridge gesprochen , mit dem Sie verteilte Anwendungen entwickeln und verpacken können. Sie müssen nur noch lernen, wie Sie diese Anwendungen bereitstellen und verwalten. Keine Sorge, wir haben für alles gesorgt! Wir haben alle Best Practices für die Arbeit mit Tarantool Cartridge zusammengestellt und eine anonyme Rolle geschrieben , in der das Paket in Server zerlegt, die Instanzen gestartet, zu einem Cluster zusammengefasst, die Autorisierung konfiguriert, vshard gestartet, das automatische Failover aktiviert und die Cluster-Konfiguration gepatcht werden.


Interessant? Dann bitte ich um einen Schnitt, wir werden alles erzählen und zeigen.


Beginnen wir mit einem Beispiel.


Wir werden nur einen Teil der Funktionalität unserer Rolle betrachten. 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. Installieren wir also eine kleine Anwendung.


Tarantool Cartridge enthält 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 zum Verwalten von Daten über HTTP. Zu diesem Zweck beschreibt die Anwendung zwei mögliche Rollen: api und storage , die Instanzen zugewiesen werden können.


Cartridge selbst sagt nichts darüber aus, wie Prozesse gestartet werden, sondern bietet nur die Möglichkeit, bereits laufende Instanzen zu konfigurieren. Der Benutzer muss den Rest erledigen: die Konfigurationsdateien zerlegen, die Dienste starten und die Topologie konfigurieren. Aber wir werden das alles nicht tun, Ansible wird es für uns tun.


Bitte beachten Sie, dass, wenn Sie Ihre Anwendung unter OS X entwickeln, das Packen auf einen lokalen Computer und das Nicht-Installieren auf Centos oder Debian nicht funktionieren, da das Paket Rocks-Module und ausführbare Dateien enthält, die für OS X spezifisch sind. In diesem Fall müssen Sie Packen Sie auf dem Zielsystem.


Von Worten zu Taten


Installieren wir also unsere Anwendung auf zwei virtuellen Maschinen und richten eine einfache Topologie ein:


  • Die Replikat- app-1 implementiert die api Rolle, die die vshard-router Rolle enthält. Es wird nur eine Instanz geben.
  • Das storage-1 Replikatset implementiert die storage (und gleichzeitig vshard-storage ). Hier fügen wir zwei Instanzen von verschiedenen Computern hinzu.


Zum Ausführen des Beispiels benötigen wir Vagrant und Ansible (Version 2.8 oder höher).


Die Rolle selbst ist in Ansible Galaxy . In diesem Repository können Sie Ihre Best Practices austauschen und vorgefertigte Rollen verwenden.


Wir klonen das Repository mit einem Beispiel:


 $ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git $ cd deploy-tarantool-cartridge-app && git checkout 1.0.0 

Virtuelle Maschinen erhöhen:


 $ vagrant up 

Installieren Sie die Rolle "Tarantool Cartridge Ansible":


 $ ansible-galaxy install tarantool.cartridge,1.0.1 

Führen Sie die installierte Rolle aus:


 $ ansible-playbook -i hosts.yml playbook.yml 

Wir warten auf die Fertigstellung des Playbooks, gehen Sie zu http: // localhost: 8181 / admin / cluster / dashboard und genießen Sie das Ergebnis:



Sie können Daten eingeben. Cool, richtig?


Lassen Sie uns nun herausfinden, wie Sie damit arbeiten, und gleichzeitig einen weiteren Replikatsatz zur Topologie hinzufügen.


Beginne zu verstehen


Also, was ist passiert?


Wir haben zwei virtuelle Maschinen ausgewählt und das ansible Playbook gestartet, mit dem unser Cluster konfiguriert wurde. Schauen wir uns den Inhalt der 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, wir starten eine anonyme 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 den Inhalt dieser Datei ändern. Außerdem werden wir neue Abschnitte hinzufügen. Um nicht zu verwechseln, wo sie hinzugefügt werden sollen, können Sie einen Blick auf die endgültige Version dieser Datei hosts.updated.yml , hosts.updated.yml , die sich mit einem Beispiel im Repository befindet.


Instanzverwaltung


In Bezug auf Ansible ist jede Instanz ein Host (nicht zu verwechseln mit einem Eisenserver), d. H. Ein Infrastrukturknoten, den Ansible verwaltet. Für jeden Host können wir Verbindungsparameter (wie ansible_host und ansible_user ) sowie die ansible_host ansible_user . Die Beschreibung der Instanzen finden Sie im Abschnitt hosts .


Betrachten Sie die Konfiguration der storage-1 Instanz:


 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 .
Nachfolgend sind die app-1 und storage-1-replica .


Wir müssen Ansible-Verbindungsparameter für jede Instanz bereitstellen. Es erscheint logisch, Instanzen in Gruppen virtueller Maschinen zu gruppieren. Zu diesem host1 Instanzen in host1 und host2 gruppiert. In jeder Gruppe im Abschnitt " vars " werden die Werte " ansible_host und " ansible_user für eine vars angegeben. Und im Abschnitt hosts gibt es Hosts (sie sind 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: 

Wir fangen an, hosts.yml zu ändern. Fügen Sie 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: # <== ... 

Führe das ansible Playbook aus:


 $ ansible-playbook -i hosts.yml \ --limit storage-2,storage-2-replica \ playbook.yml 

--limit Option --limit . Da jede Instanz des Clusters in Bezug auf Ansible ein Host ist, können wir explizit angeben, welche Instanzen beim Abspielen eines Playbooks konfiguriert werden sollen.


Rufen Sie erneut die Web-Benutzeroberfläche http: // localhost: 8181 / admin / cluster / dashboard auf und beobachten Sie unsere neuen Instanzen:



Wir werden uns nicht mit dem Erreichten befassen und das Topologie-Management beherrschen.


Topologie-Management


Kombinieren Sie unsere neuen Instanzen zu einem storage-2 Replikatsatz. Fügen Sie eine neue Gruppe replicaset_storage_2 und beschreiben Sie die replicaset-Parameter in ihren Variablen ähnlich wie replicaset_storage_1 . Im Abschnitt hosts geben wir an, 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: 

Starten Sie das Playbook erneut:


 $ ansible-playbook -i hosts.yml \ --limit replicaset_storage_2 \ --tags cartridge-replicasets \ playbook.yml 

Dieses Mal haben wir den Namen der Gruppe, die unserem Replikatsatz entspricht, an den Parameter --limit übergeben.


Betrachten Sie die tags Option.


Unsere Rolle führt konsequent verschiedene Aufgaben aus, die mit folgenden Tags gekennzeichnet sind:


  • cartridge-instances : Verwaltung von Instanzen (Setup, Verbindung zur Mitgliedschaft);
  • cartridge-replicasets : Topologieverwaltung (Verwalten von Replicasets und endgültiges Löschen (Entfernen) von Instanzen aus dem Cluster);
  • cartridge-config : Verwaltung der verbleibenden Cluster-Parameter (vshard-Bootstrapping, automatischer Failover-Modus, Autorisierungsparameter und Anwendungskonfiguration).

Wir können explizit angeben, welchen Teil der Arbeit wir erledigen möchten, dann überspringt die Rolle die Ausführung der verbleibenden Aufgaben. In unserem Fall möchten wir nur mit der Topologie arbeiten, daher haben wir cartridge-replicasets .


Lassen Sie uns das Ergebnis unserer Bemühungen bewerten. Suchen Sie den neuen Replikatsatz unter http: // localhost: 8181 / admin / cluster / dashboard .



Hurra!


Versuchen Sie, die Konfiguration von Instanzen und Replikatsätzen zu ändern, und beobachten Sie, wie sich die Clustertopologie ändert. Sie können verschiedene Betriebsszenarien ausprobieren, z. B. das memtx_memory Aktualisieren oder das Erhöhen von memtx_memory . Die Rolle versucht dies, ohne die Instanz neu zu starten, um die mögliche Ausfallzeit Ihrer Anwendung zu verringern.


Vergessen Sie nicht, vagrant halt anzuhalten, um die vagrant halt anzuhalten vagrant halt wenn Sie mit der Arbeit fertig sind.


Und was ist unter der Haube?


Hier erzähle ich Ihnen mehr darüber, was während unserer Experimente unter der Haube einer ansehnlichen Rolle passiert ist.


Betrachten Sie die Schritte zum Bereitstellen einer Cartridge-Anwendung.


Paket installieren und Instanzen starten


Zuerst müssen Sie das Paket an den Server liefern und installieren. Jetzt kann die Rolle mit RPM- und DEB-Paketen arbeiten.


Führen Sie als Nächstes die Instanzen aus. Hier ist alles sehr einfach: Jede Instanz ist ein separater systemd Dienst. Ich erzähle mit einem Beispiel:


 $ systemctl start myapp@storage-1 

Dieser Befehl startet die storage-1 Instanz von myapp . Die ausgeführte Instanz sucht nach ihrer Konfiguration in /etc/tarantool/conf.d/ . journald können mit journald angezeigt werden.


Die Unit-Datei /etc/systemd/system/myapp@.sevice für den systemd-Dienst wird mit dem Paket geliefert.


Ansible hat eingebaute Module für die Installation von Paketen und die Verwaltung von Systemdiensten, hier haben wir nichts Neues erfunden.


Konfigurieren Sie die Clustertopologie


Und hier beginnt der Spaß. Stimmen Sie zu, es wäre seltsam, sich mit einer speziellen Rolle zu beschäftigen, um Pakete zu installieren und systemd services systemd .


Sie können den Cluster manuell konfigurieren:


  • Die erste Option: Öffnen Sie die Web-Benutzeroberfläche und klicken Sie auf die Schaltflächen. Für einen einmaligen Start mehrerer Instanzen ist es durchaus geeignet.
  • Zweite Option: Sie können die GraphQl-API verwenden. Hier kann man schon etwas automatisieren, zum Beispiel ein Skript in Python schreiben.
  • Die dritte Option (für diejenigen, die einen starken Willen haben): Wir gehen zum Server, tarantoolctl connect uns mit einer der Instanzen unter Verwendung von tarantoolctl connect und führen alle notwendigen Manipulationen mit dem cartridge Lua-Modul durch.

Das Hauptziel unserer Erfindung ist es, genau dies zu tun, der schwierigste Teil der Arbeit für Sie.


Mit Ansible können Sie Ihr Modul schreiben und in einer Rolle verwenden. Unsere Rolle verwendet solche Module, um verschiedene Clusterkomponenten zu verwalten.


Wie funktioniert es Sie beschreiben den gewünschten Status des Clusters in der deklarativen Konfiguration, und die Rolle speist den Konfigurationsabschnitt in die Eingabe jedes Moduls ein. Das Modul empfängt den aktuellen Status des Clusters und vergleicht ihn mit dem Eingang. Anschließend wird über den Socket einer der Instanzen der Code gestartet, der den Cluster in den gewünschten Zustand versetzt.


Zusammenfassung


Heute haben wir darüber gesprochen und gezeigt, wie Sie Ihre Anwendung auf Tarantool Cartridge bereitstellen und eine einfache Topologie einrichten. Dazu haben wir Ansible verwendet, ein leistungsstarkes Tool, das einfach zu verwenden ist und es Ihnen ermöglicht, viele Infrastrukturknoten gleichzeitig zu konfigurieren (in unserem Fall handelt es sich um Clusterinstanzen).


Oben haben wir eine von vielen Möglichkeiten gefunden, um die Cluster-Konfiguration mit Ansible zu beschreiben. Sobald Sie feststellen, dass Sie bereit sind, fortzufahren, lernen Sie die besten Methoden zum Schreiben von Spielbüchern. Möglicherweise ist es bequemer, die Topologie mit group_vars und host_vars .


Im nächsten Teil erfahren Sie, wie Sie Instanzen dauerhaft aus der Topologie entfernen (entfernen), vshard booten, den automatischen Failover-Modus verwalten, die Autorisierung konfigurieren und die Cluster-Konfiguration patchen. Hören Sie hier nicht auf, lesen Sie die Dokumentation weiter und experimentieren Sie mit der Änderung von Cluster-Parametern.


Wenn etwas nicht funktioniert, teilen Sie uns das Problem unbedingt mit. Wir werden schnell alles zerstören!

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


All Articles