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

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

Už sme hovorili o Kazeta Tarantool, ktorý vám umožňuje vyvíjať distribuované aplikácie a baliť ich. Zostáva už len naučiť sa, ako tieto aplikácie nasadiť a spravovať. Nebojte sa, postaráme sa o vás! Zhromaždili sme všetky osvedčené postupy pre prácu s Tarantool Cartridge a napísali sme... úloha ansible, ktorý distribuuje balík na servery, spustí inštancie, zlúči ich do klastra, nakonfiguruje autorizáciu, spustí vshard, povolí automatické prepnutie na záložný systém a opraví konfiguráciu klastra.

Máte záujem? Tak čítajte ďalej, všetko vám povieme a ukážeme.

Začnime príkladom

Pokryjeme iba časť funkcií našej role. Úplný popis všetkých jej možností a vstupných parametrov nájdete vždy v dokumentáciuAle je lepšie raz skúsiť ako stokrát vidieť, takže si nasaďme malú aplikáciu.

Kazeta Tarantool má tutoriál Vytvoriť malú aplikáciu Cartridge, ktorá ukladá informácie o bankových klientoch a ich účtoch a poskytuje API na správu údajov cez HTTP. Na dosiahnutie tohto cieľa aplikácia popisuje dve možné role: api и storage, ktoré je možné priradiť inštanciám.

Samotná kazeta nevysvetľuje, ako spúšťať procesy; poskytuje iba možnosť konfigurovať už spustené inštancie. Zvyšok musí používateľ urobiť sám: nasadiť konfiguračné súbory, spustiť služby a nakonfigurovať topológiu. Ale to všetko neurobíme my; Ansible to urobí za nás.

Od slov k činom

Takže, nasaďme našu aplikáciu na dva virtuálne počítače a nastavme jednoduchú topológiu:

  • Replikačná sada app-1 bude implementovať úlohu api, čo zahŕňa úlohu vshard-routerTu bude len jeden príklad.
  • Replikačná sada storage-1 uvedomuje si úlohu storage (a zároveň vshard-storage), pridáme sem dve inštancie z rôznych počítačov.

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

Na spustenie príkladu budeme potrebovať tulák и Ansible (verzia 2.8 alebo novšia).

Samotná úloha je v Ansible GalaxyToto je úložisko, ktoré vám umožňuje zdieľať váš vývoj a používať hotové role.

Naklonujme si vzorový repozitár:

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

Vytvárame virtuálne stroje:

$ vagrant up

Nainštalujte rolu Tarantool Cartridge Ansible:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Spustime nainštalovanú rolu:

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

Čakáme na dokončenie playbooku a potom prejdeme na http://localhost:8181/admin/cluster/dashboard a vychutnajte si výsledok:

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

Môžete naliať dáta. Paráda, však?

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

Poďme na to prísť

Tak čo sa stalo?

Nastavili sme dva virtuálne počítače a spustili sme Ansible playbook, ktorý nakonfiguroval 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 rolu ansible s názvom tarantool.cartridge.

Všetky najdôležitejšie veci (konkrétne konfigurácia klastra) sú 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 musíme urobiť, je naučiť sa, ako spravovať inštancie a sady replík zmenou obsahu tohto súboru. Neskôr doň pridáme nové sekcie. Aby ste sa vyhli nejasnostiam o tom, kam ich pridať, môžete sa pozrieť na finálnu verziu tohto súboru. hosts.updated.yml, ktorý sa nachádza v úložisku príkladov.

Správa inštancií

V terminológii Ansible je každá inštancia hostiteľ (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íklad ansible_host и ansible_user), ako aj konfiguráciu inštancie. Popisy inštancií sú 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 zadali 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 podľa virtuálneho počítača. Na tento účel sú inštancie zoskupené. host1 и host2a v každej skupine v sekcii vars hodnoty sú uvedené ansible_host и ansible_user pre jeden virtuálny stroj. A v sekcii hosts — hostitelia (tiež známi ako inštancie), ktorí sú súčasťou tejto skupiny:

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.ymlPridajme ešte dva prípady, storage-2-replica na prvom virtuálnom počítači 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:  # <==
  ...

Spustime si Ansible playbook:

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

Upozorňujeme na možnosť --limitKeďže každá inštancia klastra je v Ansible hostiteľom, môžeme explicitne určiť, ktoré inštancie by mali byť nakonfigurované pri spustení playbooku.

Vráťme sa k webovému používateľskému rozhraniu http://localhost:8181/admin/cluster/dashboard a vidíme naše nové inštancie:

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

Nezastavme sa tam a osvojme si správu topológie.

Správa topológie

