Einfach an natierlech Uwendungen op Tarantool Cartridge ofsetzen (Deel 1)

Einfach an natierlech Uwendungen op Tarantool Cartridge ofsetzen (Deel 1)

Mir hu scho geschwat Tarantool Cartouche, wat Iech erlaabt verdeelt Uwendungen z'entwéckelen an ze packen. Alles wat iwwreg bleift ass ze léieren wéi een dës Uwendungen ofsetzt an se verwalten. Maacht Iech keng Suergen, mir hunn alles ofgedeckt! Mir hunn all déi bescht Praktiken zesummegesat fir mat Tarantool Cartridge ze schaffen a geschriwwen ansible-Roll, deen de Package op Serveren verdeelt, Instanzen lancéiert, se an e Cluster vereenegt, Autorisatioun konfiguréieren, bootstrap vshard, automatesch Failover aktivéieren an d'Clusterkonfiguratioun patchen.

Interessant? Da w.e.g., ënner dem Schnëtt, wäerte mir Iech soen a weisen Iech alles.

Fänke mer mat engem Beispill un

Mir kucken nëmmen en Deel vun der Funktionalitéit vun eiser Roll. Dir kënnt ëmmer eng komplett Beschreiwung vun all seng Fäegkeeten an Input Parameteren fannen an Dokumentatioun. Awer et ass besser eemol ze probéieren wéi et honnertmol ze gesinn, also loosst eis eng kleng Applikatioun ofsetzen.

Tarantool Cartouche huet Tutorial eng kleng Cartouche Applikatioun ze kreéieren déi Informatioun iwwer Bankclienten an hir Konten späichert, an och eng API fir Datemanagement iwwer HTTP ubitt. Fir dëst z'erreechen, beschreift den Appendix zwou méiglech Rollen: api и storage, déi op Instanzen zougewisen ka ginn.

Cartouche selwer seet näischt iwwer wéi d'Prozesser starten, et bitt nëmmen d'Fäegkeet fir scho lafend Instanzen ze konfiguréieren. De Benotzer muss de Rescht selwer maachen: Konfiguratiounsdateien arrangéieren, Servicer starten an d'Topologie konfiguréieren. Awer mir wäerten dëst net alles maachen; Ansible wäert et fir eis maachen.

Vu Wierder zu Doten

Also, loosst eis eis Applikatioun op zwou virtuell Maschinnen ofsetzen an eng einfach Topologie opstellen:

  • Replicaset app-1 wäert d'Roll ëmsetzen api, déi d'Roll enthält vshard-router. Et gëtt nëmmen eng Instanz hei.
  • Replicaset storage-1 implementéiert d'Roll storage (a gläichzäiteg vshard-storage), hei wäerte mir zwee Instanzen vu verschiddene Maschinnen derbäi.

Einfach an natierlech Uwendungen op Tarantool Cartridge ofsetzen (Deel 1)

Fir d'Beispill ze lafen, brauche mir Vagrant и Sicht (Versioun 2.8 oder méi al).

D'Roll selwer ass an Ansible Galaxy. Dëst ass e Repository deen Iech erlaabt Är Aarbecht ze deelen a fäerdeg Rollen ze benotzen.

Loosst eis de Repository mat engem Beispill klone:

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

Mir erhéijen virtuell Maschinnen:

$ vagrant up

Installéiert d'Tarantool Cartridge ansible Roll:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Start déi installéiert Roll:

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

Mir waarden op d'Spillbuch fir d'Ausféierung fäerdeg ze maachen, gitt op http://localhost:8181/admin/cluster/dashboard a genéisst d'Resultat:

Einfach an natierlech Uwendungen op Tarantool Cartridge ofsetzen (Deel 1)

Dir kënnt Daten eropluede. Cool, richteg?

Loosst eis elo erausfannen, wéi mir mat dësem schaffen, a gläichzäiteg eng aner Replika-Set an d'Topologie addéieren.

Loosst eis ufänken et erauszefannen

Also wat ass geschitt?

Mir hunn zwee virtuell Maschinnen opgeriicht an en ansiblet Spillbuch lancéiert dat eise Cluster konfiguréiert huet. Loosst eis den Inhalt vun der Datei kucken 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

Näischt Interessantes geschitt hei, loosst eis eng ansible Roll lancéieren genannt tarantool.cartridge.

