Jednoduché a prirodzené nasadenie aplikácií na kazete Tarantool (1. časť)

Jednoduché a prirodzené nasadenie aplikácií na kazete Tarantool (1. časť)

Už sme o tom hovorili Tarantolová kazeta, ktorý vám umožňuje vyvíjať distribuované aplikácie a baliť ich. Všetko, čo zostáva, je naučiť sa nasadzovať tieto aplikácie a spravovať ich. Nebojte sa, všetko máme pripravené! Dali sme dohromady všetky osvedčené postupy pre prácu s kazetou Tarantol a napísali sme možná-rola, ktorý bude distribuovať balík na servery, spúšťať inštancie, spájať ich do klastra, konfigurovať autorizáciu, bootstrap vshard, povoliť automatické prepnutie pri zlyhaní a opraviť konfiguráciu klastra.

zaujímavé? Potom, prosím, pod strihom vám všetko povieme a ukážeme.

Začnime príkladom

Pozrieme sa len na časť funkčnosti našej role. Kompletný popis všetkých jeho možností a vstupných parametrov vždy nájdete v dokumentáciu. Ale je lepšie raz vyskúšať, ako stokrát vidieť, takže nasadzujeme malú aplikáciu.

Tarantool Cartridge má tutoriál na vytvorenie malej Cartridge aplikácie, ktorá uchováva informácie o bankových klientoch a ich účtoch a poskytuje aj API pre správu dát cez HTTP. Aby ste to dosiahli, príloha popisuje dve možné úlohy: api и storage, ktoré možno priradiť k inštanciám.

Samotná kazeta nehovorí nič o spôsobe spúšťania procesov, poskytuje iba možnosť konfigurácie už spustených inštancií. Používateľ musí urobiť zvyšok sám: usporiadať konfiguračné súbory, spustiť služby a nakonfigurovať topológiu. Ale toto všetko neurobíme; Ansible to urobí za nás.

Od slov k činom

Nasaďme teda našu aplikáciu na dva virtuálne stroje a nastavme jednoduchú topológiu:

  • Replikaset app-1 bude vykonávať rolu api, ktorá zahŕňa rolu vshard-router. Tu bude len jeden prípad.
  • Replikaset storage-1 implementuje rolu storage (a zároveň vshard-storage), tu pridáme dve inštancie z rôznych strojov.

Jednoduché a prirodzené nasadenie aplikácií na kazete Tarantool (1. časť)

Na spustenie príkladu, ktorý potrebujeme tulák и Ansible (verzia 2.8 alebo staršia).

Samotná rola je v Galaxia Ansible. Toto je úložisko, ktoré vám umožňuje zdieľať vašu prácu a používať pripravené roly.

Poďme naklonovať úložisko s príkladom:

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

Zvyšujeme virtuálne stroje:

$ vagrant up

Nainštalujte príslušnú rolu kazety Tarantol:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Spustite nainštalovanú rolu:

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

Čakáme, kým sa príručka dokončí, prejdite na stránku http://localhost:8181/admin/cluster/dashboard a užite si výsledok:

Jednoduché a prirodzené nasadenie aplikácií na kazete Tarantool (1. časť)

Dáta môžete nahrať. V pohode, však?

Teraz poďme zistiť, ako s tým pracovať, a zároveň pridať do topológie ďalšiu sadu replík.

Začnime to zisťovať

Takže, čo sa stalo?

Nastavili sme dva virtuálne stroje a spustili ansible playbook, ktorý konfiguroval náš klaster. Pozrime sa na obsah súboru 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

Nič zaujímavé sa tu nedeje, spustíme ansible rolu tzv tarantool.cartridge.

Všetky najdôležitejšie veci (menovite konfigurácia klastra) sú umiestnené v inventár- súbor 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šetko, čo potrebujeme, je naučiť sa spravovať inštancie a replikáty zmenou obsahu tohto súboru. Ďalej doň pridáme nové sekcie. Aby ste neboli zmätení, kde ich pridať, môžete sa pozrieť na konečnú verziu tohto súboru, hosts.updated.yml, ktorý sa nachádza v ukážkovom úložisku.