Spojme naše nové inštancie do sady replík storage-2Pridajme novú skupinu. replicaset_storage_2 a parametre replíkovej sady v jej premenných popíšeme analogicky s replicaset_storage_1. V sekcii hosts Určime, ktoré inštancie budú zahrnuté v tejto skupine (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:

Spustime si znova herný plán:

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

V parametri --limit Tentoraz sme zadali názov skupiny, ktorá zodpovedá našej sade replík.

Zvážme možnosť tags.

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

  • cartridge-instancesspráva inštancií (konfigurácia, pripojenie k členstvu);
  • cartridge-replicasetsspráva topológie (správa replík a trvalé odstránenie (vylúčenie) inštancií z klastra);
  • cartridge-configspráva ďalších parametrov klastra (bootstrapping vshard, automatický režim záložného prepnutia, parametre autorizácie a konfigurácia aplikácií).

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

Zhodnoťme výsledky nášho úsilia. Hľadáme novú repliku na... http://localhost:8181/admin/cluster/dashboard.

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

Hurá!

Experimentujte so zmenami konfigurácií inštancií a replík a sledujte, ako sa mení topológia klastra. Môžete vyskúšať rôzne prevádzkové scenáre, ako napríklad: priebežná aktualizácia alebo zvýšiť memtx_memoryRola sa to pokúsi urobiť bez reštartovania inštancie, aby sa skrátil potenciálny prestoj vašej aplikácie.

Nezabudnite behať vagrant haltzastaviť virtuálne počítače po dokončení práce s nimi.

Čo je pod kapotou?

Tu sa podrobnejšie venujem tomu, čo sa dialo pod kapotou Ansible role počas našich experimentov.

Pozrime sa na kroky nasadenia aplikácie Cartridge.

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

Najprv je potrebné doručiť balík na server a nainštalovať ho. V súčasnosti môže táto rola pracovať s balíkmi RPM a DEB.

Ďalej spustíme inštancie. Je to veľmi jednoduché: každá inštancia je samostatná. systemd-služba. Vysvetlím to na príklade:

$ systemctl start myapp@storage-1

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

Súbor jednotky /etc/systemd/system/myapp@.sevice pre službu systemd bude dodaná spolu s balíkom.

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

Konfigurácia topológie klastra

A tu sa veci začínajú zaujímať. Súhlasíte, bolo by zvláštne obťažovať sa špeciálnou rolou Ansible na inštaláciu balíkov a ich spúšťanie. systemd-služby.

Klaster môžete nakonfigurovať manuálne:

  • Prvá možnosť: otvorte webové rozhranie a kliknite na tlačidlá. To je v poriadku na jednorazové spustenie viacerých inštancií.
  • Druhou možnosťou je použitie rozhrania GraphQl API. To umožňuje automatizáciu, napríklad písanie skriptu v jazyku Python.
  • Tretia možnosť (pre silných vôľou): prejdite na server a pripojte sa k jednej z inštancií pomocou tarantoolctl connect a všetky potrebné manipulácie vykonáme s modulom Lua cartridge.

Hlavným cieľom nášho vynálezu je urobiť túto najťažšiu časť práce za vás.

Ansible vám umožňuje písať vlastné moduly a používať ich v role. Naša rola používa tieto moduly na správu rôznych komponentov klastra.

Ako to funguje? Požadovaný stav klastra popíšete v deklaratívnej konfigurácii a rola odovzdá svoju konfiguračnú sekciu ako vstup každému modulu. Modul prijme aktuálny stav klastra a porovná ho so vstupom. Potom sa kód spustí cez socket na jednej z inštancií, čím sa klaster dostane do požadovaného stavu.

Výsledky

Dnes sme vysvetlili a predviedli, ako nasadiť aplikáciu do Tarantool Cartridge a nastaviť jednoduchú topológiu. Na to sme použili Ansible, výkonný a ľahko použiteľný nástroj, ktorý umožňuje súčasne konfigurovať viacero uzlov infraštruktúry (v našom prípade inštancie klastra).

Vyššie sme si popísali jeden z mnohých spôsobov, ako opísať konfiguráciu klastra pomocou Ansible. Keď budete pripravení pokračovať, preskúmajte ho osvedčené postupy na písanie herných príručiek. Možno vám bude pohodlnejšie spravovať topológiu pomocou group_vars и host_vars.

Veľmi skoro si vysvetlíme, ako natrvalo odstrániť (vylúčiť) inštancie z topológie, spustiť vshard, spravovať automatický režim záložného prepnutia, nakonfigurovať autorizáciu a opraviť konfiguráciu klastra. Medzitým si to môžete sami preskúmať. dokumentácia a experimentovať so zmenou parametrov klastra.

Ak niečo nefunguje, určite daj mi vedieť Povedzte nám o probléme. Rýchlo ho vyriešime!

Zdroj: hab.com

Kúpte si spoľahlivý hosting pre stránky s DDoS ochranou, VPS VDS servery 🔥 Kúpte si spoľahlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster