Už sme o tom hovorili
zaujímavé? Potom, prosím, pod strihom vám všetko povieme a ukážeme.
Začnime príkladom
Pozrieme sa len na časť funkčnosti našej role. Kompletný popis všetkých jeho možností a vstupných parametrov vždy nájdete v
Tarantool Cartridge má api
и storage
, ktoré možno priradiť k inštanciám.
Samotná kazeta nehovorí nič o spôsobe spúšťania procesov, poskytuje iba možnosť konfigurácie už spustených inštancií. Používateľ musí urobiť zvyšok sám: usporiadať konfiguračné súbory, spustiť služby a nakonfigurovať topológiu. Ale toto všetko neurobíme; Ansible to urobí za nás.
Od slov k činom
Nasaďme teda našu aplikáciu na dva virtuálne stroje a nastavme jednoduchú topológiu:
- Replikaset
app-1
bude vykonávať roluapi
, ktorá zahŕňa roluvshard-router
. Tu bude len jeden prípad. - Replikaset
storage-1
implementuje rolustorage
(a zároveňvshard-storage
), tu pridáme dve inštancie z rôznych strojov.
Na spustenie príkladu, ktorý potrebujeme
Samotná rola je v
Poďme naklonovať úložisko s príkladom:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Zvyšujeme virtuálne stroje:
$ vagrant up
Nainštalujte príslušnú rolu kazety Tarantol:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Spustite nainštalovanú rolu:
$ ansible-playbook -i hosts.yml playbook.yml
Čakáme, kým sa príručka dokončí, prejdite na stránku
Dáta môžete nahrať. V pohode, však?
Teraz poďme zistiť, ako s tým pracovať, a zároveň pridať do topológie ďalšiu sadu replík.
Začnime to zisťovať
Takže, čo sa stalo?
Nastavili sme dva virtuálne stroje a spustili ansible playbook, ktorý konfiguroval náš klaster. Pozrime sa na obsah súboru 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
Nič zaujímavé sa tu nedeje, spustíme ansible rolu tzv tarantool.cartridge
.
Všetky najdôležitejšie veci (menovite konfigurácia klastra) sú umiestnené v 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:
Všetko, čo potrebujeme, je naučiť sa spravovať inštancie a replikáty zmenou obsahu tohto súboru. Ďalej doň pridáme nové sekcie. Aby ste neboli zmätení, kde ich pridať, môžete sa pozrieť na konečnú verziu tohto súboru, hosts.updated.yml
, ktorý sa nachádza v ukážkovom úložisku.
Správa inštancií
Z hľadiska Ansible je každá inštancia hostiteľom (nezamieňať s hardvérovým serverom), t.j. uzol infraštruktúry, ktorý bude Ansible spravovať. Pre každého hostiteľa môžeme špecifikovať parametre pripojenia (ako napr ansible_host
и ansible_user
), ako aj konfiguráciu inštancie. Popis inštancií je v sekcii hosts
.
Pozrime sa na konfiguráciu inštancie storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
V premennej config
špecifikovali sme parametre inštancie - advertise URI
и HTTP port
.
Nižšie sú uvedené parametre inštancie app-1
и storage-1-replica
.
Musíme Ansible povedať parametre pripojenia pre každú inštanciu. Zdá sa logické zoskupovať inštancie do skupín virtuálnych strojov. Na tento účel sú prípady spojené do skupín host1
и host2
a v každej skupine v sekcii vars
sú uvedené hodnoty ansible_host
и ansible_user
pre jeden virtuálny stroj. A v sekcii hosts
— hostitelia (aka inštancie), ktorí sú zahrnutí v tejto skupine:
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:
Začíname sa meniť hosts.yml
. Pridajme ešte dva prípady, storage-2-replica
na prvom virtuálnom stroji a storage-2
Na druhom:
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: # <==
...
Spustite príručku ansible:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Prosím, poznačte si túto možnosť --limit
. Keďže každá inštancia klastra je hostiteľom v zmysle Ansible, môžeme explicitne špecifikovať, ktoré inštancie by mali byť nakonfigurované pri spustení playbooku.
Prechod späť do webového používateľského rozhrania
Nezastavme sa len pri tom a osvojme si manažment topológie.
Správa topológie
Skombinujme naše nové inštancie do sady replík storage-2
. Pridajme novú skupinu replicaset_storage_2
a opíšte parametre replikovej sady v jej premenných analogicky s replicaset_storage_1
. V sekcii hosts
Označme, ktoré inštancie budú zahrnuté do tejto skupiny (teda do našej sady replík):
---
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:
Začnime znova s príručkou:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
V parametri --limit
Tentoraz sme odovzdali názov skupiny, ktorý zodpovedá našej replike.
Zvážme možnosť tags
.
Naša rola postupne vykonáva rôzne úlohy, ktoré sú označené nasledujúcimi značkami:
cartridge-instances
: správa inštancií (konfigurácia, pripojenie k členstvu);cartridge-replicasets
: správa topológie (správa replikázy a trvalé odstránenie (vylúčenie) inštancií z klastra);cartridge-config
: správa ostatných parametrov klastra (vshard bootstrapping, automatický režim prepnutia, parametre autorizácie a konfigurácia aplikácie).
Môžeme výslovne špecifikovať, ktorú časť práce chceme robiť, potom rola preskočí zvyšok úloh. V našom prípade chceme pracovať len s topológiou, preto sme špecifikovali cartridge-replicasets
.
Zhodnoťme výsledok nášho snaženia. Nájdeme novú replikaset na
Hurá!
Experimentujte so zmenou konfigurácie inštancií a sád replík a uvidíte, ako sa zmení topológia klastra. Môžete si vyskúšať rôzne prevádzkové scenáre, napr. memtx_memory
. Rola sa to pokúsi urobiť bez reštartovania inštancie, aby sa skrátil možný prestoj vašej aplikácie.
Nezabudnite behať vagrant halt
na zastavenie virtuálnych počítačov, keď s nimi skončíte.
A čo je pod kapotou?
Tu vám poviem viac o tom, čo sa dialo pod kapotou ansible role počas našich experimentov.
Pozrime sa na nasadenie aplikácie Cartridge krok za krokom.
Inštalácia balíka a spustenie inštancií
Najprv musíte doručiť balík na server a nainštalovať ho. V súčasnosti môže rola pracovať s balíkmi RPM a DEB.
Ďalej spustíme inštancie. Všetko je tu veľmi jednoduché: každá inštancia je samostatná systemd
-servis. Uvediem príklad:
$ systemctl start myapp@storage-1
Tento príkaz spustí inštanciu storage-1
aplikácie myapp
. Spustená inštancia bude hľadať svoje /etc/tarantool/conf.d/
. Protokoly inštancií je možné zobraziť pomocou journald
.
Súbor jednotky /etc/systemd/system/[email protected]
pre službu systemd bude doručená spolu s balíkom.
Ansible má vstavané moduly na inštaláciu balíkov a správu systemd služieb; tu sme nevymysleli nič nové.
Nastavenie topológie klastra
Tu začína zábava. Súhlasím, bolo by zvláštne obťažovať sa špeciálnou rolou Ansible na inštaláciu balíkov a spustenie systemd
-služby.
Klaster môžete nakonfigurovať manuálne:
- Prvá možnosť: otvorte webové používateľské rozhranie a kliknite na tlačidlá. Je celkom vhodný na jednorazové spustenie niekoľkých inštancií.
- Druhá možnosť: môžete použiť GraphQl API. Tu už môžete niečo zautomatizovať, napríklad napísať skript v Pythone.
- Tretia možnosť (pre silnú vôľu): prejdite na server, pripojte sa k jednej z inštancií pomocou
tarantoolctl connect
a vykonajte všetky potrebné manipulácie s modulom Luacartridge
.
Hlavnou úlohou nášho vynálezu je urobiť presne túto, pre vás najťažšiu časť práce.
Ansible vám umožňuje napísať si vlastný modul a použiť ho v role. Naša úloha využíva takéto moduly na správu rôznych komponentov klastra.
Ako to funguje? Požadovaný stav klastra opíšete v deklaratívnej konfigurácii a rola poskytne každému modulu jeho konfiguračnú sekciu ako vstup. Modul prijíma aktuálny stav klastra a porovnáva ho s tým, čo bolo prijaté ako vstup. Potom sa cez soket jednej z inštancií spustí kód, ktorý privedie klaster do požadovaného stavu.
Výsledky
Dnes sme povedali a ukázali, ako nasadiť vašu aplikáciu do kazety Tarantol a nastaviť jednoduchú topológiu. Na tento účel sme použili Ansible - výkonný nástroj, ktorý sa ľahko používa a umožňuje súčasne konfigurovať mnoho uzlov infraštruktúry (v našom prípade inštancie klastra).
Vyššie sme sa pozreli na jeden z mnohých spôsobov, ako opísať konfiguráciu klastra pomocou Ansible. Keď sa budete cítiť pripravení ísť ďalej, preskúmajte group_vars
и host_vars
.
Čoskoro vám povieme, ako natrvalo odstrániť (vylúčiť) inštancie z topológie, bootstrap vshard, spravovanie automatického režimu zlyhania, konfiguráciu autorizácie a opravu konfigurácie klastra. Medzitým môžete študovať sami
Ak niečo nefunguje, určite
Zdroj: hab.com