Lehtë dhe pa ndihmë ndërtojmë aplikacione mbi Tarantool Cartridge (pjesa 1)

Lehtë dhe pa ndihmë ndërtojmë aplikacione mbi Tarantool Cartridge (pjesa 1)

Kemi tashmë kemi folur për Tarantool Cartridge, e cila lejon zhvillimin e aplikacioneve të shpërndara dhe paketimin e tyre. Ka mbetur vetëm një hap: të mësojmë si t'i shpërndajmë këto aplikacione dhe t'i menaxhojmë ato. Mos u shqetësoni, ne e kemi parashikuar gjithçka! Kemi mbledhur praktikat më të mira për punën me Tarantool Cartridge dhe kemi shkruar rolin ansible, i cili do të shpërndajë paketën në servera, do të startojë instancat, do t'i bashkojë ato në një kluster, do të konfigurojë autorizimin, do të bëjë bootstrapping të vshard, do të aktivizojë dështimin automatik dhe do të patchë konfigurimin e klustrit.

Interesant? Atëherë ju lutem, shikoni më poshtë, do t'ju tregojmë gjithçka.

Le të fillojmë me një shembull

Ne do të shqyrtojmë vetëm një pjesë të funksionalitetit të rolit tonë. Përshkrimi i plotë i të gjitha mundësive dhe parametrave hyrës mund të gjendet gjithmonë në dokumentacionin. Por është më mirë të provosh një herë sesa të shohësh njëqind herë, prandaj le të shpërndajmë një aplikacion të vogël.

Tarantool Cartridge ka tutorial për krijimin e një aplikacioni të vogël Cartridge, i cili ruan informacionin rreth klientëve të bankës dhe llogarive të tyre, si dhe ofron një API për menaxhimin e të dhënave përmes HTTP. Për këtë, në aplikacion do të përshkruhen dy role të mundshme: api dhe storage, të cilat mund të caktohen instancave.

Cartridge vetë nuk thotë asgjë rreth mënyrës së ekzekutimit të proceseve, ai thjesht ofron mundësinë për konfiguruar instancat që janë tashmë të lançuara. Pjesa tjetër përdoruesi duhet ta bëjë vetë: të shpërndajë skedarët e konfigurimit, të startojë shërbimet dhe të konfigurojë topologjinë. Por ne nuk do të merremi me këto, Ansible do ta bëjë këtë për ne.

Nga fjalët në vepër

Pra, do të shpërndajmë aplikacionin tonë në dy makineri virtuale dhe do të konfigurojmë një topologji të thjeshtë:

  • Replicaset app-1 do të realizojë rolin api, i cili përfshin rolin vshard-router. Këtu do të ketë vetëm një instancë.
  • Replicaset storage-1 realizon rolin storage (dhe njëkohësisht vshard-storage), këtu do të shtojmë dy instanca nga makina të ndryshme.

Lehtë dhe pa ndihmë ndërtojmë aplikacione mbi Tarantool Cartridge (pjesa 1)

Për të startuar shembullin, do të na duhen Vagrant dhe Ansible (versioni 2.8 ose më i vjetër).

Roli vetë ndodhet në Ansible Galaxy. Ky është një depo që lejon ndarjen e zhvillimeve dhe përdorimin e roleve të gatshme.

Do të klonojmë depot me shembullin:

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

Do të ngremë makinat virtuale:

$ vagrant up

Do të instalojmë rolin ansible Tarantool Cartridge:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Do të ekzekutojmë rolin e instaluar:

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

Përfundojmë ekzekutimin e playbook-ut, kalojmë në http://localhost:8181/admin/cluster/dashboard dhe shijojmë rezultatin:

Lehtë dhe pa ndihmë ndërtojmë aplikacione mbi Tarantool Cartridge (pjesa 1)

Mund të ngarkojmë të dhënat. E mrekullueshme, apo jo?

Tani le të kuptojmë si të punojmë me këtë dhe për një herë të shtojmë një replikaset tjetër në topologji.

Fillojmë të kuptojmë

Pra, çfarë ndodhi?

Ngritëm dy makina virtuale dhe ekzekutuam playbook-un ansible, i cili konfiguronte klasterin tonë. Le të shohim përmbajtjen e skedarit 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

