Enostavno in naravno nameščanje aplikacij na Tarantool Cartridge (1. del)

Enostavno in naravno nameščanje aplikacij na Tarantool Cartridge (1. del)

Smo že govorili o Tarantool kartuša, ki vam omogoča razvoj porazdeljenih aplikacij in njihovo pakiranje. Ničesar ne preostane: naučite se uvajati in upravljati te aplikacije. Ne skrbite, pomislili smo na vse! Zbrali smo vse najboljše prakse za delo s kartušo Tarantool in napisali ansible-vloga, ki bo razčlenil paket na strežnike, zagnal primerke, jih združil v gručo, konfiguriral avtorizacijo, bootstrap vshard, omogočil samodejno preklop in popravil konfiguracijo gruče.

zanimivo? Potem vprašam pod rezom, vse bomo povedali in pokazali.

Začnimo s primerom

Zajeli bomo le del funkcionalnosti naše vloge. Popoln opis vseh njegovih funkcij in vhodnih parametrov lahko vedno najdete v dokumentacijo. Vendar je bolje poskusiti enkrat kot videti stokrat, zato namestimo majhno aplikacijo.

Tarantool Cartridge ima vadnica ustvariti majhno aplikacijo Cartridge, ki shranjuje informacije o bančnih strankah in njihovih računih ter ponuja tudi API za upravljanje podatkov prek HTTP. Za to aplikacija opisuje dve možni vlogi: api и storageki jih je mogoče dodeliti primerkom.

Sama kartuša ne pove ničesar o tem, kako zagnati procese, ponuja le možnost konfiguriranja že delujočih primerkov. Ostalo mora uporabnik narediti sam: razstaviti konfiguracijske datoteke, zagnati storitve in nastaviti topologijo. A vsega tega ne bomo storili mi, namesto nas bo to naredil Ansible.

Od besed k dejanjem

Razmestimo torej našo aplikacijo na dva virtualna stroja in nastavimo preprosto topologijo:

  • Replicaset app-1 bo igral vlogo apiki vključuje vlogo vshard-router. Tukaj bo samo en primer.
  • replikaset storage-1 izvaja vlogo storage (in hkrati vshard-storage), tukaj dodamo dva primerka iz različnih strojev.

Enostavno in naravno nameščanje aplikacij na Tarantool Cartridge (1. del)

Za izvedbo primera potrebujemo Pohlepno и Možno (različica 2.8 ali novejša).

Sama vloga je Odgovorna galaksija. To je repozitorij, ki vam omogoča skupno rabo vašega dela in uporabo že pripravljenih vlog.

Klonirajte repozitorij s primerom:

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

Vzgajamo virtualne stroje:

$ vagrant up

Namestite Tarantool Cartridge ansible vlogo:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Zaženite nameščeno vlogo:

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

Čakamo na konec izvajanja playbooka, pojdite na http://localhost:8181/admin/cluster/dashboard in uživajte v rezultatu:

Enostavno in naravno nameščanje aplikacij na Tarantool Cartridge (1. del)

Lahko vnesete podatke. Kul, kajne?

Zdaj pa ugotovimo, kako delati s tem, in hkrati topologiji dodamo še en niz replik.

Začnemo razumeti

Torej kaj se je zgodilo?

Imamo dva navidezna računalnika, ki izvajata ansible playbook, ki je postavil našo gručo. Poglejmo vsebino datoteke 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

Tu se ne zgodi nič zanimivega, zaženemo ansible-role, ki se imenuje tarantool.cartridge.

Vse najpomembnejše (namreč konfiguracija gruče) se nahaja v inventar-mapa 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:

Vse, kar se moramo naučiti, je, kako upravljati primerke in nabore replikatov s spreminjanjem vsebine te datoteke. Nato mu bomo dodali nove razdelke. Da se ne boste zmedli, kam jih dodati, lahko pokukate v končno različico te datoteke, hosts.updated.yml, ki je v repozitoriju primerov.

Upravljanje primerkov

V smislu Ansible je vsak primerek gostitelj (ne smemo ga zamenjevati z železnim strežnikom), tj. infrastrukturno vozlišče, ki ga bo upravljal Ansible. Za vsakega gostitelja lahko določimo parametre povezave (kot npr ansible_host и ansible_user), kot tudi konfiguracijo primerka. Opis primerov je v razdelku hosts.

Upoštevajte konfiguracijo primerka storage-1:

all:
  vars:
    ...

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

  ...

V spremenljivki config določili smo parametre instance - advertise URI и HTTP port.
Spodaj so parametri primerka app-1 и storage-1-replica.

Ansibleu moramo povedati parametre povezave za vsak primerek. Zdi se logično združiti primerke v skupine virtualnih strojev. Da bi to naredili, so primerki združeni v skupine. host1 и host2, in v vsaki skupini v razdelku vars vrednote ansible_host и ansible_user za en virtualni stroj. In v razdelku hosts - gostitelji (so primerki), ki so vključeni v to skupino:

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čnemo se spreminjati hosts.yml. Dodajmo še dva primera, storage-2-replica na prvem virtualnem stroju in storage-2 Na drugem:

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

Zaženi ansible playbook:

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

Bodite pozorni na možnost --limit. Ker je vsak primerek gruče gostitelj v smislu Ansible, lahko eksplicitno določimo, kateri primerki naj bodo konfigurirani pri izvajanju priročnika.

Nazaj na spletni uporabniški vmesnik http://localhost:8181/admin/cluster/dashboard in opazujte naše nove primere:

Enostavno in naravno nameščanje aplikacij na Tarantool Cartridge (1. del)

