
Ne kemi folur tashmë për , i cili lejon zhvillimin e aplikacioneve të shpërndara dhe paketimin e tyre. Ka mbetur vetëm një hap: të mësoni si të depozitoni këto aplikacione dhe t'i menaxhoni ato. Mos u shqetësoni, ne e kemi parashikuar gjithçka! Kemi mbledhur së bashku të gjitha 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ë nxisë instancat, do t'i bashkojë ato në një klaster, do të konfigurojë autorizimin, do të zbatojë vshard, do të aktivizojë automatizmin e dështimit dhe do të përditësojë konfigurimin e klasterit.
Interesant? Atëherë ju lutem vijoni poshtë, ne do t'ju tregojmë gjithçka.
Le të fillojmë me një shembull
Do të shqyrtojmë vetëm një pjesë të funksionalitetit të rolit tonë. Përshkrimi i plotë i të gjitha mundësive dhe parametrave të tij hyrës mund të gjendet gjithmonë në . Por është më mirë ta provoni një herë sesa ta shihni njëqind herë, prandaj le të depozojmë një aplikacion të vogël.
Tarantool Cartridge ka për krijimin e një aplikacioni të vogël Cartridge, i cili ruan informacion në lidhje me klientët e bankës dhe llogaritë e tyre, si dhe ofron API për menaxhimin e të dhënave përmes HTTP. Për këtë, aplikacioni përshkruan dy role të mundshme: api dhe storage, të cilat mund të caktohen për instancat.
Cartridge nuk nuk thotë se si të nisin proceset, ai thjesht ofron mundësinë për të konfigurimin e instancave të tashme. Pjesa tjetër përdoruesi duhet ta bëjë vetë: të vendosë skedarët e konfigurimit, të nisin shërbimet dhe të konfigurojë topologjinë. Por ne nuk do të angazhohemi në këtë, do ta bëjë Ansible për ne.
Nga fjalët në veprim
Tani, do ta vendosim aplikacionin tonë në dy virtuale dhe do të konfigurojmë një topologji të thjeshtë:
- Replicaset
app-1do të realizojë rolinapi, që 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ë filluar shembullin, do të na duhen dhe (versionet 2.8 ose më të vjetra).
Roli vetë ndodhet në . Ky është një depo që lejon ndarjen e punëve të tua dhe përdorimin e rolëve të gatshme.
Klonojmë depozitat me shembullin:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0Nisim virtualet:
$ vagrant upInstalojmë ansible-rolin Tarantool Cartridge:
$ ansible-galaxy install tarantool.cartridge,1.0.1Nisim rolin e instaluar:
$ ansible-playbook -i hosts.yml playbook.ymlPresim të përfundojë ekzekutimi i playbook-ut, kalojmë në dhe shijojmë rezultatin:

Mund të fillojmë të dërgojmë të dhëna. Super, apo jo?
Tani le të kuptojmë si të punojmë me këtë dhe njëkohësisht të shtojmë një replikaset në topologji.
Nisim të kuptojmë
Pra, çfarë ndodhi?
Ne ngritëm dy makina virtuale dhe e çeluam playbook-un ansible, i cili konfiguronte klasterin tonë. Le të shikojmë 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 ndodh asgjë interesante, nisim rolin ansible, i cili quhet tarantool.cartridge.
Të gjitha gjërat më të rëndësishme (në veçanti, konfigurimi i klasterit) ndodhen në -skedarin hosts.yml:
---
all:
vars:
# variablat e zakonshme të klastrit
cartridge_app_name: getting-started-app
cartridge_package_path: ./getting-started-app-1.0.0-0.rpm # rruga drejt paketës
cartridge_cluster_cookie: app-default-cookie # cookies e klastrit
# 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'
# INSTANCET
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:
# GRUPONI INSTANCET SIPAS MASHINAVE
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:
# GRUPONI INSTANCET SIPAS SETEVE TE REPLIKAVE
replicaset_app_1:
vars: # konfigurimi i grupit të replikave
replicaset_alias: app-1
failover_priority:
- app-1 # lideri
roles:
- 'api'
hosts: # instancat e grupit të replikave
app-1:
replicaset_storage_1:
vars: # konfigurimi i grupit të replikave
replicaset_alias: storage-1
weight: 3
failover_priority:
- storage-1 # lideri
- storage-1-replica
roles:
- 'storage'
hosts: # instancat e grupit të replikave
storage-1:
storage-1-replica:E gjithë çka që na nevojitet është të mësojmë si të menaxhojmë instancat dhe replikaset, duke ndryshuar përmbajtjen e këtij skedari. Më pas do të shtojmë seksione të reja në të. Për të mos u confuzuar se ku t'i shtojmë, mund të shikoni në versionin përfundimtar të këtij skedari, hosts.updated.yml, i cili ndodhet në depozitat e shembujve.
Menaxhimi i instancave
Në terminologjinë e Ansible, çdo instancë është një host (mos e ngatërroni me serverin fizik), dmth. një nyje infrastrukturore, të cilin Ansible do ta menaxhojë. Për çdo host, ne mund të specifikojmë 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ë variablën config ne kemi specifikuar parametrat e instancës — advertise URI dhe HTTP port.
Më poshtë ndodhen parametrat e instancave app-1 dhe storage-1-replica.
Na nevojitet të njoftojmë Ansible parametrat e lidhjes për secilën instancë. Duket logjike të grupojmë instancat sipas makinerive virtuale. Për këtë, instancat janë bashkuar në grupe host1 dhe host2, dhe në çdo grup në seksionin vars janë specifikuar vlerat ansible_host dhe ansible_user për një virtuale. Dhe në seksionin hosts — hostet (ato janë instanca) që përfshihen në këtë grup:
all:
vars:
...
hosts:
...
children:
# GRUPONI INSTANCAT SIPAS MASHINAVE
host1:
vars:
# mundësitë e lidhjes për makinën e parë
ansible_host: 172.19.0.2
ansible_user: vagrant
hosts: # instancat që do të nisin në makinën e parë
storage-1:
host2:
vars:
# mundësitë e lidhjes për makinën e dytë
ansible_host: 172.19.0.3
ansible_user: vagrant
hosts: # instancat që do të nisin në makinën e dytë
app-1:
storage-1-replica:Të fillojmë të ndryshojmë hosts.yml. Le të shtojmë edhe dy instanca, storage-2-replica në virtualen 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 MASHINAVE
host1:
vars:
...
hosts: # instancat që do të nisin në makinën e parë
storage-1:
storage-2-replica: # <==
host2:
vars:
...
hosts: # instancat që do të nisin në makinën e dytë
app-1:
storage-1-replica:
storage-2: # <==
...Po nisim ansible-playbook:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.ymlKujdesi për opsionin --limit. Duke çdo instancë e grupit është një host në kuptimin e Ansible, ne mund ta spesifikojmë me qartë se cilat instanca duhet të konfigurohen gjatë ekzekutimit të playbook-ut.
Përsëri hyjmë në Web UI dhe vëzhgojmë instancat tona të reja:

Nuk do të ndalemi këtu dhe do të mësojmë si të menaxhojmë topologjinë.
Menaxhimi i topologjisë
Të bashkojmë instancat tona të reja në një replicasët storage-2. Të shtojmë një grup të ri replicaset_storage_2 dhe ta përshkruajmë në variablat e saj parametrat e replicasët në mënyrë të ngjashme me replicaset_storage_1. Në seksionin hosts të tregojmë se cilat instanca do të përfshihen në këtë grup (dmth replicasët tonë):
---
all:
vars:
...
hosts:
...
children:
...
# GRUPONI INSTANCAT SIPAS REPLICA SETS
...
replicaset_storage_2: # <==
vars: # konfigurimi i replicasët
replicaset_alias: storage-2
weight: 2
failover_priority:
- storage-2
- storage-2-replica
roles:
- 'storage'
hosts: # instancat e replicasët
storage-2:
storage-2-replica:Përsëri e nisëm playbook-un:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.ymlNë parametrin --limit këtë herë kemi kaluar emrin e grupit që korrespondon me replicasët tonë.
Le të shqyrtojmë opsionin tags.
Roli ynë përmbush vazhdimisht detyra të ndryshme që shënohen me etiketat e mëposhtme:
cartridge-instances: menaxhimi i instancave (konfigurimi, lidha me anëtarësimin);cartridge-replicasets: menaxhimi i topologjisë (menaxhimi i replika grupeve dhe heqja e pakthyeshme (expel) e instancave nga klasteri);cartridge-config: menaxhimi i parametrave të tjerë të klasterit (vshard bootstrapping, moda e automatik të dështimit, parametrat e autorizimit dhe konfigurimi i aplikacionit).
Mund të specifikojmë qartë se cilën pjesë të punës dëshirojmë të bëjmë, atëherë roli do të kalojë përpara në realizimin e detyrave të tjera. Në rastin tonë, duam të punojmë vetëm me topologjinë, prandaj kemi shënuar cartridge-replicasets.
Le të vlerësojmë rezultatin e përpjekjeve tona. Gjejmë një grup të ri replika në .

Hurrah!
Eksperimentoni me ndryshimin e konfigurimeve të instancave dhe grupeve replika dhe shihni se si ndryshon topologjia e klasterit. Mund të provoni skenarë të ndryshëm operativë, si p.sh. ose rritje memtx_memory. Roli do të përpiqet ta bëjë këtë pa rinisjen e instancës, për të zvogëluar mundësinë e downtime-it të aplikacionit tuaj.
Mos harroni të filloni vagrant halt, për të ndaluar virtualet kur përfundoni me to.
Çfarë ndodhet nën kapak?
Këtu do të flas më shumë rreth asaj që ndodhte nën kapak gjatë eksperimenteve tona me rolin ansible.
Le të shqyrtojmë hapat e zhvillimit të aplikacionit 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.
Pastaj, fillojmë instancat. Këtu gjërat janë shumë të thjeshta: çdo instancë është një systemd-shërbim. Po jap një shembull:
$ systemctl start myapp@storage-1Kjo komandë do të nisë instancën storage-1 aplikacione myapp. Instanca e nisur do të kërkojë në /etc/tarantool/conf.d/. Logs e instancës mund të shihen përmes journald.
Skedari i njësisë /etc/systemd/system/myapp@.sevice për shërbimin systemd do të dërgohet së bashku me paketën.
Ansible ka module të ndërtuara për instalimin e paketave dhe menaxhimin e shërbimeve systemd, këtu nuk kemi shpikur asgjë të re.
Konfigurimi i topologjisë së klasterit
Këtu fillon e gjithë argëtimi. Priteni, do të ishte çuditshme të keni një rol të veçantë ansible për instalimin e paketave dhe fillimin e systemd-shërbimeve.
Klasterin mund ta konfiguroni manualisht:
- Opsioni i parë: hapim Web UI dhe shtypim butonat. Për një fillim të vetëm të disa instancave, është plotësisht 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ë skript në Python.
- Opsioni i tretë (për ata më të fortët): hyjmë në server, lidhemi me një nga instancat përmes
tarantoolctl connectdhe bëjmë të gjitha manipulimet e nevojshme me modulin Luacartridge.
Detyra kryesore e shpikjes sonë është të bëjmë për ju këtë pjesë të punës, më të vështirën.
Ansible lejon të shkruhet moduli juaj dhe ta përdorni atë në rolin tuaj. Roli ynë përdor këta module për të menaxhuar komponentët e ndryshëm të klasterit.
Si funksionon kjo? Ju përshkruani gjendjen e dëshiruar të klasterit në një konfigurim deklarativ, dhe roli u jep secilit moduli seksionin e tij të konfigurimit. Moduli merr gjendjen aktuale të klasterit dhe e krahasohet me atë që ka ardhur në input. Pastaj, përmes socket-it të njërit prej instancave, fillohet kodi që e çon klasterin në gjendjen e dëshiruar.
Përfundimet
Sot treguam dhe treguam se si të vendosni aplikacionin tuaj në Tarantool Cartridge dhe të konfiguroni një topologji të thjeshtë. Për këtë, përdorëm Ansible — një mjet të fuqishëm, i njohur për thjeshtësinë e tij të përdorimit dhe lejon konfigurimin e shumë nyjeve të infrastrukturës në të njëjtën kohë (në rastin tonë, këto janë instancat e klasës).
Më sipër, e shqyrtuam një nga shumë mënyrat e përshkrimit të konfiguracionit të klasës përmes Ansible. Sa herë që të kuptoni se jeni gati të shkoni përpara, shqyrtoni për të shkruar playbooks. Ndoshta do t'ju jetë më lehtë të menaxhoni topologjinë me anë të group_vars dhe host_vars.
Shumë shpejt do t'ju tregojmë se si të fshini pa kthim (expel) instancat nga topologjia, si të bootstroni vshard, si të menaxhoni modalitetin e automatik të failover-it, të konfiguroni autorizimin dhe të patch-oni konfigurimin e klasës. Ndërkohë, mund të eksploroni dhe të eksperimentoni me ndryshimin e parameterëve të klasës. и экспериментировать с изменением параметров кластера.
Nëse diçka nuk funksionon, sigurohuni që për problem. Ne do ta zgjidhim shpejt!
Burimi: habr.com
