Snadné a přirozené nasazování aplikací na kazetě Tarantool (část 1)

Snadné a přirozené nasazování aplikací na kazetě Tarantool (část 1)

Už jsme o tom mluvili Tarantolová kazeta, který umožňuje vyvíjet distribuované aplikace a balit je. Nezbývá nic jiného: naučit se tyto aplikace nasazovat a spravovat. Nebojte se, mysleli jsme na všechno! Dali jsme dohromady všechny osvědčené postupy pro práci s kazetou Tarantool a napsali přípustná-role, který rozloží balíček na servery, spustí instance, zkombinuje je do clusteru, nakonfiguruje autorizaci, zavede vshard, povolí automatické převzetí služeb při selhání a opraví konfiguraci clusteru.

Zajímavý? Pak se zeptám pod střihem, vše řekneme a ukážeme.

Začněme příkladem

Pokryjeme pouze část funkčnosti naší role. Kompletní popis všech jeho vlastností a vstupních parametrů vždy najdete v dokumentace. Je ale lepší jednou vyzkoušet, než stokrát vidět, takže nasadíme malou aplikaci.

Tarantool Cartridge má tutorial vytvořit malou Cartridge aplikaci, která uchovává informace o zákaznících bank a jejich účtech a také poskytuje API pro správu dat přes HTTP. K tomu aplikace popisuje dvě možné role: api и storagekteré lze přiřadit k instancím.

Cartridge sama o sobě neříká nic o tom, jak spouštět procesy, poskytuje pouze možnost konfigurovat již běžící instance. Zbytek si musí uživatel udělat sám: rozložit konfigurační soubory, spustit služby a nastavit topologii. Ale my tohle všechno neuděláme, Ansible to udělá za nás.

Od slov k činům

Pojďme tedy nasadit naši aplikaci na dva virtuální stroje a nastavit jednoduchou topologii:

  • Replikační sada app-1 bude hrát roli apikterá zahrnuje roli vshard-router. Zde bude pouze jeden případ.
  • replikaset storage-1 implementuje roli storage (a současně vshard-storage), zde přidáme dvě instance z různých strojů.

Snadné a přirozené nasazování aplikací na kazetě Tarantool (část 1)

Abychom uvedli příklad, potřebujeme Vagrant и Možná (verze 2.8 nebo novější).

Role sama o sobě je Galaxie Ansible. Toto je úložiště, které vám umožní sdílet vaši práci a používat připravené role.

Naklonujte úložiště pomocí příkladu:

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

Zvyšujeme virtuální stroje:

$ vagrant up

Nainstalujte roli Tarantool Cartridge:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Spusťte nainstalovanou roli:

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

Čekáme na konec provádění playbooku, přejděte na http://localhost:8181/admin/cluster/dashboard a užijte si výsledek:

Snadné a přirozené nasazování aplikací na kazetě Tarantool (část 1)

Můžete nalít data. V pohodě, že?

Nyní pojďme přijít na to, jak s tím pracovat, a zároveň přidat do topologie další sadu replik.

Začínáme rozumět

Tak, co se stalo?

Zprovoznili jsme dva VM a provozovali ansible playbook, který nastavil náš cluster. Podívejme se na obsah souboru 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

Zde se nic zajímavého neděje, spustíme ansible-roli, která se nazývá tarantool.cartridge.

Všechno nejdůležitější (jmenovitě konfigurace clusteru) je umístěno v inventář-soubor 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:

Vše, co potřebujeme, je naučit se spravovat instance a replikacety změnou obsahu tohoto souboru. Dále do něj přidáme nové sekce. Abyste se nepletli, kam je přidat, můžete nahlédnout do finální verze tohoto souboru, hosts.updated.yml, který je v ukázkovém úložišti.

Správa instancí

Z hlediska Ansible je každá instance hostitelem (neplést se železným serverem), tj. uzel infrastruktury, který bude Ansible spravovat. Pro každého hostitele můžeme specifikovat parametry připojení (např ansible_host и ansible_user), stejně jako konfiguraci instance. Popis instancí je v sekci hosts.

Zvažte konfiguraci instance storage-1:

all:
  vars:
    ...

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

  ...

V proměnné config specifikovali jsme parametry instance - advertise URI и HTTP port.
Níže jsou uvedeny parametry instance app-1 и storage-1-replica.

Musíme Ansible sdělit parametry připojení pro každou instanci. Zdá se logické seskupit instance do skupin virtuálních strojů. K tomu jsou instance sloučeny do skupin. host1 и host2a v každé skupině v sekci vars hodnoty ansible_host и ansible_user pro jeden virtuální stroj. A v sekci hosts - hostitelé (jsou to instance), kteří jsou zahrnuti v této skupině:

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:

Začínáme se měnit hosts.yml. Přidejme další dva případy, storage-2-replica na prvním virtuálním počítači a storage-2 Na druhém:

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

Spustit ansible playbook:

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

Věnujte pozornost možnosti --limit. Vzhledem k tomu, že každá instance clusteru je hostitelem ve smyslu Ansible, můžeme explicitně určit, které instance by měly být nakonfigurovány při spuštění playbooku.

Zpět na webové uživatelské rozhraní http://localhost:8181/admin/cluster/dashboard a sledujte naše nové případy:

Snadné a přirozené nasazování aplikací na kazetě Tarantool (část 1)

