
Oleme juba rÀÀkinud , mis vĂ”imaldab arendada ja pakkida jaotatud rakendusi. JÀÀnud on veel vaid Ă”ppida, kuidas neid rakendusi juurutada ja nendega töötada. Ărge muretsege, me oleme kĂ”ik ette nĂ€inud! Oleme kokku kogunud kĂ”ik parimad tavad Tarantool Cartridge'i kasutamiseks ja kirjutanud , mis paigaldab paketi serveritele, kĂ€ivitab instantsid, ĂŒhendab need klastriks, seadistab autoriseerimise, bootstrab vshard'i, lubab automaatse viivituse ja vĂ€rskendab klastri konfiguratsiooni.
Huvitav? Siis tulge edasi, rÀÀgime ja nÀitame kÔike.
Alustame nÀitest
KÀsitleme ainult osa meie rolli funktsionaalsusest. TÀieliku kirjelduse kÔikidest selle vÔimalustest ja sisendparameetritest leiate alati . Kuid parem on kord proovida, kui sada korda nÀha, seega lÀhme ja juurutame vÀikese rakenduse.
Tarantool Cartridge'il on nÀide vÀikese Cartridge-rakenduse loomiseks, mis salvestab teavet panga klientide ja nende kontode kohta ning pakub API-t andmete haldamiseks lÀbi HTTP. Selleks kirjeldatakse rakenduses kahte vÔimalikku rolle: api ja salvestusruum, mis vÔivad omistada instantsidele.
Ise Cartridge ei ĂŒtle midagi protsesside kĂ€ivitamise kohta, ta ainult vĂ”imaldab juba kĂ€ivitatud instantside seadistamist. ĂlejÀÀnud peab kasutaja ise tegema: konfigureerimisfailid paigutama, teenuseid kĂ€ivitama ja topoloogiat seadistama. Kuid me ei pea selle kĂ”igega tegelema, Ansible teeb meie eest.
Tegemist on asjadega
Nii et juurutame meie rakenduse kahele virtuaalmasinale ja seadistame lihtsa topoloogia:
- Replikasett
app-1rakendab rolliapi, mis sisaldab rollivshard-router. Siin on ainult ĂŒks instants. - Replikasett
storage-1rakendab rollisalvestusruum(ja samal ajalvshard-storage), siia lisame kaks instantsit erinevatelt masinatelt.

NÀite kÀivitamiseks vajame ja (versioon 2.8 vÔi vanem).
Ise roll asub . See on hoidla, mis vÔimaldab jagada oma arengutöid ja kasutada valmis rolle.
Kloonime nÀidise hoidla:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0KĂ€ivitame virtuaalmasinad:
$ vagrant upPaigaldame ansible-rolle Tarantool Cartridge:
$ ansible-galaxy install tarantool.cartridge,1.0.1KĂ€ivitame paigaldatud rolli:
$ ansible-playbook -i hosts.yml playbook.ymlOotame mÀnguplaani tÀitmise lÔppu, liikume edasi ja naudime tulemust:

Saame andmeid voolata. Lahe, eks?
NĂŒĂŒd hakkame aru saama, kuidas sellega töötada, ja lisame samal ajal veel ĂŒhe replikaatsarja topoloogiasse.
Hakkame uurima
Niisiis, mis juhtus?
Me tĂ”stsime ĂŒles kaks virtuaalmasinat ja jooksutasime ansiblei mĂ€ngu, mis seadistab meie klastrit. Vaatame faili sisu 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.cartridgeSiin ei toimub midagi huvitavat, kÀivitame ansiblei rolli, mis nimetatakse tarantool.cartridge.
KÔik tÀhtsam (nimelt, klastrikonfiguratsioon) asub -failis 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:KÔik, mida vajame, on Ôppida hallata instantsse ja replikaatsarju, muutes selle faili sisu. Edasi lisame sellesse uusi sektsioone. Et mitte segadusse minna, kuhu neid lisada, vÔite piiluda selle faili lÔppversiooni hosts.updated.yml, mis asub nÀidisrepozitarius.
Instantside haldamine
Ansible'i terminoloogias on iga instants host (mitte segi ajada fĂŒĂŒsilise serveriga), st infrastruktuuri sĂ”lme, mida Ansible haldab. Iga hosti puhul saame mÀÀrata ĂŒhendusparameetrid (nt ansible_host ja ansible_user), ja ka instantsi konfiguratsioon. Instantside kirjeldus asub jaotises hostid.
Vaadakem instantsi konfiguratsiooni storage-1:
kÔik:
muutuja:
...
# INSTANSDID
hostid:
storage-1:
konfiguratsioon:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...Mu variables failist, saadab need andmed serverisse oleme mÀÀranud instantsi parameetrid â advertise URI ja HTTP port.
Allpool on instantside parameetrid app-1 ja storage-1-replica.
Peame Ansiblele edastama ĂŒhenduse parameetrid iga instantsi jaoks. Tundub loogiline gruppida instantsid virtuaalmasinate kaupa. Selle jaoks on instantsid grupeeritud host1 ja host2, ja igas grupis jaotises muutuja on mÀÀratud vÀÀrtused ansible_host ja ansible_user ĂŒhe virtuaalmasina jaoks. Ja jaotises hostid â hostid (mis on ka instantsid), mis kuuluvad sellesse gruppi:
kÔik:
muutuja:
...
hostid:
...
lapsed:
# GRUPPEERI INSTANSDID MASINATE KAUPA
host1:
muutuja:
# esimese masina ĂŒhendamise vĂ”imalused
ansible_host: 172.19.0.2
ansible_user: vagrant
hostid: # instantsid, mis kÀivitatakse esimesel masinal
storage-1:
host2:
muutuja:
# teise masina ĂŒhendamise vĂ”imalused
ansible_host: 172.19.0.3
ansible_user: vagrant
hostid: # instantsid, mis kÀivitatakse teisel masinal
app-1:
storage-1-replica:Alustame muutmist hosts.yml. Lisame veel kaks instantsi, storage-2-replica esimesel virtuaalmasinal ja storage-2 teisel:
kÔik:
muutuja:
...
# INSTANSDID
hostid:
...
storage-2: # <==
konfiguratsioon:
advertise_uri: '172.19.0.3:3303'
http_port: 8184
storage-2-replica: # <==
konfiguratsioon:
advertise_uri: '172.19.0.2:3302'
http_port: 8185
lapsed:
# GRUPPEERI INSTANSDID MASINATE KAUPA
host1:
muutuja:
...
hostid: # instantsid, mis kÀivitatakse esimesel masinal
storage-1:
storage-2-replica: # <==
host2:
muutuja:
...
hostid: # instantsid, mis kÀivitatakse teisel masinal
app-1:
storage-1-replica:
storage-2: # <==
...KĂ€ivitage ansible-playbook:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.ymlPöörake tÀhelepanu valikule --limit. Kuna iga klastrite instants on Ansible'i mÔisted host, vÔime selgelt nÀidata, milliseid instantsse tuleb seadistada playbooki kÀitamisel.
Siseneme taas Web UI-sse ja vaatame meie uusi instantsse:

Ărme jÀÀge saavutatu juurde ja Ă”ppigem tutvustama topoloogiat.
Topoloogia haldamine
Kombineerime meie uued instantsid replikakomplekti storage-2. Lisame uue grupi replicaset_storage_2 ja kirjeldame tema muutujates replikakomplekti parameetreid sarnaselt replicaset_storage_1. Sektsioonis hostid mÀÀra, millised instantsid kuuluvad sellesse gruppi (st meie replikakomplekti):
---
all:
vars:
...
hosts:
...
children:
...
# RĂHMA INSTANTSID KLOONIDE KAUDEL
...
replicaset_storage_2: # <==
vars: # replikaseti konfiguratsioon
replicaset_alias: storage-2
weight: 2
failover_priority:
- storage-2
- storage-2-replica
roles:
- 'storage'
hosts: # replikaseti instantsid
storage-2:
storage-2-replica:KÀivitame mÀnguaktiivi uuesti:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.ymlParameeter --limit sellel korral edastame grupi nime, mis vastab meie replikasetile.
Vaatame valikut tags.
Meie roll tĂ€idab jĂ€rjest erinevaid ĂŒlesandeid, millel on jĂ€rgmised sildid:
cartridge-instances: instantside haldamine (seadistamine, ĂŒhendamine membershipiga);cartridge-replicasets: topoloogia haldamine (replikasettide haldamine ja instantside pöördumatud eemaldamine (expel) klastrist);cartridge-config: teiste klastriparametrite haldamine (vshard bootstrapping, automaatse failoveri reĆŸiim, autentimise parameetrid ja rakenduse konfiguratsioon).
Me saame selgesĂ”naliselt mÀÀrata, millist osa tööst tahame teha, siis roll jĂ€tab tĂ€itmata ĂŒlejÀÀnud ĂŒlesanded. Meie juhul tahame töötada ainult topoloogiaga, seega mÀÀrasime cartridge-replicasets.
Hinnakem meie pingutuste tulemust. Otsime uut replikaseti .

Jee!
Katsuge muuta instantside ja replikasettide konfiguratsiooni ja vaadake, kuidas klassi topoloogia muutub. Saate proovida erinevaid operatsiooniskeeme, nĂ€iteks vĂ”i suurendamine memtx_memory. Roll pĂŒĂŒab seda teha ilma instantsi taaskĂ€ivitamiseta, et vĂ€hendada teie rakenduse vĂ”imaliku seisaku aega.
Ărge unustage kĂ€ivitada vagrant halt, et peatada virtuaalmasinad, kui olete nendega töötamise lĂ”petanud.
Aga mis on kapoti all?
Siin kirjeldan lÀhemalt, mis toimus ansible-rolli all meie katsete ajal.
Vaatame samm-sammult, kuidas Cartridge-rakendust paigaldada.
Paketi installimine ja instantside kÀivitamine
Esiteks tuleb pakett serverisse toimetada ja see installida. Praegu oskab roll töötada RPM- ja DEB-pakettidega.
SeejÀrel kÀivitame instantsid. Siin on kÔik vÀga lihtne: iga instants on eraldi systemd-teenus. Selgitan nÀite abil:
$ systemctl start myapp@storage-1See kÀsk kÀivitab instantsi storage-1 rakenduse myapp. KÀivitatud instants otsib oma ja /etc/tarantool/conf.d/. Instantsi logisid saab vaadata abil journald.
Unit-fail /etc/systemd/system/myapp@.sevice systemd-teenuse jaoks toimetatakse koos paketiga.
Ansible'il on integreeritud moodulid pakettide installimiseks ja systemd teenuste haldamiseks, siin me ei ole midagi uut vÀlja mÔelnud.
Klastri topoloogia seadistamine
Siit hakkab kÔige huvitavam osa pihta. Oli ju kummaline kasutada erilist ansible-rolli pakettide installimiseks ja kÀivitamiseks systemd-teenustest.
Klastri saab seadistada kÀsitsi:
- Esimene variant: avame Veebi kasutajaliidese ja vajutame nuppudele. Ăhe korraga mitme instantsi kĂ€ivitamiseks sobib tĂ€iesti.
- Teine variant: saate kasutada GraphQl API-d. Siin saab automatiseerida nÀiteks kirjutada Pythonis skripti.
- Kolmas variant (vĂ”imsatele vaimudele): logime sisse serverisse, ĂŒhendame ĂŒhe instantsiga kasutades
tarantoolctl connectja teeme kÔik vajalikud manipulatsioonid Lua mooduligacartridge.
Meie leiutamise peamine eesmÀrk on teha just see, kÔige keerulisem osa tööst, teie eest.
Ansible vÔimaldab kirjutada oma mooduli ja kasutada seda rollis. Meie roll kasutab selliseid mooduleid klastrite erinevate komponentide haldamiseks.
Kuidas see töötab? Te kirjeldate soovitud klastriseisundit deklaratiivselt konfigureerimises, ja roll edastab igale moodulile vastava konfiguratsioonisegmendi. Moodul saab klastrist hetkeseisundi ja vĂ”rdleb seda selle sisendiga. SeejĂ€rel kĂ€ivitab ĂŒhe instantsi socketi kaudu koodi, mis viib klastrit soovitud seisundisse.
Summary
TÀna rÀÀkisime ja nÀitasime, kuidas teie rakendust Tarantool Cartridge'il kasutada ja seadistada lihtne topoloogia. Selleks kasutasime Ansible't - vÔimekat tööriista, mis on kasutamise poolest lihtne ja vÔimaldab korraga seadistada palju infrastruktuuri sÔlmi (meie puhul on need klastrite instantsid).
Ălal oleme tutvunud ĂŒhe paljude viisidega klastrikonfiguratsiooni kirjeldamiseks Ansible abil. Niipea kui olete valmis edasi liikuma, uurige pleikide kirjutamiseks. VĂ”imalik, et teil on mugavam hallata topoloogiat kasutades group_vars ja host_vars.
KĂ€esoleval ajal rÀÀgime, kuidas alates klastrist jÀÀdavalt eemaldada (expel) instantsid topoloogiast, bootstrappida vshard, hallata automaatse failover'i reĆŸiimi, seadistada autoriseerimist ja patchida klastrikonfi. Ja seni vĂ”ite iseseisvalt uurida. ja katsetada klastriparameetrite muutmist.
Kui midagi ei tööta, kindlasti meile probleemist. Lahendame selle kiiresti!
Allikas: habr.com
