Smo že govorili o
zanimivo? Potem vprašam pod rezom, vse bomo povedali in pokazali.
Začnimo s primerom
Zajeli bomo le del funkcionalnosti naše vloge. Popoln opis vseh njegovih funkcij in vhodnih parametrov lahko vedno najdete v
Tarantool Cartridge ima api
и storage
ki jih je mogoče dodeliti primerkom.
Sama kartuša ne pove ničesar o tem, kako zagnati procese, ponuja le možnost konfiguriranja že delujočih primerkov. Ostalo mora uporabnik narediti sam: razstaviti konfiguracijske datoteke, zagnati storitve in nastaviti topologijo. A vsega tega ne bomo storili mi, namesto nas bo to naredil Ansible.
Od besed k dejanjem
Razmestimo torej našo aplikacijo na dva virtualna stroja in nastavimo preprosto topologijo:
- Replicaset
app-1
bo igral vlogoapi
ki vključuje vlogovshard-router
. Tukaj bo samo en primer. - replikaset
storage-1
izvaja vlogostorage
(in hkrativshard-storage
), tukaj dodamo dva primerka iz različnih strojev.
Za izvedbo primera potrebujemo
Sama vloga je
Klonirajte repozitorij s primerom:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Vzgajamo virtualne stroje:
$ vagrant up
Namestite Tarantool Cartridge ansible vlogo:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Zaženite nameščeno vlogo:
$ ansible-playbook -i hosts.yml playbook.yml
Čakamo na konec izvajanja playbooka, pojdite na
Lahko vnesete podatke. Kul, kajne?
Zdaj pa ugotovimo, kako delati s tem, in hkrati topologiji dodamo še en niz replik.
Začnemo razumeti
Torej kaj se je zgodilo?
Imamo dva navidezna računalnika, ki izvajata ansible playbook, ki je postavil našo gručo. Poglejmo vsebino 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
Tu se ne zgodi nič zanimivega, zaženemo ansible-role, ki se imenuje tarantool.cartridge
.
Vse najpomembnejše (namreč konfiguracija gruče) se nahaja 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:
Vse, kar se moramo naučiti, je, kako upravljati primerke in nabore replikatov s spreminjanjem vsebine te datoteke. Nato mu bomo dodali nove razdelke. Da se ne boste zmedli, kam jih dodati, lahko pokukate v končno različico te datoteke, hosts.updated.yml
, ki je v repozitoriju primerov.
Upravljanje primerkov
V smislu Ansible je vsak primerek gostitelj (ne smemo ga zamenjevati z železnim strežnikom), tj. infrastrukturno vozlišče, ki ga bo upravljal Ansible. Za vsakega gostitelja lahko določimo parametre povezave (kot npr ansible_host
и ansible_user
), kot tudi konfiguracijo primerka. Opis primerov je v razdelku hosts
.
Upoštevajte konfiguracijo primerka storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
V spremenljivki config
določili smo parametre instance - advertise URI
и HTTP port
.
Spodaj so parametri primerka app-1
и storage-1-replica
.
Ansibleu moramo povedati parametre povezave za vsak primerek. Zdi se logično združiti primerke v skupine virtualnih strojev. Da bi to naredili, so primerki združeni v skupine. host1
и host2
, in v vsaki skupini v razdelku vars
vrednote ansible_host
и ansible_user
za en virtualni stroj. In v razdelku hosts
- gostitelji (so primerki), ki so vključeni v to skupino:
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čnemo se spreminjati hosts.yml
. Dodajmo še dva primera, storage-2-replica
na prvem virtualnem stroju in storage-2
Na drugem:
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: # <==
...
Zaženi ansible playbook:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Bodite pozorni na možnost --limit
. Ker je vsak primerek gruče gostitelj v smislu Ansible, lahko eksplicitno določimo, kateri primerki naj bodo konfigurirani pri izvajanju priročnika.
Nazaj na spletni uporabniški vmesnik
Ne bomo spali na lovorikah in bomo obvladali nadzor topologije.
Upravljanje topologije
Združimo naše nove primerke v replikaset storage-2
. Dodajte novo skupino replicaset_storage_2
in v svojih spremenljivkah opiše parametre nabora replik po analogiji z replicaset_storage_1
. V razdelku hosts
določite, kateri primerki bodo vključeni v to skupino (to je naš nabor replik):
---
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čnimo znova z igro:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
Po možnosti --limit
tokrat smo posredovali ime skupine, ki ustreza našemu replikasetu.
Razmislite o možnosti tags
.
Naša vloga zaporedno opravlja različne naloge, ki so označene z naslednjimi oznakami:
cartridge-instances
: upravljanje instanc (konfiguracija, povezava s članstvom);cartridge-replicasets
: upravljanje topologije (upravljanje replikaseta in trajno odstranjevanje (izgon) instanc iz gruče);cartridge-config
: upravljanje drugih parametrov gruče (vshard bootstrapping, način samodejnega preklopa, avtorizacijski parametri in konfiguracija aplikacije).
Izrecno lahko določimo, kateri del dela želimo opraviti, potem bo vloga preskočila preostale naloge. V našem primeru želimo delati samo s topologijo, zato smo določili cartridge-replicasets
.
Ocenimo rezultat naših prizadevanj. Iskanje novega niza replik
Hura!
Eksperimentirajte s ponovnim konfiguriranjem primerkov in replikasetov in si oglejte, kako se spreminja topologija gruče. Preizkusite lahko različne scenarije delovanja, npr. memtx_memory
. Vloga bo poskušala to storiti brez ponovnega zagona instance, da bi zmanjšala morebitne izpade vaše aplikacije.
Ne pozabi teči vagrant halt
da zaustavite VM, ko končate z njimi.
In kaj je pod pokrovom?
Tukaj bom govoril več o tem, kaj se je zgodilo pod pokrovom vloge ansible med našimi poskusi.
Oglejmo si korak za korakom uvajanje aplikacije Cartridge.
Namestitev paketa in zagon primerkov
Najprej morate paket dostaviti na strežnik in ga namestiti. Zdaj lahko vloga deluje s paketi RPM in DEB.
Nato zaženemo primerke. Tukaj je vse zelo preprosto: vsak primer je ločen systemd
- storitev. Govorim o primeru:
$ systemctl start myapp@storage-1
Ta ukaz bo zagnal primerek storage-1
aplikacije myapp
. Zagnani primerek bo iskal svoj /etc/tarantool/conf.d/
. Dnevnike primerkov si lahko ogledate z uporabo journald
.
Datoteka enote /etc/systemd/system/[email protected]
za storitev systemd bo dostavljena s paketom.
Ansible ima vgrajene module za namestitev paketov in upravljanje s storitvami systemd, tukaj nismo izumili nič novega.
Konfiguriranje topologije gruče
In tu se začne najbolj zanimivo. Se strinjate, čudno bi bilo, če bi se obremenjevali s posebno ansible-role za namestitev paketov in zagon systemd
-storitve.
Настроить кластер можно вручную:
- Prva možnost: odprite spletni uporabniški vmesnik in kliknite gumbe. Za enkraten zagon več primerkov je zelo primeren.
- Druga možnost: uporabite lahko GraphQl API. Tukaj lahko že nekaj avtomatizirate, na primer napišete skript v Pythonu.
- Tretja možnost (za močne v duhu): pojdite na strežnik, se povežite z enim od primerkov z uporabo
tarantoolctl connect
in izvedite vse potrebne manipulacije z modulom Luacartridge
.
Glavna naloga našega izuma je opraviti ta, najtežji del dela za vas.
Ansible vam omogoča, da napišete svoj modul in ga uporabite v vlogi. Naša vloga uporablja te module za upravljanje različnih komponent gruče.
Kako deluje? Želeno stanje gruče opišete v deklarativni konfiguraciji, vloga pa daje vsakemu modulu svoj razdelek konfiguracije kot vhod. Modul prejme trenutno stanje gruče in ga primerja z vhodom. Nato se skozi vtičnico ene od instanc požene koda, ki pripelje gručo v želeno stanje.
Rezultati
Danes smo povedali in pokazali, kako razmestiti svojo aplikacijo na Tarantool Cartridge in nastaviti preprosto topologijo. Za to smo uporabili Ansible, zmogljivo orodje, ki je enostavno za uporabo in omogoča hkratno konfiguracijo več infrastrukturnih vozlišč (v našem primeru so to primerki gruče).
Zgoraj smo obravnavali enega od mnogih načinov za opis konfiguracije gruče z uporabo Ansible. Ko veste, da ste pripravljeni nadaljevati, se učite group_vars
и host_vars
.
Zelo kmalu vam bomo povedali, kako trajno odstraniti (izgnati) primerke iz topologije, zagnati vshard, upravljati način samodejnega preklopa, konfigurirati avtorizacijo in popraviti konfiguracijo gruče. Medtem se lahko učite sami
Če nekaj ne deluje, se prepričajte
Vir: www.habr.com