Správa inštancií

Z hľadiska Ansible je každá inštancia hostiteľom (nezamieňať s hardvérovým serverom), t.j. uzol infraštruktúry, ktorý bude Ansible spravovať. Pre každého hostiteľa môžeme špecifikovať parametre pripojenia (ako napr ansible_host и ansible_user), ako aj konfiguráciu inštancie. Popis inštancií je v sekcii hosts.

Pozrime sa na konfiguráciu inštancie storage-1:

all:
  vars:
    ...

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

  ...

V premennej config špecifikovali sme parametre inštancie - advertise URI и HTTP port.
Nižšie sú uvedené parametre inštancie app-1 и storage-1-replica.

Musíme Ansible povedať parametre pripojenia pre každú inštanciu. Zdá sa logické zoskupovať inštancie do skupín virtuálnych strojov. Na tento účel sú prípady spojené do skupín host1 и host2a v každej skupine v sekcii vars sú uvedené hodnoty ansible_host и ansible_user pre jeden virtuálny stroj. A v sekcii hosts — hostitelia (aka inštancie), ktorí sú zahrnutí v tejto skupine:

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číname sa meniť hosts.yml. Pridajme ešte dva prípady, storage-2-replica na prvom virtuálnom stroji a storage-2 Na druhom:

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

Spustite príručku ansible:

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

Prosím, poznačte si túto možnosť --limit. Keďže každá inštancia klastra je hostiteľom v zmysle Ansible, môžeme explicitne špecifikovať, ktoré inštancie by mali byť nakonfigurované pri spustení playbooku.

Prechod späť do webového používateľského rozhrania http://localhost:8181/admin/cluster/dashboard a pozrite si naše nové príklady:

Jednoduché a prirodzené nasadenie aplikácií na kazete Tarantool (1. časť)

Nezastavme sa len pri tom a osvojme si manažment topológie.

Správa topológie

Skombinujme naše nové inštancie do sady replík storage-2. Pridajme novú skupinu replicaset_storage_2 a opíšte parametre replikovej sady v jej premenných analogicky s replicaset_storage_1. V sekcii hosts Označme, ktoré inštancie budú zahrnuté do tejto skupiny (teda do našej sady replík):

---
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čnime znova s ​​príručkou:

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

V parametri --limit Tentoraz sme odovzdali názov skupiny, ktorý zodpovedá našej replike.

Zvážme možnosť tags.

Naša rola postupne vykonáva rôzne úlohy, ktoré sú označené nasledujúcimi značkami:

  • cartridge-instances: správa inštancií (konfigurácia, pripojenie k členstvu);
  • cartridge-replicasets: správa topológie (správa replikázy a trvalé odstránenie (vylúčenie) inštancií z klastra);
  • cartridge-config: správa ostatných parametrov klastra (vshard bootstrapping, automatický režim prepnutia, parametre autorizácie a konfigurácia aplikácie).

Môžeme výslovne špecifikovať, ktorú časť práce chceme robiť, potom rola preskočí zvyšok úloh. V našom prípade chceme pracovať len s topológiou, preto sme špecifikovali cartridge-replicasets.

Zhodnoťme výsledok nášho snaženia. Nájdeme novú replikaset na http://localhost:8181/admin/cluster/dashboard.

Jednoduché a prirodzené nasadenie aplikácií na kazete Tarantool (1. časť)

Hurá!

Experimentujte so zmenou konfigurácie inštancií a sád replík a uvidíte, ako sa zmení topológia klastra. Môžete si vyskúšať rôzne prevádzkové scenáre, napr. priebežná aktualizácia alebo zvýšiť memtx_memory. Rola sa to pokúsi urobiť bez reštartovania inštancie, aby sa skrátil možný prestoj vašej aplikácie.

