Ynsette maklik en natuerlik applikaasjes nei Tarantool Cartridge (diel 1)

Ynsette maklik en natuerlik applikaasjes nei Tarantool Cartridge (diel 1)

Wy hawwe it al oer Tarantool Cartridge, wêrtroch jo ferdielde applikaasjes kinne ûntwikkelje en se ferpakke. Alles wat oerbliuwt is om te learen hoe't jo dizze applikaasjes kinne ynsette en har beheare. Sit gjin soargen, wy hawwe it allegear behannele! Wy hawwe gearstald alle bêste praktiken foar wurkjen mei Tarantool Cartridge en skreau ansible-rol, dy't it pakket sil fersprieden nei servers, ynstânsjes lansearje, se ferienigje yn in kluster, autorisaasje konfigurearje, bootstrap vshard, automatyske failover ynskeakelje en de klusterkonfiguraasje patchje.

Nijsgjirrich? Dan asjebleaft, ûnder de besuniging, sille wy jo fertelle en alles sjen litte.

Litte wy begjinne mei in foarbyld

Wy sille allinich sjen nei in diel fan 'e funksjonaliteit fan ús rol. Jo kinne altyd fine in folsleine beskriuwing fan al syn mooglikheden en ynfier parameters yn dokumintaasje. Mar it is better om ien kear te besykjen dan it hûndert kear te sjen, dus litte wy in lytse applikaasje ynsette.

Tarantool Cartridge hat tutorial om in lytse Cartridge-applikaasje te meitsjen dy't ynformaasje opslacht oer bankkliïnten en har akkounts, en ek in API foar gegevensbehear leveret fia HTTP. Om dit te berikken beskriuwt de taheaksel twa mooglike rollen: api и storage, dy't kin wurde tawiisd oan eksimplaren.

Cartridge sels seit neat oer hoe't jo prosessen starte, it biedt allinich de mooglikheid om al rinnende eksimplaren te konfigurearjen. De brûker moat de rest sels dwaan: konfiguraasjebestannen regelje, tsjinsten begjinne en de topology konfigurearje. Mar wy sille dit alles net dwaan; Ansible sil it foar ús dwaan.

Fan wurden oant dieden

Dat, lit ús ús applikaasje ynsette op twa firtuele masines en in ienfâldige topology ynstelle:

  • Replikaset app-1 sil de rol útfiere api, dy't de rol omfettet vshard-router. D'r sil hjir mar ien eksimplaar wêze.
  • Replikaset storage-1 útfiert de rol storage (en tagelyk vshard-storage), hjir sille wy twa eksimplaren tafoegje fan ferskate masines.

Ynsette maklik en natuerlik applikaasjes nei Tarantool Cartridge (diel 1)

Om it foarbyld út te fieren moatte wy Vagrant и Sible (ferzje 2.8 of âlder).

De rol sels is yn Ansible Galaxy. Dit is in repository wêrmei jo jo wurk kinne diele en klearmakke rollen brûke.

Litte wy it repository klone mei in foarbyld:

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

Wy ferheegje firtuele masines:

$ vagrant up

Ynstallearje de Tarantool Cartridge ansible rol:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Starte de ynstallearre rol:

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

Wy wachtsje op it playbook om de útfiering te foltôgjen, gean nei http://localhost:8181/admin/cluster/dashboard en genietsje fan it resultaat:

Ynsette maklik en natuerlik applikaasjes nei Tarantool Cartridge (diel 1)

Jo kinne gegevens uploade. Cool, krekt?

Litte wy no útfine hoe't jo hjirmei wurkje, en tagelyk in oare replika-set tafoegje oan 'e topology.

Litte wy begjinne om it út te finen

Dus wat barde der?

Wy sette twa firtuele masines yn en lansearre in ansible playbook dat konfigurearre ús kluster. Litte wy nei de ynhâld fan it bestân sjen 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

Der bart hjir neat nijsgjirrichs, lit ús in oanwêzige rol lansearje neamd tarantool.cartridge.

Alle wichtichste dingen (nammentlik de klusterkonfiguraasje) lizze yn ynventarisaasje-map 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 wy nedich binne is om te learen hoe't jo eksimplaren en replikasets kinne beheare troch de ynhâld fan dit bestân te feroarjen. Folgjende sille wy nije seksjes tafoegje. Om net betize te wurden wêr't jo se tafoegje kinne, kinne jo de definitive ferzje fan dit bestân besjen, hosts.updated.yml, dat is yn it foarbyld repository.

