Već smo razgovarali o tome
Zanimljivo? Onda pitam ispod reza, sve ćemo ispričati i pokazati.
Počnimo s primjerom
Pokriti ćemo samo dio funkcionalnosti naše uloge. Kompletan opis svih njegovih karakteristika i ulaznih parametara uvijek možete pronaći u
Tarantool Cartridge ima api
и storage
koji se mogu dodijeliti instancama.
Sam Cartridge ne govori ništa o tome kako pokrenuti procese, već samo pruža mogućnost konfiguriranja već pokrenutih instanci. Ostalo korisnik mora učiniti sam: dekomponirati konfiguracijske datoteke, pokrenuti usluge i postaviti topologiju. Ali mi nećemo sve ovo učiniti, Ansible će to učiniti umjesto nas.
Od riječi do djela
Dakle, hajde da postavimo našu aplikaciju na dve virtuelne mašine i postavimo jednostavnu topologiju:
- Replicaset
app-1
će igrati uloguapi
što uključuje uloguvshard-router
. Ovdje će biti samo jedan primjer. - replicaset
storage-1
implementira ulogustorage
(i u isto vremevshard-storage
), ovdje dodajemo dvije instance sa različitih mašina.
Za pokretanje primjera nam je potrebno
Sama uloga jeste
Klonirajte spremište s primjerom:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Podižemo virtuelne mašine:
$ vagrant up
Instalirajte ansible ulogu Tarantool Cartridgea:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Pokrenite instaliranu ulogu:
$ ansible-playbook -i hosts.yml playbook.yml
Čekamo kraj izvođenja knjige, idite na
Možete sipati podatke. Cool, zar ne?
Sada hajde da shvatimo kako da radimo sa ovim i da u isto vreme dodamo još jedan skup replika u topologiju.
Počinjemo da razumemo
Šta se desilo?
Postavili smo dva VM-a i pokrenuli ansible playbook koji je postavio naš klaster. Pogledajmo sadržaj datoteke 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
Ovdje se ne događa ništa zanimljivo, pokrećemo ansible-ulogu, koja se zove tarantool.cartridge
.
Sve najvažnije (naime, konfiguracija klastera) nalazi se u 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:
Sve što trebamo je naučiti kako upravljati instancama i skupovima replika mijenjanjem sadržaja ove datoteke. Zatim ćemo mu dodati nove sekcije. Kako ne biste bili zbunjeni gdje ih dodati, možete zaviriti u konačnu verziju ovog fajla, hosts.updated.yml
, koji se nalazi u spremištu primjera.
Upravljanje instancama
U smislu Ansiblea, svaka instanca je host (ne treba se brkati sa željeznim serverom), tj. infrastrukturni čvor kojim će Ansible upravljati. Za svaki host možemo specificirati parametre veze (npr ansible_host
и ansible_user
), kao i konfiguraciju instance. Opis slučajeva nalazi se u odjeljku hosts
.
Razmotrite konfiguraciju instance storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
U varijablu config
specificirali smo parametre instance - advertise URI
и HTTP port
.
Ispod su parametri instance app-1
и storage-1-replica
.
Moramo reći Ansibleu parametre veze za svaku instancu. Čini se logičnim grupirati instance u grupe virtuelnih mašina. Da biste to učinili, instance se kombiniraju u grupe. host1
и host2
, iu svakoj grupi u odjeljku vars
vrijednosti ansible_host
и ansible_user
za jednu virtuelnu mašinu. I u sekciji hosts
- hostovi (oni su instance) koji su uključeni u ovu grupu:
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:
Počinjemo da se menjamo hosts.yml
. Dodajmo još dvije instance, storage-2-replica
na prvoj virtuelnoj mašini i storage-2
na drugom:
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: # <==
...
Pokreni ansible playbook:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Obratite pažnju na opciju --limit
. Pošto je svaka instanca klastera domaćin u Ansible terminima, možemo eksplicitno odrediti koje instance treba konfigurisati kada se pokreće playbook.
Povratak na web korisničko sučelje
Nećemo ostati na lovorikama i savladaćemo kontrolu topologije.
Upravljanje topologijom
Hajde da spojimo naše nove instance u skup replika storage-2
. Dodajte novu grupu replicaset_storage_2
i opisati u svojim varijablama parametre skupa replika po analogiji sa replicaset_storage_1
. U sekciji hosts
navedite koje će instance biti uključene u ovu grupu (tj. naš skup replika):
---
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:
Počnimo ponovo sa igrokazom:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
Po opciji --limit
ovaj put smo proslijedili ime grupe koja odgovara našem skupu replika.
Razmotrite opciju tags
.
Naša uloga uzastopno obavlja različite zadatke, koji su označeni sljedećim oznakama:
cartridge-instances
: upravljanje instancama (konfiguracija, povezivanje sa članstvom);cartridge-replicasets
: upravljanje topologijom (upravljanje skupovima replika i trajno uklanjanje (izbacivanje) instanci iz klastera);cartridge-config
: upravlja drugim parametrima klastera (vshard bootstrapping, automatski način prelaska na grešku, parametri autorizacije i konfiguracija aplikacije).
Možemo eksplicitno odrediti koji dio posla želimo obaviti, tada će uloga preskočiti ostale zadatke. U našem slučaju želimo da radimo samo sa topologijom, pa smo precizirali cartridge-replicasets
.
Ocijenimo rezultat naših napora. Pronalaženje novog skupa replika
Ura!
Eksperimentirajte s rekonfiguracijom instanci i skupova replika i pogledajte kako se mijenja topologija klastera. Možete isprobati različite operativne scenarije, npr. memtx_memory
. Uloga će pokušati to učiniti bez ponovnog pokretanja instance kako bi smanjila moguće vrijeme zastoja vaše aplikacije.
Ne zaboravi da trčiš vagrant halt
da zaustavite VM-ove kada završite s njima.
Šta je ispod haube?
Ovdje ću govoriti više o tome šta se dešavalo ispod haube ansible uloge tokom naših eksperimenata.
Pogledajmo korak po korak implementaciju aplikacije Cartridge.
Instaliranje paketa i pokretanje instanci
Prvo morate isporučiti paket na server i instalirati ga. Sada uloga može raditi sa RPM i DEB paketima.
Zatim pokrećemo instance. Ovdje je sve vrlo jednostavno: svaka instanca je zasebna systemd
-servis. Govorim o primjeru:
$ systemctl start myapp@storage-1
Ova komanda će pokrenuti instancu storage-1
aplikacije myapp
. Pokrenuta instanca će je potražiti /etc/tarantool/conf.d/
. Dnevnici instance se mogu pregledati pomoću journald
.
Jedinični fajl /etc/systemd/system/[email protected]
za sistemsku uslugu će biti isporučen sa paketom.
Ansible ima ugrađene module za instalaciju paketa i upravljanje systemd servisima, ovdje nismo izmislili ništa novo.
Konfiguriranje topologije klastera
I tu počinje ono najzanimljivije. Slažem se, bilo bi čudno zamarati se posebnom ansible-ulogom za instaliranje paketa i pokretanje systemd
-usluge.
Klaster možete postaviti ručno:
- Prva opcija: otvorite Web UI i kliknite na dugmad. Za jednokratno pokretanje nekoliko slučajeva, sasvim je prikladno.
- Druga opcija: možete koristiti GraphQl API. Ovdje već možete nešto automatizirati, na primjer, napisati skriptu u Pythonu.
- Treća opcija (za jake duhom): idite na server, povežite se na jednu od instanci koristeći
tarantoolctl connect
i izvršite sve potrebne manipulacije sa Lua modulomcartridge
.
Glavni zadatak našeg izuma je da uradimo ovaj, najteži dio posla za vas.
Ansible vam omogućava da napišete vlastiti modul i koristite ga u ulozi. Naša uloga koristi ove module za upravljanje različitim komponentama klastera.
Kako radi? Vi opisujete željeno stanje klastera u deklarativnoj konfiguraciji, a uloga svakom modulu daje njegov odjeljak za konfiguraciju kao ulaz. Modul prima trenutno stanje klastera i upoređuje ga sa ulazom. Zatim se kroz soket jedne od instanci izvodi kod, koji dovodi klaster u željeno stanje.
Ishodi
Danas smo rekli i pokazali kako da implementirate svoju aplikaciju na Tarantool Cartridge i postavite jednostavnu topologiju. Da bismo to učinili, koristili smo Ansible, moćan alat koji je jednostavan za korištenje i koji vam omogućava da istovremeno konfigurirate mnoge infrastrukturne čvorove (u našem slučaju to su instance klastera).
Iznad smo se pozabavili jednim od mnogih načina za opisivanje konfiguracije klastera koristeći Ansible. Kada saznate da ste spremni da krenete dalje, učite group_vars
и host_vars
.
Vrlo brzo ćemo vam reći kako da trajno uklonite (izbacite) instance iz topologije, bootstrap vshard, upravljate automatskim načinom prelaska na greške, konfigurirate autorizaciju i zakrpite konfiguraciju klastera. U međuvremenu, možete sami učiti
Ako nešto ne radi, budite sigurni
izvor: www.habr.com