Wy hawwe it al oer
Nijsgjirrich? Dan asjebleaft, ûnder de besuniging, sille wy jo fertelle en alles sjen litte.
Litte wy begjinne mei in foarbyld
Wy sille allinich sjen nei in diel fan 'e funksjonaliteit fan ús rol. Jo kinne altyd fine in folsleine beskriuwing fan al syn mooglikheden en ynfier parameters yn
Tarantool Cartridge hat api
и storage
, dy't kin wurde tawiisd oan eksimplaren.
Cartridge sels seit neat oer hoe't jo prosessen starte, it biedt allinich de mooglikheid om al rinnende eksimplaren te konfigurearjen. De brûker moat de rest sels dwaan: konfiguraasjebestannen regelje, tsjinsten begjinne en de topology konfigurearje. Mar wy sille dit alles net dwaan; Ansible sil it foar ús dwaan.
Fan wurden oant dieden
Dat, lit ús ús applikaasje ynsette op twa firtuele masines en in ienfâldige topology ynstelle:
- Replikaset
app-1
sil de rol útfiereapi
, dy't de rol omfettetvshard-router
. D'r sil hjir mar ien eksimplaar wêze. - Replikaset
storage-1
útfiert de rolstorage
(en tagelykvshard-storage
), hjir sille wy twa eksimplaren tafoegje fan ferskate masines.
Om it foarbyld út te fieren moatte wy
De rol sels is yn
Litte wy it repository klone mei in foarbyld:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Wy ferheegje firtuele masines:
$ vagrant up
Ynstallearje de Tarantool Cartridge ansible rol:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Starte de ynstallearre rol:
$ ansible-playbook -i hosts.yml playbook.yml
Wy wachtsje op it playbook om de útfiering te foltôgjen, gean nei
Jo kinne gegevens uploade. Cool, krekt?
Litte wy no útfine hoe't jo hjirmei wurkje, en tagelyk in oare replika-set tafoegje oan 'e topology.
Litte wy begjinne om it út te finen
Dus wat barde der?
Wy sette twa firtuele masines yn en lansearre in ansible playbook dat konfigurearre ús kluster. Litte wy nei de ynhâld fan it bestân sjen 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
Der bart hjir neat nijsgjirrichs, lit ús in oanwêzige rol lansearje neamd tarantool.cartridge
.
Alle wichtichste dingen (nammentlik de klusterkonfiguraasje) lizze yn 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:
Alles wat wy nedich binne is om te learen hoe't jo eksimplaren en replikasets kinne beheare troch de ynhâld fan dit bestân te feroarjen. Folgjende sille wy nije seksjes tafoegje. Om net betize te wurden wêr't jo se tafoegje kinne, kinne jo de definitive ferzje fan dit bestân besjen, hosts.updated.yml
, dat is yn it foarbyld repository.
Ynstânsje behear
Yn Ansible termen, elke eksimplaar is in host (net te betiizjen mei in hardware tsjinner), d.w.s. de ynfrastruktuer knooppunt dat Ansible sil beheare. Foar elke host kinne wy ferbiningsparameters opjaan (lykas ansible_host
и ansible_user
), lykas ek de eksimplaarkonfiguraasje. Beskriuwing fan eksimplaren is yn 'e seksje hosts
.
Litte wy nei de eksimplaarkonfiguraasje sjen storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
Yn fariabele config
wy spesifisearje de eksimplaarparameters - advertise URI
и HTTP port
.
Hjirûnder binne de eksimplaarparameters app-1
и storage-1-replica
.
Wy moatte Ansible de ferbiningsparameters foar elke eksimplaar fertelle. It liket logysk om eksimplaren te groepearjen yn groepen fan firtuele masines. Foar dit doel wurde eksimplaren kombinearre yn groepen host1
и host2
, en yn elke groep yn 'e seksje vars
wearden wurde oanjûn ansible_host
и ansible_user
foar ien firtuele masine. En yn 'e seksje hosts
- hosts (aka eksimplaren) dy't binne opnaam yn dizze groep:
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:
Wy begjinne te feroarjen hosts.yml
. Litte wy noch twa eksimplaren tafoegje, storage-2-replica
op de earste firtuele masine en storage-2
Op de twadde:
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: # <==
...
Iepenje it ansible playbook:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Let op de opsje --limit
. Sûnt elke klustereksimplaar is in host yn Ansible termen, kinne wy eksplisyt oantsjutte hokker eksimplaren moatte wurde konfigurearre by it útfieren fan it playbook.
Gean werom nei de Web UI
Litte wy dêr net ophâlde en topologybehear behearskje.
Topology behear
Litte wy ús nije eksimplaren kombinearje yn in replika-set storage-2
. Litte wy in nije groep tafoegje replicaset_storage_2
en beskriuwe de replikaset parameters yn syn fariabelen troch analogy mei replicaset_storage_1
. Yn seksje hosts
Litte wy oanjaan hokker eksimplaren sille wurde opnommen yn dizze groep (dat is ús replika-set):
---
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:
Litte wy it playbook opnij begjinne:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
Yn parameter --limit
Dizze kear hawwe wy de namme trochjûn fan 'e groep dy't oerienkomt mei ús replikaset.
Litte wy de opsje beskôgje tags
.
Us rol fiert sequentieel ferskate taken út, dy't binne markearre mei de folgjende tags:
cartridge-instances
: eksimplaarbehear (konfiguraasje, ferbining mei lidmaatskip);cartridge-replicasets
: topologybehear (repliksetbehear en permaninte fuortheljen (ferdriuwe) fan eksimplaren út it kluster);cartridge-config
: behear fan oare kluster parameters (vshard bootstrapping, automatyske failover modus, autorisaasje parameters en applikaasje konfiguraasje).
Wy kinne eksplisyt oanjaan hokker diel fan it wurk wy wolle dwaan, dan sil de rol de rest fan 'e taken oerslaan. Yn ús gefal wolle wy allinich wurkje mei de topology, dus hawwe wy spesifisearre cartridge-replicasets
.
Litte wy it resultaat fan ús ynspanningen evaluearje. Wy fine in nije replikaset op
Hoera!
Eksperimintearje mei it feroarjen fan de konfiguraasje fan eksimplaren en replika-sets en sjoch hoe't de klustertopology feroaret. Jo kinne ferskate operasjonele senario's besykje, bgl. memtx_memory
. De rol sil besykje dit te dwaan sûnder de eksimplaar opnij te begjinnen om de mooglike downtime fan jo applikaasje te ferminderjen.
Ferjit net te rinnen vagrant halt
om de firtuele masines te stopjen as jo klear binne mei wurkjen mei har.
En wat is ûnder de kap?
Hjir sil ik jo mear fertelle oer wat der barde ûnder de kap fan 'e ansible rol tidens ús eksperiminten.
Litte wy stap foar stap sjen nei it ynsetten fan de Cartridge-applikaasje.
It pakket ynstallearje en eksimplaren begjinne
Earst moatte jo it pakket oan 'e tsjinner leverje en it ynstallearje. Op it stuit kin de rol wurkje mei RPM- en DEB-pakketten.
Folgjende lansearje wy de eksimplaren. Alles is hjir hiel ienfâldich: elke eksimplaar is in apart systemd
-betsjinning. Ik sil jo in foarbyld jaan:
$ systemctl start myapp@storage-1
Dit kommando sil it eksimplaar starte storage-1
apps myapp
. De lansearre eksimplaar sil sykje nei syn /etc/tarantool/conf.d/
. Instance logs kinne wurde besjoen mei help journald
.
Unit triem /etc/systemd/system/[email protected]
foar systemd tsjinst wurdt levere tegearre mei it pakket.
Ansible hat ynboude modules foar it ynstallearjen fan pakketten en it behearen fan systemd tsjinsten; wy hawwe hjir neat nij útfûn.
It opsetten fan in klustertopology
Dit is wêr't de wille begjint. Iens, it soe nuver wêze om te bemuoien mei in spesjale Ansible-rol foar it ynstallearjen fan pakketten en it útfieren systemd
-tsjinsten.
Jo kinne it kluster manuell konfigurearje:
- Earste opsje: iepenje de Web UI en klikje op de knoppen. It is hiel geskikt foar in ienmalige start fan ferskate eksimplaren.
- Twadde opsje: jo kinne de GraphQl API brûke. Hjir kinne jo al wat automatisearje, bygelyks in skript skriuwe yn Python.
- Tredde opsje (foar de sterke wil): gean nei de tsjinner, ferbine mei ien fan 'e eksimplaren dy't brûke
tarantoolctl connect
en fiere alle nedige manipulaasjes mei de Lua modulecartridge
.
De wichtichste taak fan ús útfining is om krekt dit te dwaan, it dreechste diel fan it wurk foar jo.
Ansible lit jo jo eigen module skriuwe en it yn in rol brûke. Us rol brûkt sokke modules om ferskate klusterkomponinten te behearjen.
Hoe't it wurket? Jo beskriuwe de winske steat fan it kluster yn in declarative config, en de rol jout elke module mei syn konfiguraasje seksje as ynfier. De module ûntfangt de aktuele steat fan it kluster en fergeliket it mei wat waard ûntfongen as ynfier. Dêrnei wurdt in koade lansearre troch de socket fan ien fan 'e eksimplaren, dy't it kluster nei de winske steat bringt.
Resultaten
Hjoed hawwe wy ferteld en lieten sjen hoe't jo jo applikaasje kinne ynsette op Tarantool Cartridge en in ienfâldige topology ynstelle. Om dit te dwaan hawwe wy Ansible brûkt - in krêftich ark dat maklik te brûken is en jo tagelyk in protte ynfrastruktuerknooppunten kinne konfigurearje (yn ús gefal klustereksimplaren).
Hjirboppe seagen wy ien fan 'e protte manieren om in klusterkonfiguraasje te beskriuwen mei Ansible. Sadree't jo fiele ree om fierder te gean, ferkenne group_vars
и host_vars
.
Hiel gau sille wy jo fertelle hoe't jo eksimplaren permanint wiskje (ferdriuwe) út 'e topology, bootstrap vshard, automatyske failover-modus beheare, autorisaasje ynstelle en de klusterkonfiguraasje patchje. Yn 'e tuskentiid kinne jo sels studearje
As der wat net wurket, wês dan wis
Boarne: www.habr.com