Këtu nuk po ndodh asgjë interesante, po ekzekutojmë rolin ansible, i cili quhet tarantool.cartridge.

Gjithçka më e rëndësishme (pra, konfigurimi i klasterit) ndodhet në inventory-skedarin hosts.yml:

---
all:
  vars:
    # variablat e zakonshme të klasterit
    cartridge_app_name: getting-started-app
    cartridge_package_path: .\/getting-started-app-1.0.0-0.rpm  # rruga për paketën

    cartridge_cluster_cookie: app-default-cookie  # biskota e klasterit

    # opsionet e zakonshme ssh
    ansible_ssh_private_key_file: ~\/\.vagrant.d\/insecure_private_key
    ansible_ssh_common_args: '-o IdentitiesOnly=yes -o UserKnownHostsFile=\/dev\/null -o StrictHostKeyChecking=no'

  # INSTANCAT
  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:
    # GRUPO KLASAT PËRGATITJE PËR MAKINA
    host1:
      vars:
        # opsionet e lidhjes për makinën e parë
        ansible_host: 172.19.0.2
        ansible_user: vagrant

      hosts:  # instancat që do të fillojnë në makinën e parë
        storage-1:

    host2:
      vars:
        # opsionet e lidhjes për makinën e dytë
        ansible_host: 172.19.0.3
        ansible_user: vagrant

      hosts:  # instancat që do të fillojnë në makinën e dytë
        app-1:
        storage-1-replica:

    # GRUPO KLASAT PËRGATITJE PËR REPLIKAT
    replicaset_app_1:
      vars:  # konfigurimi i setit të replikave
        replicaset_alias: app-1
        failover_priority:
          - app-1  # lider
        roles:
          - 'api'

      hosts:  # instancat e setit të replikave
        app-1:

    replicaset_storage_1:
      vars:  # konfigurimi i setit të replikave
        replicaset_alias: storage-1
        weight: 3
        failover_priority:
          - storage-1  # lider
          - storage-1-replica
        roles:
          - 'storage'

      hosts:   # instancat e setit të replikave
        storage-1:
        storage-1-replica:

Gjithçka që na duhet është të mësojmë të menaxhojmë instancat dhe replikat, duke modifikuar përmbajtjen e këtij skedari. Më pas do të shtojmë seksione të reja këtu. Për të mos u ngatërruar, mund të shikoni versionin përfundimtar të këtij skedari, hosts.updated.yml, i cili ndodhet në depo me shembuj.

Menaxhimi i instancave

Në terminologjinë Ansible, çdo instancë është një host (mos e ngatërroni me serverin fizik), pra, një nyje infrastrukture që Ansible do të menaxhojë. Për secilën host, mund të përcaktojmë parametrat e lidhjes (siç janë ansible_host dhe ansible_user), si dhe konfigurimin e instancës. Përshkrimi i instancave ndodhet në seksionin hosts.

Le të shqyrtojmë konfigurimin e instancës storage-1:

all:
  vars:
    ...

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

  ...

Në variablin config kemi përcaktuar parametrat e instancës — advertise URI dhe HTTP port.
Më poshtë janë parametrat e instancave app-1 dhe storage-1-replica.

Na nevojitet të tregojmë Ansible parametrat e lidhjes për secilën instancë. Duket e arsyeshme të grupojmë instancat sipas makinerive virtuale. Për këtë, instancat janë të grupuara në grupe host1 dhe host2, dhe në secilën grup në seksionin vars janë përcaktuar vlerat ansible_host dhe ansible_user për një makinë virtuale. Dhe në seksionin hosts — hostet (të njëjtat janë instancat), që janë pjesë e këtij grupi:

all:
  vars:
    ...
  hosts:
    ...
  children:
    # GRUPONI INSTANCAT SIPAS MAKINAVE
    host1:
      vars:
        # opsionet e lidhjes për makinën e parë
        ansible_host: 172.19.0.2
        ansible_user: vagrant
       hosts:  # instancat që do të nisen në makinën e parë
        storage-1:

     host2:
      vars:
        # opsionet e lidhjes për makinën e dytë
        ansible_host: 172.19.0.3
        ansible_user: vagrant
       hosts:  # instancat që do të nisen në makinën e dytë
        app-1:
        storage-1-replica:

Të fillojmë të ndërronim hosts.yml. Të shtojmë edhe dy instanca, storage-2-replica në makinën e parë dhe storage-2 në të dytën:

all:
  vars:
    ...

  # INSTANCAT
  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:
    # GRUPONI INSTANCAT SIPAS MAKINAVE
    host1:
      vars:
        ...
      hosts:  # instancat që do të nisen në makinën e parë
        storage-1:
        storage-2-replica:  # <==

    host2:
      vars:
        ...
      hosts:  # instancat që do të nisen në makinën e dytë
        app-1:
        storage-1-replica:
        storage-2:  # <==
  ...

Po ekzekutojmë ansible-playbook:

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

Kujtoni opsionin --limit. Pavarësisht se çdo instancë e klasterit është një host në terminologjinë Ansible, ne mund të specifikojmë konkretisht cilat instanca duhet të konfigurohen gjatë ekzekutimit të playbook-ut.

Përsëri hyjmë në Web UI http://localhost:8181/admin/cluster/dashboard dhe shohim instancat tona të reja:

Lehtë dhe pa ndihmë ndërtojmë aplikacione mbi Tarantool Cartridge (pjesa 1)

Nuk do të ndalemi këtu dhe do të mësojmë menaxhimin e topologjisë.

Menaxhimi i topologjisë

Do të bashkojmë instancat tona të reja në një replicaset storage-2. Të shtojmë një grup të ri replicaset_storage_2 dhe të përshkruajmë në variablët e saj parametrat e replicaset-it në bazë të replicaset_storage_1. Në seksionin hosts do të tregojmë se cilët instanca do të përfshihen në këtë grup (pra, seti ynë i replikimit):

---
all:
  vars:
    ...
  hosts:
    ...
  children:
    ...
    # GRUPI INSTANCAVE SIPAS SETEVE TË REPLIKIMIT
    ...
    replicaset_storage_2:  # <==
      vars:  # konfigrimi i setit të replikimit
        replicaset_alias: storage-2
        weight: 2
        failover_priority:
          - storage-2
          - storage-2-replica
        roles:
          - 'storage'

      hosts:   # instancat e setit të replikimit
        storage-2:
        storage-2-replica:

Sërish po e fillojmë playbook-un:

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

Në parametrin --limit këtë herë kaluam emrin e grupit që i përgjigjet setit tonë të replikimit.

Le të shqyrtojmë opsionin : ngarkesë. Mund të përdoren etika të tjera kuptimplote. Ato caktohen.

Roli ynë përfundimisht kryen detyra të ndryshme, të cilat janë shënuar me etiketat e mëposhtme:

  • cartridge-instances: menaxhimi i instancave (konfigurimi, lidhja me anëtarësinë);
  • cartridge-replicasets: menaxhimi i topologjisë (menaxhimi i seteve të replikimit dhe heqja e pakthyeshme (expel) e instancave nga klasteri);
  • cartridge-config: menaxhimi i parametrave të tjerë të klasterit (vshard bootstrapping, sistemi automatik i failover-it, parametrat e autorizimit dhe konfigurimi i aplikacionit).

Mund të tregojmë qartë se çfarë pune duam të bëjmë, atëherë roli do të anashkalojë kryerjen e detyrave të tjera. Në rastin tonë duam të punojmë vetëm me topologjinë, prandaj specifikuam cartridge-replicasets.

Le të vlerësojmë rezultatin e përpjekjeve tona. Gjejmë setin e ri të replikimit në http://localhost:8181/admin/cluster/dashboard.

Lehtë dhe pa ndihmë ndërtojmë aplikacione mbi Tarantool Cartridge (pjesa 1)

Hurra!

Eksperimentoni me ndryshimin e konfigurimit të instancave dhe seteve të replikimit dhe shikoni si ndryshon topologjia e klasterit. Mund të provoni skenarë të ndryshëm operativë, për shembull, rolling update ose rritjen e memtx_memory. Roli do të përpiqet ta bëjë këtë pa rinisjen e instancës, për të minimizuar mundësinë e downtime-it të aplikacionit tuaj.

Mos harroni të ekzekutoni vagrant halt, për të ndaluar makinat virtuale, kur të keni përfunduar me to.