Nezabudnite behať vagrant haltna zastavenie virtuálnych počítačov, keď s nimi skončíte.

A čo je pod kapotou?

Tu vám poviem viac o tom, čo sa dialo pod kapotou ansible role počas našich experimentov.

Pozrime sa na nasadenie aplikácie Cartridge krok za krokom.

Inštalácia balíka a spustenie inštancií

Najprv musíte doručiť balík na server a nainštalovať ho. V súčasnosti môže rola pracovať s balíkmi RPM a DEB.

Ďalej spustíme inštancie. Všetko je tu veľmi jednoduché: každá inštancia je samostatná systemd-servis. Uvediem príklad:

$ systemctl start myapp@storage-1

Tento príkaz spustí inštanciu storage-1 aplikácie myapp. Spustená inštancia bude hľadať svoje konfigurácia в /etc/tarantool/conf.d/. Protokoly inštancií je možné zobraziť pomocou journald.

Súbor jednotky /etc/systemd/system/[email protected] pre službu systemd bude doručená spolu s balíkom.

Ansible má vstavané moduly na inštaláciu balíkov a správu systemd služieb; tu sme nevymysleli nič nové.

Nastavenie topológie klastra

Tu začína zábava. Súhlasím, bolo by zvláštne obťažovať sa špeciálnou rolou Ansible na inštaláciu balíkov a spustenie systemd-služby.

Klaster môžete nakonfigurovať manuálne:

  • Prvá možnosť: otvorte webové používateľské rozhranie a kliknite na tlačidlá. Je celkom vhodný na jednorazové spustenie niekoľkých inštancií.
  • Druhá možnosť: môžete použiť GraphQl API. Tu už môžete niečo zautomatizovať, napríklad napísať skript v Pythone.
  • Tretia možnosť (pre silnú vôľu): prejdite na server, pripojte sa k jednej z inštancií pomocou tarantoolctl connect a vykonajte všetky potrebné manipulácie s modulom Lua cartridge.

Hlavnou úlohou nášho vynálezu je urobiť presne túto, pre vás najťažšiu časť práce.

Ansible vám umožňuje napísať si vlastný modul a použiť ho v role. Naša úloha využíva takéto moduly na správu rôznych komponentov klastra.

Ako to funguje? Požadovaný stav klastra opíšete v deklaratívnej konfigurácii a rola poskytne každému modulu jeho konfiguračnú sekciu ako vstup. Modul prijíma aktuálny stav klastra a porovnáva ho s tým, čo bolo prijaté ako vstup. Potom sa cez soket jednej z inštancií spustí kód, ktorý privedie klaster do požadovaného stavu.

Výsledky

Dnes sme povedali a ukázali, ako nasadiť vašu aplikáciu do kazety Tarantol a nastaviť jednoduchú topológiu. Na tento účel sme použili Ansible - výkonný nástroj, ktorý sa ľahko používa a umožňuje súčasne konfigurovať mnoho uzlov infraštruktúry (v našom prípade inštancie klastra).

Vyššie sme sa pozreli na jeden z mnohých spôsobov, ako opísať konfiguráciu klastra pomocou Ansible. Keď sa budete cítiť pripravení ísť ďalej, preskúmajte osvedčené postupy o písaní zošitov. Možno bude pre vás jednoduchšie spravovať vašu topológiu pomocou group_vars и host_vars.

Čoskoro vám povieme, ako natrvalo odstrániť (vylúčiť) inštancie z topológie, bootstrap vshard, spravovanie automatického režimu zlyhania, konfiguráciu autorizácie a opravu konfigurácie klastra. Medzitým môžete študovať sami dokumentácia a experimentovať so zmenou parametrov klastra.

Ak niečo nefunguje, určite daj mi vedieť nás o probléme. Všetko rýchlo vyriešime!

Zdroj: hab.com

Pridať komentár