Neusneme na vavřínech a zvládneme ovládání topologie.

Správa topologie

Pojďme sloučit naše nové instance do replikační sady storage-2. Přidat novou skupinu replicaset_storage_2 a popsat ve svých proměnných parametry replikační sady analogicky s replicaset_storage_1. V sekci hosts určete, které instance budou zahrnuty do této skupiny (to je naše sada replik):

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

Začněme znovu s příručkou:

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

Podle možnosti --limit tentokrát jsme předali jméno skupiny, která odpovídá naší replikační sadě.

Zvažte možnost tags.

Naše role postupně provádí různé úkoly, které jsou označeny následujícími značkami:

  • cartridge-instances: správa instance (konfigurace, připojení k členství);
  • cartridge-replicasets: správa topologie (správa replikasetu a trvalé odstranění (vyhození) instancí z clusteru);
  • cartridge-config: správa dalších parametrů clusteru (vshard bootstrapping, automatický režim převzetí služeb při selhání, parametry autorizace a konfigurace aplikace).

Můžeme výslovně specifikovat, jakou část práce chceme dělat, pak role přeskočí zbytek úkolů. V našem případě chceme pracovat pouze s topologií, proto jsme upřesnili cartridge-replicasets.

Zhodnoťme výsledek našeho snažení. Hledání nové repliky http://localhost:8181/admin/cluster/dashboard.

Snadné a přirozené nasazování aplikací na kazetě Tarantool (část 1)

Hurá!

Experimentujte s překonfigurováním instancí a replikací a sledujte, jak se mění topologie clusteru. Můžete vyzkoušet různé provozní scénáře, např. průběžná aktualizace nebo zvýšit memtx_memory. Role se to pokusí provést bez restartování instance, aby se zkrátily možné prostoje vaší aplikace.

Nezapomeň běžet vagrant haltk zastavení virtuálních počítačů, když s nimi skončíte.

A co je pod kapotou?

Zde budu mluvit více o tom, co se dělo pod pokličkou ansible role během našich experimentů.

Pojďme se podívat na nasazení aplikace Cartridge krok za krokem.

Instalace balíčku a spouštění instancí

Nejprve musíte balíček doručit na server a nainstalovat. Nyní může role pracovat s balíčky RPM a DEB.

Dále spustíme instance. Všechno je zde velmi jednoduché: každá instance je samostatná systemd-servis. Mluvím o příkladu:

$ systemctl start myapp@storage-1

Tento příkaz spustí instanci storage-1 aplikace myapp. Spuštěná instance ji vyhledá konfigurace в /etc/tarantool/conf.d/. Protokoly instancí lze zobrazit pomocí journald.

Soubor jednotky /etc/systemd/system/[email protected] pro službu systemd bude doručena s balíčkem.

Ansible má vestavěné moduly pro instalaci balíčků a správu systemd služeb, nic nového jsme zde nevymysleli.

Konfigurace topologie clusteru

A tady začíná to nejzajímavější. Souhlasím, bylo by divné obtěžovat se speciální ansible-rolí pro instalaci balíčků a spouštění systemd-služby.

Cluster můžete nastavit ručně:

  • První možnost: otevřete webové uživatelské rozhraní a klikněte na tlačítka. Pro jednorázové spuštění několika instancí je to docela vhodné.
  • Druhá možnost: můžete použít GraphQl API. Zde si již můžete něco zautomatizovat, například napsat skript v Pythonu.
  • Třetí možnost (pro silné povahy): přejděte na server, připojte se k jedné z instancí pomocí tarantoolctl connect a provést všechny potřebné manipulace s modulem Lua cartridge.

Hlavním úkolem našeho vynálezu je udělat toto, pro vás nejobtížnější část práce.

Ansible vám umožňuje napsat svůj vlastní modul a používat jej v roli. Naše role využívá tyto moduly ke správě různých součástí clusteru.

Jak to funguje? Požadovaný stav clusteru popíšete v deklarativní konfiguraci a role poskytne každému modulu jeho konfigurační sekci jako vstup. Modul přijímá aktuální stav clusteru a porovnává jej se vstupem. Dále je přes soket jedné z instancí spuštěn kód, který uvede cluster do požadovaného stavu.

Výsledky

Dnes jsme si řekli a ukázali, jak nasadit vaši aplikaci na kazetu Tarantool a nastavit jednoduchou topologii. K tomu jsme použili Ansible, výkonný nástroj, který se snadno používá a umožňuje současně konfigurovat mnoho uzlů infrastruktury (v našem případě se jedná o instance clusteru).

Výše jsme se zabývali jedním z mnoha způsobů, jak popsat konfiguraci clusteru pomocí Ansible. Jakmile víte, že jste připraveni jít dál, učte se osvědčené postupy pro psaní herních knih. Možná bude pro vás pohodlnější spravovat topologii group_vars и host_vars.

Velmi brzy vám řekneme, jak trvale odebrat (vyloučit) instance z topologie, zavést vshard, spravovat automatický režim převzetí služeb při selhání, nakonfigurovat autorizaci a opravit konfiguraci clusteru. Mezitím můžete studovat sami dokumentace a experimentujte se změnou parametrů clusteru.

Pokud něco nefunguje, buďte si jisti informovat nás o problému. Rychle to rozebereme!

Zdroj: www.habr.com

Přidat komentář