Einfache und natürliche Bereitstellung von Anwendungen auf Tarantool-Cartridge (Teil 1)

Einfache und natürliche Bereitstellung von Anwendungen auf Tarantool-Cartridge (Teil 1)

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

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 Dokumentation. Aber es ist besser, es einmal zu versuchen, als es hundertmal zu sehen. Lassen Sie uns also eine kleine Anwendung bereitstellen.

Tarantool-Patrone hat Lernprogramm eine kleine Cartridge-Anwendung zu erstellen, die Informationen über Bankkunden und deren Konten speichert und außerdem eine API für die Datenverwaltung über HTTP bereitstellt. Dazu beschreibt die Anwendung zwei mögliche Rollen: api и storagedie 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 spielen apiwas die Rolle beinhaltet vshard-router. Hier wird es nur eine Instanz geben.
  • Replikatsatz storage-1 implementiert die Rolle storage (und gleichzeitig vshard-storage), hier fügen wir zwei Instanzen von verschiedenen Maschinen hinzu.

Einfache und natürliche Bereitstellung von Anwendungen auf Tarantool-Cartridge (Teil 1)

Um das Beispiel auszuführen, benötigen wir Landstreicher и Ansible (Version 2.8 oder höher).

Die Rolle selbst ist Ansible Galaxie. Dies ist ein Repository, das es Ihnen ermöglicht, Ihre Arbeit zu teilen und vorgefertigte Rollen zu verwenden.

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 http://localhost:8181/admin/cluster/dashboard und genießen Sie das Ergebnis:

Einfache und natürliche Bereitstellung von Anwendungen auf Tarantool-Cartridge (Teil 1)

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 Inventar-Datei 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 http://localhost:8181/admin/cluster/dashboard und beobachten Sie unsere neuen Instanzen:

Einfache und natürliche Bereitstellung von Anwendungen auf Tarantool-Cartridge (Teil 1)

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 http://localhost:8181/admin/cluster/dashboard.

Einfache und natürliche Bereitstellung von Anwendungen auf Tarantool-Cartridge (Teil 1)

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. rollierendes Update oder erhöhen 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 haltum 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 Aufbau в /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 durch cartridge.

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 Best Practices zum Schreiben von Spielbüchern. Möglicherweise ist es für Sie bequemer, die Topologie damit zu verwalten 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 Dokumentation und experimentieren Sie mit der Änderung der Clusterparameter.

Wenn etwas nicht funktioniert, seien Sie sicher informieren uns über das Problem. Wir werden es schnell aufschlüsseln!

Source: habr.com

Kommentar hinzufügen