All déi wichtegst Saachen (nämlech d'Clusterkonfiguratioun) sinn an Stamminventar- 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:

Alles wat mir brauchen ass ze léieren wéi Dir Instanzen a Replikasets verwalten andeems Dir den Inhalt vun dëser Datei ännert. Als nächst wäerte mir nei Sektiounen derbäi addéieren. Fir net duercherneen ze ginn, wou se derbäigesat ginn, kënnt Dir déi lescht Versioun vun dëser Datei kucken, hosts.updated.yml, déi am Beispill Repository ass.

Instanz Gestioun

An Ansible Begrëffer ass all Instanz e Host (net mat engem Hardware Server ze verwiesselen), d.h. den Infrastrukturnode deen Ansible wäert verwalten. Fir all Host kënne mir Verbindungsparameter spezifizéieren (z ansible_host и ansible_user), souwéi d'Instanzkonfiguratioun. Beschreiwung vun Instanzen ass an der Rubrik hosts.

Loosst eis d'Instanzkonfiguratioun kucken storage-1:

all:
  vars:
    ...

  # INSTANCES
  hosts:
    storage-1:
      config:
        advertise_uri: '172.19.0.2:3301'
        http_port: 8181

  ...

An variabelen config mir hunn d'Instanzparameter uginn - advertise URI и HTTP port.
Drënner sinn d'Instanzparameter app-1 и storage-1-replica.

Mir mussen Ansible d'Verbindungsparameter fir all Instanz soen. Et schéngt logesch Instanzen an virtuell Maschinn Gruppen ze gruppéieren. Fir dësen Zweck ginn Instanzen a Gruppen kombinéiert host1 и host2, an an all Grupp an der Rubrik vars Wäerter ginn uginn ansible_host и ansible_user fir eng virtuell Maschinn. An an der Rubrik hosts - Hosten (alias Instanzen) déi an dëser Grupp abegraff sinn:

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:

Mir fänken un ze änneren hosts.yml. Loosst eis zwee méi Instanzen derbäi, storage-2-replica op déi éischt virtuell Maschinn an storage-2 Op der zweeter:

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:  # <==
  ...

Lancéiere vum ansible Playbook:

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

Notéiert w.e.g. d'Optioun --limit. Well all Cluster Instanz en Host an Ansible Begrëffer ass, kënne mir explizit spezifizéieren wéi eng Instanzen konfiguréiert solle ginn wann Dir de Playbook ausféiert.

Zréck op de Web UI http://localhost:8181/admin/cluster/dashboard a kuckt eis nei Instanzen:

Einfach an natierlech Uwendungen op Tarantool Cartridge ofsetzen (Deel 1)

Loosst eis net do ophalen a beherrschen Topologiemanagement.

Topologie Gestioun

Loosst eis eis nei Instanzen an e Replicaset kombinéieren storage-2. Loosst eis en neie Grupp derbäisetzen replicaset_storage_2 a beschreiwen d'Replikasetparameter a senge Variabelen duerch Analogie mat replicaset_storage_1. An der Rubrik hosts Loosst eis uginn wéi eng Instanzen an dëser Grupp abegraff sinn (dat ass eise Replika-Set):

---
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:

Loosst eis d'Spillbuch erëm ufänken:

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

Am Parameter --limit Dës Kéier hu mir den Numm vun der Grupp iwwerginn, déi zu eisem Replikaset entsprécht.

Loosst eis d'Optioun betruechten tags.

Eis Roll mécht sequentiell verschidden Aufgaben aus, déi mat de folgenden Tags markéiert sinn:

  • cartridge-instances: Instanzmanagement (Konfiguratioun, Verbindung mat Memberschaft);
  • cartridge-replicasets: Topologiemanagement (Replicaset Management a permanent Entfernung (ausdreiwen) vun Instanzen aus dem Cluster);
  • cartridge-config: Gestioun vun anere Stärekoup Parameteren (vshard bootstrapping, automatesch failover Modus, Autorisatioun Parameteren an Applikatioun Configuratioun).

Mir kënnen explizit spezifizéieren wéi en Deel vun der Aarbecht mir maache wëllen, da wäert d'Roll de Rescht vun den Aufgaben iwwersprangen. An eisem Fall wëlle mir nëmme mat der Topologie schaffen, also hu mir spezifizéiert cartridge-replicasets.

Loosst eis d'Resultat vun eisen Efforten evaluéieren. Mir fannen en neie Replicaset op http://localhost:8181/admin/cluster/dashboard.

Einfach an natierlech Uwendungen op Tarantool Cartridge ofsetzen (Deel 1)

Hurra!

Experimentéiert mat der Ännerung vun der Konfiguratioun vun Instanzen a Replikasets a kuckt wéi d'Clustertopologie ännert. Dir kënnt verschidden Operatiounsszenarien ausprobéieren, z.B. Rolling Update oder Erhéijung memtx_memory. D'Roll probéiert dëst ze maachen ouni d'Instanz nei unzefänken fir déi méiglech Ausbroch vun Ärer Applikatioun ze reduzéieren.

Vergiesst net ze lafen vagrant haltfir déi virtuell Maschinnen ze stoppen wann Dir fäerdeg sidd mat hinnen ze schaffen.

A wat ass ënner der Hood?

Hei wäert ech Iech méi soen iwwer wat geschitt ënnert der Hood vun der ansible Roll während eisen Experimenter.

Loosst eis kucken wéi d'Cartridge-Applikatioun Schrëtt fir Schrëtt z'installéieren.

De Package installéieren an Instanzen starten

Als éischt musst Dir de Package op de Server liwweren an installéieren. De Moment kann d'Roll mat RPM an DEB Packagen schaffen.

Als nächst lancéiere mir d'Instanzen. Alles ass ganz einfach hei: all Instanz ass eng separat systemd-Service. Ech ginn Iech e Beispill:

$ systemctl start myapp@storage-1

Dëse Kommando lancéiert d'Instanz storage-1 Apps myapp. Déi lancéiert Instanz wäert no sengem sichen Configuratioun в /etc/tarantool/conf.d/. Instanz Logbicher kënne gekuckt ginn mat journald.

Eenheet Fichier /etc/systemd/system/[email protected] fir systemd Service gëtt zesumme mam Package geliwwert.

Ansible huet agebaute Moduler fir Packagen z'installéieren an systemd Servicer ze managen; mir hunn näischt Neies hei erfonnt.

Opstellung vun enger Clustertopologie

Dëst ass wou de Spaass fänkt. Averstanen, et wier komesch mat enger spezieller Ansible Roll ze stéieren fir Packagen z'installéieren an ze lafen systemd-Servicer.

Dir kënnt de Cluster manuell konfiguréieren:

  • Éischt Optioun: öffnen de Web UI a klickt op d'Knäppercher. Et ass ganz gëeegent fir eng eemoleg Start vu verschiddenen Instanzen.
  • Zweet Optioun: Dir kënnt d'GraphQl API benotzen. Hei kënnt Dir schonn eppes automatiséieren, zum Beispill e Skript am Python schreiwen.
  • Drëtt Optioun (fir déi staark Wëllen): gitt op de Server, verbënnt mat enger vun den Instanzen benotzt tarantoolctl connect a maacht all déi néideg Manipulatioune mam Lua Modul cartridge.

D'Haaptaufgab vun eiser Erfindung ass genee dëst ze maachen, dee schwéiersten Deel vun der Aarbecht fir Iech.

Ansible erlaabt Iech Ären eegene Modul ze schreiwen an et an enger Roll ze benotzen. Eis Roll benotzt esou Moduler fir verschidde Clusterkomponenten ze managen.

Wéi funktionéiert et? Dir beschreift de gewënschten Zoustand vum Stärekoup an enger deklarativer Konfiguratioun, an d'Roll gëtt all Modul mat senger Konfiguratiounssektioun als Input. De Modul kritt den aktuellen Zoustand vum Stärekoup a vergläicht et mat deem wat als Input kritt gouf. Als nächst gëtt e Code duerch de Socket vun engem vun den Instanzen lancéiert, wat de Cluster an de gewënschten Zoustand bréngt.

Resultater

Haut hu mir gesot a gewisen wéi Dir Är Applikatioun op Tarantool Cartridge ofsetzt an eng einfach Topologie opstellt. Fir dëst ze maachen, hu mir Ansible benotzt - e mächtegt Tool dat einfach ass ze benotzen an erlaabt Iech gläichzäiteg vill Infrastrukturknoten ze konfiguréieren (an eisem Fall, Cluster Instanzen).

Uewen hu mir eng vun de ville Weeër gekuckt fir eng Clusterkonfiguratioun mat Ansible ze beschreiwen. Wann Dir Iech prett fillt fir weiderzekommen, entdeckt best practice op Schreiwen Spillbicher. Dir kënnt et méi einfach fannen Är Topologie ze verwalten mat group_vars и host_vars.

Ganz geschwënn wäerte mir Iech soen wéi Dir Instanzen aus der Topologie permanent läschen (ausdreiwen), Bootstrap vshard, den automateschen Failover-Modus verwalten, d'Autorisatioun konfiguréieren an d'Clusterkonfiguratioun patchen. An der Tëschenzäit kënnt Dir eleng studéieren Dokumentatioun an experimentéiert mat der Verännerung vun de Clusterparameter.

Wann eppes net funktionnéiert, gitt sécher informéieren eis iwwert de Problem. Mir sortéieren alles séier!

Source: will.com

Setzt e Commentaire