Ne kemi folur tashmë për
Interesante? Atëherë ju lutemi, nën prerje, ne do t'ju tregojmë dhe do t'ju tregojmë gjithçka.
Le të fillojmë me një shembull
Ne do të shohim vetëm një pjesë të funksionalitetit të rolit tonë. Gjithmonë mund të gjeni një përshkrim të plotë të të gjitha aftësive dhe parametrave të tij të hyrjes
Fisheku Tarantool ka api
и storage
, të cilat mund t'u caktohen instancave.
Vetë fisheku nuk thotë asgjë për mënyrën e nisjes së proceseve, ai ofron vetëm mundësinë për të konfiguruar instancat tashmë të ekzekutuara. Përdoruesi duhet të bëjë vetë pjesën tjetër: të rregullojë skedarët e konfigurimit, të fillojë shërbimet dhe të konfigurojë topologjinë. Por ne nuk do t'i bëjmë të gjitha këto; Ansible do ta bëjë atë për ne.
Nga fjalët në vepra
Pra, le të vendosim aplikacionin tonë në dy makina virtuale dhe të vendosim një topologji të thjeshtë:
- Replikaset
app-1
do të zbatojë rolinapi
, e cila përfshin rolinvshard-router
. Këtu do të ketë vetëm një rast. - Replikaset
storage-1
zbaton rolinstorage
(dhe në të njëjtën kohëvshard-storage
), këtu do të shtojmë dy instanca nga makina të ndryshme.
Për të ekzekutuar shembullin që na nevojitet
Vetë roli është në
Le të klonojmë depon me një shembull:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Ne krijojmë makina virtuale:
$ vagrant up
Instaloni rolin e duhur të fishekut Tarantool:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Nisni rolin e instaluar:
$ ansible-playbook -i hosts.yml playbook.yml
Ne presim që libri i lojërave të përfundojë ekzekutimin, shkoni te
Mund të ngarkoni të dhëna. E bukur, apo jo?
Tani le të kuptojmë se si të punojmë me këtë, dhe në të njëjtën kohë të shtojmë një grup tjetër kopje në topologji.
Le të fillojmë ta kuptojmë
Pra, çfarë ndodhi?
Ne konfiguruam dy makina virtuale dhe lançuam një libër të paanshëm që konfiguroi grupin 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
Asgjë interesante nuk ndodh këtu, le të lançojmë një rol të besueshëm të quajtur tarantool.cartridge
.
Të gjitha gjërat më të rëndësishme (domethënë, konfigurimi i grupit) janë të vendosura në 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:
Gjithçka që na duhet është të mësojmë se si të menaxhojmë instancat dhe grupet e kopjeve duke ndryshuar përmbajtjen e këtij skedari. Më pas do të shtojmë seksione të reja në të. Për të mos u ngatërruar se ku t'i shtoni ato, mund të shikoni versionin përfundimtar të këtij skedari, hosts.updated.yml
, e cila është në depon e shembullit.
Menaxhimi i shembullit
Në terma Ansible, çdo shembull është një host (që nuk duhet ngatërruar me një server harduer), d.m.th. nyja e infrastrukturës që do të menaxhojë Ansible. Për çdo host ne mund të specifikojmë parametrat e lidhjes (si p.sh ansible_host
и ansible_user
), si dhe konfigurimin e shembullit. Përshkrimi i rasteve është në seksion hosts
.
Le të shohim konfigurimin e shembullit storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
Në variabël config
ne specifikuam parametrat e shembullit - advertise URI
и HTTP port
.
Më poshtë janë parametrat e shembullit app-1
и storage-1-replica
.
Ne duhet t'i tregojmë Ansible parametrat e lidhjes për çdo shembull. Duket logjike të grupohen instancat në grupe të makinave virtuale. Për këtë qëllim, instancat kombinohen në grupe host1
и host2
, dhe në secilin grup në seksion vars
tregohen vlerat ansible_host
и ansible_user
për një makinë virtuale. Dhe në seksion hosts
— hostet (aka raste) që përfshihen në këtë grup:
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:
Ne fillojmë të ndryshojmë hosts.yml
. Le të shtojmë edhe dy raste të tjera, storage-2-replica
në makinën e parë virtuale dhe storage-2
Në të dytën:
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: # <==
...
Hapni librin e lojërave ansible:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Ju lutemi vini re opsionin --limit
. Meqenëse çdo shembull i grupit është një host në termat e Ansible, ne mund të specifikojmë në mënyrë eksplicite se cilat instanca duhet të konfigurohen gjatë ekzekutimit të librit të luajtjes.
Duke u kthyer në ndërfaqen e internetit të uebit
Le të mos ndalemi këtu dhe të zotërojmë menaxhimin e topologjisë.
Menaxhimi i topologjisë
Le të kombinojmë shembujt tanë të rinj në një grup kopjesh storage-2
. Le të shtojmë një grup të ri replicaset_storage_2
dhe përshkruani parametrat e replicaset në variablat e tij në analogji me replicaset_storage_1
. Në seksion hosts
Le të tregojmë se cilat raste do të përfshihen në këtë grup (d.m.th., grupi ynë i kopjeve):
---
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:
Le të fillojmë përsëri librin e lojërave:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
Në parametër --limit
Këtë herë kaluam emrin e grupit që korrespondon me replikaset tonë.
Le të shqyrtojmë opsionin tags
.
Roli ynë kryen në mënyrë sekuenciale detyra të ndryshme, të cilat shënohen me etiketat e mëposhtme:
cartridge-instances
: menaxhimi i shembullit (konfigurimi, lidhja me anëtarësimin);cartridge-replicasets
: menaxhimi i topologjisë (menaxhimi i replikaseteve dhe heqja (përjashtimi) i përhershëm i instancave nga grupi);cartridge-config
: menaxhimi i parametrave të tjerë të grupimit (bootstrapping vshard, modaliteti i dështimit automatik, parametrat e autorizimit dhe konfigurimi i aplikacionit).
Ne mund të specifikojmë në mënyrë eksplicite se cilën pjesë të punës duam të bëjmë, atëherë roli do të kalojë pjesën tjetër të detyrave. Në rastin tonë, ne duam të punojmë vetëm me topologjinë, kështu që ne specifikuam cartridge-replicasets
.
Le të vlerësojmë rezultatin e përpjekjeve tona. Ne gjejmë një replicaset të ri në
Hooray!
Eksperimentoni me ndryshimin e konfigurimit të instancave dhe grupeve të kopjeve dhe shikoni se si ndryshon topologjia e grupimit. Mund të provoni skenarë të ndryshëm operacional, p.sh. memtx_memory
. Roli do të përpiqet ta bëjë këtë pa rifilluar shembullin në mënyrë që të zvogëlojë kohën e mundshme joproduktive të aplikacionit tuaj.
Mos harroni të vraponi vagrant halt
për të ndaluar makinat virtuale kur të keni mbaruar së punuari me to.
Dhe çfarë ka nën kapuç?
Këtu do t'ju tregoj më shumë për atë që po ndodhte nën kapuçin e rolit insible gjatë eksperimenteve tona.
Le të shohim hap pas hapi vendosjen e aplikacionit Cartridge.
Instalimi i paketës dhe fillimi i rasteve
Së pari ju duhet të dorëzoni paketën në server dhe ta instaloni atë. Aktualisht roli mund të funksionojë me paketat RPM dhe DEB.
Më pas nisim instancat. Gjithçka është shumë e thjeshtë këtu: çdo shembull është i veçantë systemd
-shërbim. Unë do t'ju jap një shembull:
$ systemctl start myapp@storage-1
Kjo komandë do të nisë shembullin storage-1
Apps myapp
. Shembulli i nisur do ta kërkojë atë /etc/tarantool/conf.d/
. Regjistrat e shembullit mund të shikohen duke përdorur journald
.
Skedari i njësisë /etc/systemd/system/[email protected]
për shërbimin systemd do të dorëzohet së bashku me paketën.
Ansible ka module të integruara për instalimin e paketave dhe menaxhimin e shërbimeve të sistemit; ne nuk kemi shpikur asgjë të re këtu.
Vendosja e një topologjie grupimi
Këtu fillon argëtimi. Pajtohem, do të ishte e çuditshme të shqetësohesh me një rol të veçantë Ansible për instalimin e paketave dhe ekzekutimin systemd
-shërbimet.
Ju mund ta konfiguroni grupin manualisht:
- Opsioni i parë: hapni Web UI dhe klikoni mbi butonat. Është mjaft i përshtatshëm për një fillim një herë të disa rasteve.
- Opsioni i dytë: mund të përdorni GraphQl API. Këtu tashmë mund të automatizoni diçka, për shembull, të shkruani një skript në Python.
- Opsioni i tretë (për personat me vullnet të fortë): shkoni te serveri, lidheni me një nga rastet duke përdorur
tarantoolctl connect
dhe kryeni të gjitha manipulimet e nevojshme me modulin Luacartridge
.
Detyra kryesore e shpikjes sonë është të bëjmë pikërisht këtë, pjesën më të vështirë të punës për ju.
Ansible ju lejon të shkruani modulin tuaj dhe ta përdorni atë në një rol. Roli ynë përdor module të tilla për të menaxhuar komponentë të ndryshëm të grupimit.
Si punon? Ju përshkruani gjendjen e dëshiruar të grupit në një konfigurim deklarativ dhe roli i siguron secilit modul seksionin e tij të konfigurimit si hyrje. Moduli merr gjendjen aktuale të grupit dhe e krahason atë me atë që është marrë si hyrje. Më pas, një kod lëshohet përmes prizës së njërit prej rasteve, i cili e sjell grupin në gjendjen e dëshiruar.
Rezultatet e
Sot ne treguam dhe treguam se si ta vendosni aplikacionin tuaj në Tarantool Cartridge dhe të vendosni një topologji të thjeshtë. Për ta bërë këtë, ne përdorëm Ansible - një mjet i fuqishëm që është i lehtë për t'u përdorur dhe ju lejon të konfiguroni njëkohësisht shumë nyje infrastrukturore (në rastin tonë, instancat e grupimeve).
Më sipër shikuam një nga mënyrat e shumta për të përshkruar një konfigurim grupi duke përdorur Ansible. Sapo të ndiheni gati për të vazhduar, eksploroni group_vars
и host_vars
.
Shumë shpejt do t'ju tregojmë se si të fshini (përjashtoni) përgjithmonë instancat nga topologjia, të bootstrap vshard, të menaxhoni modalitetin automatik të dështimit, të konfiguroni autorizimin dhe të rregulloni konfigurimin e grupit. Ndërkohë, ju mund të studioni vetë
Nëse diçka nuk funksionon, sigurohuni që
Burimi: www.habr.com