Mes jau kalbėjome apie
Įdomus? Tada paklausiu po pjūviu, viską papasakosime ir parodysime.
Pradėkime nuo pavyzdžio
Mes apimsime tik dalį savo vaidmens funkcijų. Visada galite rasti išsamų visų jo funkcijų ir įvesties parametrų aprašymą
Tarantool kasetė turi api
и storage
kuriuos galima priskirti egzemplioriams.
Pati kasetė nieko nesako apie tai, kaip pradėti procesus, tik suteikia galimybę konfigūruoti jau veikiančius egzempliorius. Visa kita vartotojas turi padaryti pats: išskaidyti konfigūracijos failus, paleisti paslaugas ir nustatyti topologiją. Bet mes viso to nepadarysime, Ansible padarys tai už mus.
Nuo žodžių prie darbų
Taigi, įdiegkime savo programą dviejose virtualiose mašinose ir nustatykime paprastą topologiją:
- Replicaset
app-1
atliks vaidmenįapi
kuri apima vaidmenįvshard-router
. Čia bus tik vienas atvejis. - replikatas
storage-1
įgyvendina vaidmenįstorage
(ir tuo pačiuvshard-storage
), čia pridedame du egzempliorius iš skirtingų mašinų.
Norėdami paleisti pavyzdį, mums reikia
Pats vaidmuo yra
Klonuokite saugyklą naudodami pavyzdį:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Mes keliame virtualias mašinas:
$ vagrant up
Įdiekite galimą Tarantool kasetę:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Vykdykite įdiegtą vaidmenį:
$ ansible-playbook -i hosts.yml playbook.yml
Laukiame žaidimo knygos vykdymo pabaigos, eikite į
Galite įvesti duomenis. Šaunu, tiesa?
Dabar išsiaiškinkime, kaip su tuo dirbti, ir tuo pačiu metu į topologiją įtraukite kitą kopijų rinkinį.
Pradedame suprasti
Taigi, kas atsitiko?
Sukūrėme dvi virtualiąsias mašinas ir paleidome galimą žaidimų knygą, kuri sukūrė mūsų grupę. Pažiūrėkime į failo turinį 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
Čia nieko įdomaus nevyksta, pradedame ansible-role, kuris vadinamas tarantool.cartridge
.
Visa svarbiausia (būtent klasterio konfigūracija) yra 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:
Viskas, ko mums reikia, yra išmokti valdyti egzempliorius ir kopijas keičiant šio failo turinį. Toliau į jį pridėsime naujų skyrių. Kad nesusipainiotumėte, kur juos pridėti, galite žvilgtelėti į galutinę šio failo versiją, hosts.updated.yml
, kuri yra pavyzdžių saugykloje.
Instancijų valdymas
Kalbant apie Ansible, kiekvienas egzempliorius yra hostas (nepainioti su geležiniu serveriu), t.y. infrastruktūros mazgas, kurį valdys Ansible. Kiekvienam kompiuteriui galime nurodyti ryšio parametrus (pvz., ansible_host
и ansible_user
), taip pat egzemplioriaus konfigūraciją. Atvejų aprašymas yra skyriuje hosts
.
Apsvarstykite egzemplioriaus konfigūraciją storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
Kintamajame config
mes nurodėme egzemplioriaus parametrus - advertise URI
и HTTP port
.
Žemiau pateikiami egzempliorių parametrai app-1
и storage-1-replica
.
Turime pasakyti Ansible kiekvieno atvejo ryšio parametrus. Atrodo logiška sugrupuoti egzempliorius į virtualių mašinų grupes. Norėdami tai padaryti, egzemplioriai sujungiami į grupes. host1
и host2
, ir kiekvienoje skyriaus grupėje vars
vertybes ansible_host
и ansible_user
vienai virtualiai mašinai. Ir skyriuje hosts
- prieglobos (tai yra egzemplioriai), kurie yra įtraukti į šią 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:
Mes pradedame keistis hosts.yml
. Pridėkime dar du atvejus, storage-2-replica
pirmoje virtualioje mašinoje ir storage-2
Antroje:
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: # <==
...
Paleiskite galimą žaidimų knygą:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Atkreipkite dėmesį į parinktį --limit
. Kadangi kiekvienas klasterio egzempliorius yra pagrindinis kompiuteris, kalbant apie Ansible, galime aiškiai nurodyti, kurie egzemplioriai turi būti sukonfigūruoti paleidžiant planą.
Grįžti į žiniatinklio vartotojo sąsają
Neužmigsime ant laurų ir įvaldysime topologijos valdymą.
Topologijos valdymas
Sujungkime naujus egzempliorius į kopiją storage-2
. Pridėti naują grupę replicaset_storage_2
ir jo kintamuosiuose apibūdinkite replikacijos parametrus pagal analogiją su replicaset_storage_1
. Skyriuje hosts
nurodykite, kurie egzemplioriai bus įtraukti į šią grupę (tai yra, mūsų kopijų rinkinys):
---
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:
Vėl pradėkime žaidimų knygą:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
Pagal variantą --limit
šį kartą perdavėme grupės pavadinimą, atitinkantį mūsų repliką.
Apsvarstykite variantą tags
.
Mūsų vaidmuo nuosekliai atlieka įvairias užduotis, kurios yra pažymėtos šiomis žymomis:
cartridge-instances
: egzempliorių valdymas (konfigūravimas, prisijungimas prie narystės);cartridge-replicasets
: topologijos valdymas (replikacijų valdymas ir egzempliorių pašalinimas (pašalinimas) visam laikui iš klasterio);cartridge-config
: valdyti kitus klasterio parametrus (vshard bootstrapping, automatinis perkrovos režimas, autorizacijos parametrai ir programos konfigūracija).
Galime aiškiai nurodyti, kurią darbo dalį norime atlikti, tada vaidmuo praleis likusias užduotis. Mūsų atveju norime dirbti tik su topologija, todėl patikslinome cartridge-replicasets
.
Įvertinkime savo pastangų rezultatą. Ieškoma naujos kopijos
Valio!
Eksperimentuokite iš naujo sukonfigūruodami egzempliorius ir kopijas ir pažiūrėkite, kaip pasikeičia klasterio topologija. Galite išbandyti įvairius veikimo scenarijus, pvz. memtx_memory
. Vaidmuo bandys tai padaryti nepaleisdamas egzemplioriaus iš naujo, kad sumažintų galimą programos prastovą.
Nepamirškite bėgti vagrant halt
kad sustabdytumėte VM, kai baigsite dirbti su jais.
O kas po gaubtu?
Čia pakalbėsiu daugiau apie tai, kas nutiko po ansible vaidmens gaubtu mūsų eksperimentų metu.
Pažvelkime į kasetės programos diegimą žingsnis po žingsnio.
Paketo diegimas ir egzempliorių paleidimas
Pirmiausia turite pristatyti paketą į serverį ir jį įdiegti. Dabar vaidmuo gali dirbti su RPM ir DEB paketais.
Toliau paleidžiame egzempliorius. Čia viskas labai paprasta: kiekvienas atvejis yra atskiras systemd
- paslauga. Aš kalbu apie pavyzdį:
$ systemctl start myapp@storage-1
Ši komanda paleis egzempliorių storage-1
programos myapp
. Pradėtas egzempliorius ieškos jo /etc/tarantool/conf.d/
. Egzempliorių žurnalus galima peržiūrėti naudojant journald
.
Vieneto failas /etc/systemd/system/[email protected]
sisteminei paslaugai bus pristatyta kartu su paketu.
Ansible turi integruotus paketų diegimo ir sisteminių paslaugų valdymo modulius, nieko naujo čia nesugalvojome.
Klasterio topologijos konfigūravimas
Ir čia prasideda įdomiausia. Sutikite, būtų keista vargti su specialiu vaidmeniu diegiant ir paleidžiant paketus systemd
-paslaugos.
Klasterį galite nustatyti rankiniu būdu:
- Pirmoji parinktis: atidarykite žiniatinklio vartotojo sąsają ir spustelėkite mygtukus. Vienkartiniam kelių egzempliorių pradžiai jis yra gana tinkamas.
- Antroji parinktis: galite naudoti GraphQl API. Čia jau galima kažką automatizuoti, pavyzdžiui, parašyti scenarijų Python.
- Trečias variantas (stiprioms dvasiai): eikite į serverį, prisijunkite prie vieno iš naudojamų egzempliorių
tarantoolctl connect
ir atlikti visas reikalingas manipuliacijas su Lua moduliucartridge
.
Pagrindinė mūsų išradimo užduotis yra tai padaryti, sunkiausia darbo dalis jums.
Ansible leidžia jums parašyti savo modulį ir naudoti jį vaidmenyje. Mūsų vaidmuo naudoja šiuos modulius įvairiems klasterio komponentams valdyti.
Kaip tai veikia? Norimą klasterio būseną aprašote deklaratyvioje konfigūracijoje, o vaidmuo kiekvienam moduliui suteikia konfigūracijos skyrių kaip įvestį. Modulis gauna esamą klasterio būseną ir lygina ją su įvestimi. Tada per vieno iš egzempliorių lizdą paleidžiamas kodas, kuris perkelia klasterį į norimą būseną.
rezultatai
Šiandien mes papasakojome ir parodėme, kaip įdiegti programą Tarantool Cartridge ir nustatyti paprastą topologiją. Tam panaudojome Ansible – galingą įrankį, kurį paprasta naudoti ir kuris leidžia vienu metu konfigūruoti daug infrastruktūros mazgų (mūsų atveju tai yra klasterių egzemplioriai).
Aukščiau aptarėme vieną iš daugelio būdų, kaip apibūdinti klasterio konfigūraciją naudojant Ansible. Kai žinote, kad esate pasirengęs judėti toliau, mokykitės group_vars
и host_vars
.
Labai greitai mes jums pasakysime, kaip visam laikui pašalinti (pašalinti) egzempliorius iš topologijos, įkrovos vshard, valdyti automatinį persileidimo režimą, sukonfigūruoti autorizaciją ir pataisyti klasterio konfigūraciją. Tuo tarpu galite mokytis savarankiškai
Jei kažkas neveikia, įsitikinkite
Šaltinis: www.habr.com