Ynstânsje behear

Yn Ansible termen, elke eksimplaar is in host (net te betiizjen mei in hardware tsjinner), d.w.s. de ynfrastruktuer knooppunt dat Ansible sil beheare. Foar elke host kinne wy ​​ferbiningsparameters opjaan (lykas ansible_host и ansible_user), lykas ek de eksimplaarkonfiguraasje. Beskriuwing fan eksimplaren is yn 'e seksje hosts.

Litte wy nei de eksimplaarkonfiguraasje sjen storage-1:

all:
  vars:
    ...

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

  ...

Yn fariabele config wy spesifisearje de eksimplaarparameters - advertise URI и HTTP port.
Hjirûnder binne de eksimplaarparameters app-1 и storage-1-replica.

Wy moatte Ansible de ferbiningsparameters foar elke eksimplaar fertelle. It liket logysk om eksimplaren te groepearjen yn groepen fan firtuele masines. Foar dit doel wurde eksimplaren kombinearre yn groepen host1 и host2, en yn elke groep yn 'e seksje vars wearden wurde oanjûn ansible_host и ansible_user foar ien firtuele masine. En yn 'e seksje hosts - hosts (aka eksimplaren) dy't binne opnaam yn dizze groep:

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:

Wy begjinne te feroarjen hosts.yml. Litte wy noch twa eksimplaren tafoegje, storage-2-replica op de earste firtuele masine en storage-2 Op de twadde:

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

Iepenje it ansible playbook:

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

Let op de opsje --limit. Sûnt elke klustereksimplaar is in host yn Ansible termen, kinne wy ​​eksplisyt oantsjutte hokker eksimplaren moatte wurde konfigurearre by it útfieren fan it playbook.

Gean werom nei de Web UI http://localhost:8181/admin/cluster/dashboard en sjoch ús nije eksimplaren:

Ynsette maklik en natuerlik applikaasjes nei Tarantool Cartridge (diel 1)

Litte wy dêr net ophâlde en topologybehear behearskje.

Topology behear