Ne bomo spali na lovorikah in bomo obvladali nadzor topologije.

Upravljanje topologije

Združimo naše nove primerke v replikaset storage-2. Dodajte novo skupino replicaset_storage_2 in v svojih spremenljivkah opiše parametre nabora replik po analogiji z replicaset_storage_1. V razdelku hosts določite, kateri primerki bodo vključeni v to skupino (to je naš nabor 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čnimo znova z igro:

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

Po možnosti --limit tokrat smo posredovali ime skupine, ki ustreza našemu replikasetu.

Razmislite o možnosti tags.

Naša vloga zaporedno opravlja različne naloge, ki so označene z naslednjimi oznakami:

  • cartridge-instances: upravljanje instanc (konfiguracija, povezava s članstvom);
  • cartridge-replicasets: upravljanje topologije (upravljanje replikaseta in trajno odstranjevanje (izgon) instanc iz gruče);
  • cartridge-config: upravljanje drugih parametrov gruče (vshard bootstrapping, način samodejnega preklopa, avtorizacijski parametri in konfiguracija aplikacije).

Izrecno lahko določimo, kateri del dela želimo opraviti, potem bo vloga preskočila preostale naloge. V našem primeru želimo delati samo s topologijo, zato smo določili cartridge-replicasets.

Ocenimo rezultat naših prizadevanj. Iskanje novega niza replik http://localhost:8181/admin/cluster/dashboard.

Enostavno in naravno nameščanje aplikacij na Tarantool Cartridge (1. del)

Hura!

Eksperimentirajte s ponovnim konfiguriranjem primerkov in replikasetov in si oglejte, kako se spreminja topologija gruče. Preizkusite lahko različne scenarije delovanja, npr. tekoča posodobitev ali povečati memtx_memory. Vloga bo poskušala to storiti brez ponovnega zagona instance, da bi zmanjšala morebitne izpade vaše aplikacije.

Ne pozabi teči vagrant haltda zaustavite VM, ko končate z njimi.

In kaj je pod pokrovom?

Tukaj bom govoril več o tem, kaj se je zgodilo pod pokrovom vloge ansible med našimi poskusi.

Oglejmo si korak za korakom uvajanje aplikacije Cartridge.

Namestitev paketa in zagon primerkov

Najprej morate paket dostaviti na strežnik in ga namestiti. Zdaj lahko vloga deluje s paketi RPM in DEB.

Nato zaženemo primerke. Tukaj je vse zelo preprosto: vsak primer je ločen systemd- storitev. Govorim o primeru:

$ systemctl start myapp@storage-1

Ta ukaz bo zagnal primerek storage-1 aplikacije myapp. Zagnani primerek bo iskal svoj konfiguracijo в /etc/tarantool/conf.d/. Dnevnike primerkov si lahko ogledate z uporabo journald.

Datoteka enote /etc/systemd/system/[email protected] za storitev systemd bo dostavljena s paketom.

Ansible ima vgrajene module za namestitev paketov in upravljanje s storitvami systemd, tukaj nismo izumili nič novega.

Konfiguriranje topologije gruče

In tu se začne najbolj zanimivo. Se strinjate, čudno bi bilo, če bi se obremenjevali s posebno ansible-role za namestitev paketov in zagon systemd-storitve.

Настроить кластер можно вручную:

  • Prva možnost: odprite spletni uporabniški vmesnik in kliknite gumbe. Za enkraten zagon več primerkov je zelo primeren.
  • Druga možnost: uporabite lahko GraphQl API. Tukaj lahko že nekaj avtomatizirate, na primer napišete skript v Pythonu.
  • Tretja možnost (za močne v duhu): pojdite na strežnik, se povežite z enim od primerkov z uporabo tarantoolctl connect in izvedite vse potrebne manipulacije z modulom Lua cartridge.

Glavna naloga našega izuma je opraviti ta, najtežji del dela za vas.

Ansible vam omogoča, da napišete svoj modul in ga uporabite v vlogi. Naša vloga uporablja te module za upravljanje različnih komponent gruče.

Kako deluje? Želeno stanje gruče opišete v deklarativni konfiguraciji, vloga pa daje vsakemu modulu svoj razdelek konfiguracije kot vhod. Modul prejme trenutno stanje gruče in ga primerja z vhodom. Nato se skozi vtičnico ene od instanc požene koda, ki pripelje gručo v želeno stanje.

Rezultati

Danes smo povedali in pokazali, kako razmestiti svojo aplikacijo na Tarantool Cartridge in nastaviti preprosto topologijo. Za to smo uporabili Ansible, zmogljivo orodje, ki je enostavno za uporabo in omogoča hkratno konfiguracijo več infrastrukturnih vozlišč (v našem primeru so to primerki gruče).

Zgoraj smo obravnavali enega od mnogih načinov za opis konfiguracije gruče z uporabo Ansible. Ko veste, da ste pripravljeni nadaljevati, se učite najboljše prakse za pisanje iger. Morda se vam bo zdelo bolj priročno upravljati topologijo group_vars и host_vars.

Zelo kmalu vam bomo povedali, kako trajno odstraniti (izgnati) primerke iz topologije, zagnati vshard, upravljati način samodejnega preklopa, konfigurirati avtorizacijo in popraviti konfiguracijo gruče. Medtem se lahko učite sami dokumentacijo in eksperimentirajte s spreminjanjem parametrov gruče.

Če nekaj ne deluje, se prepričajte informirati nas o težavi. Hitro ga bomo razbili!

Vir: www.habr.com

Dodaj komentar