
Kemi tashmë kemi folur për , 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 , 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ë . 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 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-1do të realizojë rolinapi, i cili përfshin rolinvshard-router. Këtu do të ketë vetëm një instancë. - Replicaset
storage-1realizon rolinstorage(dhe njëkohësishtvshard-storage), këtu do të shtojmë dy instanca nga makina të ndryshme.

Për të startuar shembullin, do të na duhen dhe (versioni 2.8 ose më i vjetër).
Roli vetë ndodhet në . 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.0Do të ngremë makinat virtuale:
$ vagrant upDo të instalojmë rolin ansible Tarantool Cartridge:
$ ansible-galaxy install tarantool.cartridge,1.0.1Do të ekzekutojmë rolin e instaluar:
$ ansible-playbook -i hosts.yml playbook.ymlPërfundojmë ekzekutimin e playbook-ut, kalojmë në dhe shijojmë rezultatin:

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.cartridgeKë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ë -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.ymlKujtoni 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 dhe shohim instancat tona të reja:

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.ymlNë 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ë .

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, 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-1Kjo komandë do të nisë instancën storage-1 aplikacione myapp. Instanca e nisur do të kërkojë konfigurimin e saj 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 connectdhe realizojmë të gjitha manipulimet e nevojshme me modulcartridge.
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 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 dhe të eksperimentoni me ndryshimin e parametrave të grumbullit.
Nëse diçka nuk funksionon, sigurisht për problemin. Ne do ta zgjidhim gjithçka me shpejtësi!
Burimi: habr.com