Litte wy ús nije eksimplaren kombinearje yn in replika-set storage-2. Litte wy in nije groep tafoegje replicaset_storage_2 en beskriuwe de replikaset parameters yn syn fariabelen troch analogy mei replicaset_storage_1. Yn seksje hosts Litte wy oanjaan hokker eksimplaren sille wurde opnommen yn dizze groep (dat is ús 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:

Litte wy it playbook opnij begjinne:

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

Yn parameter --limit Dizze kear hawwe wy de namme trochjûn fan 'e groep dy't oerienkomt mei ús replikaset.

Litte wy de opsje beskôgje tags.

Us rol fiert sequentieel ferskate taken út, dy't binne markearre mei de folgjende tags:

  • cartridge-instances: eksimplaarbehear (konfiguraasje, ferbining mei lidmaatskip);
  • cartridge-replicasets: topologybehear (repliksetbehear en permaninte fuortheljen (ferdriuwe) fan eksimplaren út it kluster);
  • cartridge-config: behear fan oare kluster parameters (vshard bootstrapping, automatyske failover modus, autorisaasje parameters en applikaasje konfiguraasje).

Wy kinne eksplisyt oanjaan hokker diel fan it wurk wy wolle dwaan, dan sil de rol de rest fan 'e taken oerslaan. Yn ús gefal wolle wy allinich wurkje mei de topology, dus hawwe wy spesifisearre cartridge-replicasets.

Litte wy it resultaat fan ús ynspanningen evaluearje. Wy fine in nije replikaset op http://localhost:8181/admin/cluster/dashboard.

Ynsette maklik en natuerlik applikaasjes nei Tarantool Cartridge (diel 1)

Hoera!

Eksperimintearje mei it feroarjen fan de konfiguraasje fan eksimplaren en replika-sets en sjoch hoe't de klustertopology feroaret. Jo kinne ferskate operasjonele senario's besykje, bgl. rôljende update of fergrutsje memtx_memory. De rol sil besykje dit te dwaan sûnder de eksimplaar opnij te begjinnen om de mooglike downtime fan jo applikaasje te ferminderjen.

Ferjit net te rinnen vagrant haltom de firtuele masines te stopjen as jo klear binne mei wurkjen mei har.

En wat is ûnder de kap?

Hjir sil ik jo mear fertelle oer wat der barde ûnder de kap fan 'e ansible rol tidens ús eksperiminten.

Litte wy stap foar stap sjen nei it ynsetten fan de Cartridge-applikaasje.

It pakket ynstallearje en eksimplaren begjinne

Earst moatte jo it pakket oan 'e tsjinner leverje en it ynstallearje. Op it stuit kin de rol wurkje mei RPM- en DEB-pakketten.

Folgjende lansearje wy de eksimplaren. Alles is hjir hiel ienfâldich: elke eksimplaar is in apart systemd-betsjinning. Ik sil jo in foarbyld jaan:

$ systemctl start myapp@storage-1

Dit kommando sil it eksimplaar starte storage-1 apps myapp. De lansearre eksimplaar sil sykje nei syn konfiguraasje в /etc/tarantool/conf.d/. Instance logs kinne wurde besjoen mei help journald.

Unit triem /etc/systemd/system/[email protected] foar systemd tsjinst wurdt levere tegearre mei it pakket.

Ansible hat ynboude modules foar it ynstallearjen fan pakketten en it behearen fan systemd tsjinsten; wy hawwe hjir neat nij útfûn.

It opsetten fan in klustertopology

Dit is wêr't de wille begjint. Iens, it soe nuver wêze om te bemuoien mei in spesjale Ansible-rol foar it ynstallearjen fan pakketten en it útfieren systemd-tsjinsten.

Jo kinne it kluster manuell konfigurearje:

  • Earste opsje: iepenje de Web UI en klikje op de knoppen. It is hiel geskikt foar in ienmalige start fan ferskate eksimplaren.
  • Twadde opsje: jo kinne de GraphQl API brûke. Hjir kinne jo al wat automatisearje, bygelyks in skript skriuwe yn Python.
  • Tredde opsje (foar de sterke wil): gean nei de tsjinner, ferbine mei ien fan 'e eksimplaren dy't brûke tarantoolctl connect en fiere alle nedige manipulaasjes mei de Lua module cartridge.

De wichtichste taak fan ús útfining is om krekt dit te dwaan, it dreechste diel fan it wurk foar jo.

Ansible lit jo jo eigen module skriuwe en it yn in rol brûke. Us rol brûkt sokke modules om ferskate klusterkomponinten te behearjen.

Hoe't it wurket? Jo beskriuwe de winske steat fan it kluster yn in declarative config, en de rol jout elke module mei syn konfiguraasje seksje as ynfier. De module ûntfangt de aktuele steat fan it kluster en fergeliket it mei wat waard ûntfongen as ynfier. Dêrnei wurdt in koade lansearre troch de socket fan ien fan 'e eksimplaren, dy't it kluster nei de winske steat bringt.

Resultaten

Hjoed hawwe wy ferteld en lieten sjen hoe't jo jo applikaasje kinne ynsette op Tarantool Cartridge en in ienfâldige topology ynstelle. Om dit te dwaan hawwe wy Ansible brûkt - in krêftich ark dat maklik te brûken is en jo tagelyk in protte ynfrastruktuerknooppunten kinne konfigurearje (yn ús gefal klustereksimplaren).

Hjirboppe seagen wy ien fan 'e protte manieren om in klusterkonfiguraasje te beskriuwen mei Ansible. Sadree't jo fiele ree om fierder te gean, ferkenne beste praktiken oer it skriuwen fan toanielstikken. Jo kinne it makliker fine om jo topology te behearjen mei help fan group_vars и host_vars.

Hiel gau sille wy jo fertelle hoe't jo eksimplaren permanint wiskje (ferdriuwe) út 'e topology, bootstrap vshard, automatyske failover-modus beheare, autorisaasje ynstelle en de klusterkonfiguraasje patchje. Yn 'e tuskentiid kinne jo sels studearje dokumintaasje en eksperimintearje mei it feroarjen fan klusterparameters.

As der wat net wurket, wês dan wis lit it my witte ús oer it probleem. Wy sille alles fluch sortearje!

Boarne: www.habr.com

Add a comment