Wir haben bereits darüber gesprochen
Interessant? Dann frage ich unter dem Schnitt, wir werden alles erzählen und zeigen.
Beginnen wir mit einem Beispiel
Wir werden nur einen Teil der Funktionalität unserer Rolle abdecken. Eine vollständige Beschreibung aller Funktionen und Eingabeparameter finden Sie immer in
Tarantool-Patrone hat api
и storage
die Instanzen zugeordnet werden können.
Die Patrone selbst sagt nichts darüber aus, wie Prozesse gestartet werden, sie bietet lediglich die Möglichkeit, bereits laufende Instanzen zu konfigurieren. Den Rest muss der Benutzer selbst erledigen: die Konfigurationsdateien zerlegen, die Dienste starten und die Topologie einrichten. Aber wir werden das alles nicht tun, Ansible wird es für uns tun.
Von Worten zu Taten
Stellen wir also unsere Anwendung auf zwei virtuellen Maschinen bereit und richten wir eine einfache Topologie ein:
- Replikatsatz
app-1
wird die Rolle spielenapi
was die Rolle beinhaltetvshard-router
. Hier wird es nur eine Instanz geben. - Replikatsatz
storage-1
implementiert die Rollestorage
(und gleichzeitigvshard-storage
), hier fügen wir zwei Instanzen von verschiedenen Maschinen hinzu.
Um das Beispiel auszuführen, benötigen wir
Die Rolle selbst ist
Klonen Sie das Repository anhand eines Beispiels:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Wir erstellen virtuelle Maschinen:
$ vagrant up
Installieren Sie die ansible Rolle „Tarantool Cartridge“:
$ 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 das Ende der Ausführung des Playbooks, gehen Sie zu
Sie können Daten gießen. Cool, oder?
Lassen Sie uns nun herausfinden, wie wir damit arbeiten und gleichzeitig einen weiteren Replikatsatz zur Topologie hinzufügen.
Wir beginnen zu verstehen
Also was ist passiert?
Wir haben zwei VMs eingerichtet und ein Ansible-Playbook ausgeführt, das unseren Cluster eingerichtet hat. Schauen wir uns den Inhalt der Datei an 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 die Ansible-Rolle, die aufgerufen wird tarantool.cartridge
.
Das Wichtigste (nämlich die Cluster-Konfiguration) befindet sich in 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:
Wir müssen lediglich lernen, wie man Instanzen und Replikatsätze verwaltet, indem man den Inhalt dieser Datei ändert. Als nächstes werden wir neue Abschnitte hinzufügen. Um nicht verwirrt zu sein, wo Sie sie hinzufügen sollen, können Sie einen Blick in die endgültige Version dieser Datei werfen. hosts.updated.yml
, das sich im Beispiel-Repository befindet.
Instanzverwaltung
In Bezug auf Ansible ist jede Instanz ein Host (nicht zu verwechseln mit einem Iron-Server), d. h. der Infrastrukturknoten, den Ansible verwalten wird. Für jeden Host können wir Verbindungsparameter angeben (z. B ansible_host
и ansible_user
) sowie die Instanzkonfiguration. Die Beschreibung der Instanzen finden Sie im Abschnitt hosts
.
Berücksichtigen Sie die Instanzkonfiguration storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
In einer Variablen config
wir haben die Instanzparameter angegeben - advertise URI
и HTTP port
.
Nachfolgend finden Sie die Instanzparameter app-1
и storage-1-replica
.
Wir müssen Ansible die Verbindungsparameter für jede Instanz mitteilen. Es erscheint logisch, Instanzen in Gruppen virtueller Maschinen zu gruppieren. Dazu werden Instanzen zu Gruppen zusammengefasst. host1
и host2
, und in jeder Gruppe im Abschnitt vars
Werte ansible_host
и ansible_user
für eine virtuelle Maschine. Und in der Rubrik hosts
- Hosts (das sind Instanzen), die in dieser Gruppe enthalten sind:
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 beginnen uns zu verändern hosts.yml
. Fügen wir zwei weitere Instanzen hinzu: storage-2-replica
auf der ersten virtuellen Maschine und storage-2
Auf dem 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: # <==
...
Ansible-Playbook ausführen:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Achten Sie auf die Option --limit
. Da jede Cluster-Instanz im Sinne von Ansible ein Host ist, können wir beim Ausführen des Playbooks explizit angeben, welche Instanzen konfiguriert werden sollen.
Zurück zur Web-Benutzeroberfläche
Wir werden uns nicht auf unseren Lorbeeren ausruhen und die Topologiekontrolle meistern.
Topologiemanagement
Lassen Sie uns unsere neuen Instanzen zu einem Replikatsatz zusammenführen storage-2
. Fügen Sie eine neue Gruppe hinzu replicaset_storage_2
und beschreiben in seinen Variablen die Parameter des Replikatsatzes analog zu replicaset_storage_1
. Im Abschnitt hosts
Geben Sie an, welche Instanzen in diese Gruppe (d. h. unseren Replikatsatz) aufgenommen werden:
---
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:
Beginnen wir noch einmal mit dem Playbook:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
Pro Option --limit
Diesmal haben wir den Namen der Gruppe übergeben, die unserem Replikatsatz entspricht.
Erwägen Sie die Option tags
.
Unsere Rolle führt nacheinander verschiedene Aufgaben aus, die mit den folgenden Tags gekennzeichnet sind:
cartridge-instances
: Instanzverwaltung (Konfiguration, Verbindung zur Mitgliedschaft);cartridge-replicasets
: Topologieverwaltung (Replicaset-Verwaltung und dauerhafte Entfernung (Ausschluss) von Instanzen aus dem Cluster);cartridge-config
: Verwalten Sie andere 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 den Rest der Aufgaben. In unserem Fall wollen wir nur mit der Topologie arbeiten, also haben wir angegeben cartridge-replicasets
.
Lassen Sie uns das Ergebnis unserer Bemühungen bewerten. Suche nach einem neuen Replikatsatz
Hooray!
Experimentieren Sie mit der Neukonfiguration von Instanzen und Replikatsätzen und sehen Sie, wie sich die Clustertopologie ändert. Sie können verschiedene Einsatzszenarien ausprobieren, z.B. memtx_memory
. Die Rolle wird versuchen, dies zu tun, ohne die Instanz neu zu starten, um die mögliche Ausfallzeit Ihrer Anwendung zu reduzieren.
Vergiss das Laufen nicht vagrant halt
um VMs zu stoppen, wenn Sie mit ihnen fertig sind.
Und was steckt unter der Haube?
Hier werde ich mehr darüber sprechen, was während unserer Experimente unter der Haube der Ansible-Rolle passiert ist.
Sehen wir uns Schritt für Schritt die Bereitstellung einer Patronenanwendung an.
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.
Als nächstes starten wir die Instanzen. Hier ist alles ganz einfach: Jede Instanz ist eine eigene systemd
-Service. Ich spreche von einem Beispiel:
$ systemctl start myapp@storage-1
Dieser Befehl startet die Instanz storage-1
приложения myapp
. Die gestartete Instanz wird danach suchen /etc/tarantool/conf.d/
. Instanzprotokolle können mit angezeigt werden journald
.
Unit-Datei /etc/systemd/system/[email protected]
für einen systemd-Dienst wird mit dem Paket geliefert.
Ansible verfügt über integrierte Module zum Installieren von Paketen und zum Verwalten von Systemdiensten. Wir haben hier nichts Neues erfunden.
Konfigurieren der Cluster-Topologie
Und hier beginnt das Interessanteste. Stimmen Sie zu, es wäre seltsam, sich mit einer speziellen Ansible-Rolle zum Installieren und Ausführen von Paketen herumzuschlagen systemd
-Dienstleistungen.
Sie können den Cluster manuell einrichten:
- Die erste Möglichkeit: Öffnen Sie die Web-Benutzeroberfläche und klicken Sie auf die Schaltflächen. Für den einmaligen Start mehrerer Instanzen ist es durchaus geeignet.
- Zweite Option: Sie können die GraphQl-API verwenden. Hier können Sie bereits etwas automatisieren, beispielsweise ein Skript in Python schreiben.
- Die dritte Option (für die Starken im Geiste): Gehen Sie zum Server und stellen Sie eine Verbindung zu einer der Instanzen her
tarantoolctl connect
und führen Sie alle notwendigen Manipulationen mit dem Lua-Modul durchcartridge
.
Die Hauptaufgabe unserer Erfindung besteht darin, diesen für Sie schwierigsten Teil der Arbeit zu erledigen.
Mit Ansible können Sie Ihr eigenes Modul schreiben und es in einer Rolle verwenden. Unsere Rolle verwendet diese Module, um die verschiedenen Komponenten des Clusters zu verwalten.
Wie es funktioniert? Sie beschreiben den gewünschten Zustand des Clusters in einer deklarativen Konfiguration und die Rolle gibt jedem Modul seinen Konfigurationsabschnitt als Eingabe. Das Modul empfängt den aktuellen Zustand des Clusters und vergleicht ihn mit der Eingabe. Als nächstes wird ein Code über den Socket einer der Instanzen ausgeführt, der den Cluster in den gewünschten Zustand bringt.
Ergebnisse
Heute haben wir erklärt 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 bedienen ist und es Ihnen ermöglicht, viele Infrastrukturknoten (in unserem Fall sind dies Cluster-Instanzen) gleichzeitig zu konfigurieren.
Oben haben wir uns mit einer der vielen Möglichkeiten befasst, die Clusterkonfiguration mithilfe von Ansible zu beschreiben. Sobald Sie wissen, dass Sie bereit sind, weiterzumachen, lernen Sie group_vars
и host_vars
.
In Kürze erfahren Sie, wie Sie Instanzen dauerhaft aus der Topologie entfernen (ausschließen), vshard booten, den automatischen Failover-Modus verwalten, die Autorisierung konfigurieren und die Cluster-Konfiguration patchen. In der Zwischenzeit können Sie selbstständig lernen
Wenn etwas nicht funktioniert, seien Sie sicher
Source: habr.com