Dhe çfarë ndodh nën kapak?

Këtu do të flas më shumë për atë që ndodhte nën kapak gjatë rolin ansible gjatë eksperimenteve tona.

Le të shqyrtojmë hapat e instaluar të aplikacioneve Cartridge.

Instalimi i paketës dhe fillimi i instancave

Së pari, duhet të dërgoni paketën në server dhe ta instaloni atë. Tani roli di të punojë me paketat RPM dhe DEB.

Më pas, nisim instancat. Këtu gjithçka është shumë e thjeshtë: çdo instancë është një shërbim i veçantë. systemdE tregoj si shembull:

$ systemctl start myapp@storage-1

Kjo komandë do të nisë instancën storage-1 aplikacione myapp. Instanca e nisur do të kërkojë konfigurimin e saj konfiguracionit në /etc/tarantool/conf.d/. Ju do t’i shihni log-et e instancës përmes journald.

Njësi e skedarit /etc/systemd/system/myapp@.sevice për shërbimin systemd do të dërgohet së bashku me paketën.

Në Ansible ka módulo të integruara për instalimin e Paketimeve dhe menaxhimin e shërbimeve systemd, këtu nuk kemi shpikur asgjë të re.

Konfigurimi i topologjisë së klastrit

Këtu fillon më interesante. Pajtohuni, do të ishte çudirë të merreshim me një rol ansible të veçantë për instalimin e Paketimeve dhe nisjen systemd-shërbimeve.

Klastri mund të konfigurohet manualisht:

  • Opsioni i parë: hapim UI-në në internet dhe klikojmë butonat. Për një nisje të vetme të disa instancave, është mjaft i përshtatshëm.
  • Opsioni i dytë: mund të përdorim GraphQl API. Këtu mund të automatizojmë diçka, për shembull, të shkruajmë një skritp në Python.
  • Opsioni i tretë (për ata me guxim): hyjmë në server, lidhim me një nga instancat përmes tarantoolctl connect dhe realizojmë të gjitha manipulimet e nevojshme me modul cartridge.

Detyra kryesore e shpikjes sonë është të bëjmë për ju pikërisht këtë, pjesën më të vështirë të punës.

Ansible lejon të shkruani modul tuaj dhe ta përdorni në rol. Roli ynë përdor këto module për menaxhimin e komponenteve të ndryshme të klastrit.

Si funksionon? Ju përshkruani gjendjen e dëshiruar të klastrit në një konfiguraim deklarativ, dhe roli i jep secilit modul seksionin e tij të konfigurimit. Moduli merr gjendjen aktuale të klastrit dhe e krahason atë me ato që ka marrë si input. Më pas, përmes socket-it të njërit nga instancat ndizet kodi që e sjell klastrin në gjendjen e dëshiruar.

Përfundime

Sot ne treguam dhe demonstruam se si të deployoni aplikacionin tuaj në Tarantool Cartridge dhe të konfiguroni një topologji të thjeshtë. Për këtë ne përdorëm Ansible — një mjet të fuqishëm, që përnga i dallon lehtësia në përdorim dhe lejon konfigurimin e shumë nod-ëve të infrastrukturës njëkohësisht (në rastin tonë, këto janë instancat e klastrit).

Më sipër ne shqyrtuam një nga shumë mënyrat për të përshkruar konfigurimin e klastrit me anë të Ansible. Sa herë që të kuptoni se jeni gati të shkelni më tej, shqyrtoni praktikat më të mira për shkruarjen e playbooks. Ndoshta do ju jetë më e lehtë të menaxhoni topologjinë përmes group_vars dhe host_vars.

Shumë shpejt ne do t'ju tregojmë se si të fshini përsosmërish (expel) instancat nga topologjia, të bootstroni vshard, të menaxhoni modin automatik të dështimit, të konfiguroni autorizimin dhe të patchoni konfigurimin e grumbullit. Ndërkohë, mund të hulumtoni dokumentacion dhe të eksperimentoni me ndryshimin e parametrave të grumbullit.

Nëse diçka nuk funksionon, sigurisht na njoftoni për problemin. Ne do ta zgjidhim gjithçka me shpejtësi!

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster