Már beszéltünk róla
Érdekes? Akkor kérem, a vágás alatt mindent elmondunk és megmutatunk.
Kezdjük egy példával
Csak szerepünk funkcionalitásának egy részét nézzük meg. Mindig megtalálja az összes képességének és bemeneti paraméterének teljes leírását
A Tarantool kazettában van api
и storage
, amely példányokhoz rendelhető.
Maga a kazetta nem mond semmit a folyamatok elindításának módjáról, csak a már futó példányok konfigurálására ad lehetőséget. A többit a felhasználónak magának kell elvégeznie: el kell rendeznie a konfigurációs fájlokat, elindítani a szolgáltatásokat és konfigurálnia a topológiát. De mindezt nem mi tesszük meg; az Ansible megteszi helyettünk.
A szavaktól a tettekig
Tehát telepítsük alkalmazásunkat két virtuális gépre, és állítsunk be egy egyszerű topológiát:
- Replicaset
app-1
végrehajtja a szerepetapi
, amely magában foglalja a szerepetvshard-router
. Itt csak egy példa lesz. - Replicaset
storage-1
végrehajtja a szerepetstorage
(és ugyanakkorvshard-storage
), itt hozzáadunk két példányt különböző gépekről.
A példa futtatásához szükségünk van
Maga a szerep benne van
Klónozzuk a tárolót egy példával:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Virtuális gépeket emelünk:
$ vagrant up
Telepítse a Tarantool kazettát egy lehetséges szerepkörben:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Indítsa el a telepített szerepet:
$ ansible-playbook -i hosts.yml playbook.yml
Megvárjuk, amíg a játékkönyv befejezi a végrehajtást, menjen a következőre
Adatokat tölthet fel. Menő, igaz?
Most nézzük meg, hogyan dolgozhatunk ezzel, és egyidejűleg adjunk hozzá egy másik replikakészletet a topológiához.
Kezdjük kitalálni
Szóval mi történt?
Beállítottunk két virtuális gépet, és elindítottunk egy lehetséges játékkönyvet, amely konfigurálta a fürtünket. Nézzük meg a fájl tartalmát 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
Itt nem történik semmi érdekes, indítsunk el egy lehetséges szerepet, ún tarantool.cartridge
.
Az összes legfontosabb dolog (nevezetesen a fürt konfigurációja) ebben található 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:
Csak meg kell tanulnunk a példányok és a replikátumok kezelését a fájl tartalmának módosításával. Ezután új szakaszokat adunk hozzá. Annak érdekében, hogy ne keveredjen bele abba, hogy hol kell hozzáadni őket, tekintse meg a fájl végleges verzióját, hosts.updated.yml
, amely a példatárban található.
Példánykezelés
Ansible kifejezéssel minden példány egy gazdagép (nem tévesztendő össze a hardveres szerverrel), azaz. az Ansible által kezelt infrastruktúra csomópont. Minden gazdagéphez megadhatunk kapcsolati paramétereket (pl ansible_host
и ansible_user
), valamint a példány konfigurációja. Az esetek leírása a részben található hosts
.
Nézzük a példány konfigurációját storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
Változóban config
megadtuk a példány paramétereit - advertise URI
и HTTP port
.
Alább láthatók a példány paraméterei app-1
и storage-1-replica
.
Minden egyes példányhoz meg kell mondanunk az Ansible-nek a kapcsolati paramétereket. Logikusnak tűnik, hogy a példányokat virtuálisgép-csoportokba csoportosítsák. Ebből a célból a példányokat csoportokba vonják össze host1
и host2
, és a szakasz minden csoportjában vars
értékek vannak feltüntetve ansible_host
и ansible_user
egy virtuális géphez. És a szekcióban hosts
— hosztok (más néven példányok), amelyek ebbe a csoportba tartoznak:
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:
Kezdünk változni hosts.yml
. Adjunk hozzá még két esetet, storage-2-replica
az első virtuális gépen és storage-2
A másodikon:
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: # <==
...
Indítsa el a lehetséges játékkönyvet:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Kérjük, vegye figyelembe a lehetőséget --limit
. Mivel az Ansible kifejezéssel minden fürtpéldány gazdagép, kifejezetten megadhatjuk, hogy mely példányokat kell konfigurálni a játékkönyv futtatásakor.
Visszatérés a webes felhasználói felületre
Ne álljunk meg itt, és sajátítsuk el a topológiakezelést.
Topológia kezelés
Egyesítsük új példányainkat egy replikakészletbe storage-2
. Adjunk hozzá egy új csoportot replicaset_storage_2
és analógiával írja le a replikált paramétereket változóiban replicaset_storage_1
. Szakaszban hosts
Jelöljük, mely példányok fognak szerepelni ebben a csoportban (vagyis a replikakészletünkben):
---
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:
Kezdjük újra a játékkönyvet:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
Paraméterenként --limit
Ezúttal átadtuk annak a csoportnak a nevét, amely megfelel a replikátumunknak.
Tekintsük a lehetőséget tags
.
Szerepünk szekvenciálisan különböző feladatokat lát el, melyeket a következő címkékkel jelölünk:
cartridge-instances
: példánykezelés (konfiguráció, csatlakozás a tagsághoz);cartridge-replicasets
: topológiakezelés (replikátumkezelés és a példányok végleges eltávolítása (kizárása) a fürtből);cartridge-config
: egyéb fürtparaméterek kezelése (vshard bootstrapping, automatikus feladatátvételi mód, engedélyezési paraméterek és alkalmazáskonfiguráció).
Kifejezetten megadhatjuk, hogy a munka melyik részét szeretnénk elvégezni, akkor a szerepkör kihagyja a többi feladatot. Esetünkben csak a topológiával akarunk dolgozni, ezért pontosítottuk cartridge-replicasets
.
Értékeljük erőfeszítéseink eredményét. Találtunk egy új replikátot
Hurrá!
Kísérletezzen a példányok és a replikakészletek konfigurációjának módosításával, és nézze meg, hogyan változik a fürt topológia. Kipróbálhat különböző működési forgatókönyveket, pl. memtx_memory
. A szerepkör megpróbálja ezt a példány újraindítása nélkül megtenni, hogy csökkentse az alkalmazás lehetséges állásidejét.
Ne felejts el futni vagrant halt
a virtuális gépek leállításához, amikor befejezte a velük való munkát.
Mi van a motorháztető alatt?
Itt többet fogok elmondani arról, hogy mi történt kísérleteink során az ansible szerep burkolata alatt.
Nézzük meg lépésről lépésre a Cartridge alkalmazás telepítését.
A csomag telepítése és a példányok indítása
Először el kell juttatnia a csomagot a szerverre, és telepítenie kell. Jelenleg a szerepkör RPM és DEB csomagokkal működik.
Ezután elindítjuk a példányokat. Itt minden nagyon egyszerű: minden példány különálló systemd
-szolgáltatás. Mondok egy példát:
$ systemctl start myapp@storage-1
Ez a parancs elindítja a példányt storage-1
alkalmazások myapp
. Az elindított példány megkeresi /etc/tarantool/conf.d/
. A példánynaplók a segítségével tekinthetők meg journald
.
Egységfájl /etc/systemd/system/[email protected]
a systemd szolgáltatáshoz a csomaggal együtt szállítjuk.
Az Ansible beépített modulokkal rendelkezik a csomagok telepítéséhez és a rendszerszolgáltatások kezeléséhez, itt nem találtunk ki semmi újat.
Klaszter topológia beállítása
Itt kezdődik a móka. Egyetértek, furcsa lenne egy speciális Ansible szereppel bajlódni a csomagok telepítéséhez és futtatásához systemd
-szolgáltatások.
A fürt manuálisan konfigurálható:
- Első lehetőség: nyissa meg a webes felhasználói felületet, és kattintson a gombokra. Nagyon alkalmas több példány egyszeri indítására.
- Második lehetőség: használhatja a GraphQl API-t. Itt már lehet automatizálni valamit, például Pythonban szkriptet írni.
- Harmadik lehetőség (akaratúak számára): menjen a szerverre, csatlakozzon az egyik példányhoz
tarantoolctl connect
és végezze el az összes szükséges manipulációt a Lua modullalcartridge
.
Találmányunk fő feladata pontosan ezt, a munka legnehezebb részét elvégezni Ön helyett.
Az Ansible lehetővé teszi saját modul megírását és szerepkörben való használatát. Szerepünk ilyen modulokat használ a különböző fürtkomponensek kezelésére.
Hogyan működik? A fürt kívánt állapotát egy deklaratív konfigurációban írja le, és a szerepkör minden modulnak megadja a konfigurációs szakaszát bemenetként. A modul fogadja a fürt aktuális állapotát, és összehasonlítja azt a bemenetként kapottval. Ezután az egyik példány socketjén keresztül elindul egy kód, amely a fürtöt a kívánt állapotba hozza.
Eredményei
Ma elmondtuk és megmutattuk, hogyan telepítheti alkalmazását a Tarantool Cartridge-re, és hogyan állíthat be egy egyszerű topológiát. Ehhez az Ansible-t használtuk - egy hatékony eszköz, amely könnyen használható, és lehetővé teszi számos infrastruktúra-csomópont egyidejű konfigurálását (esetünkben fürtpéldányok).
A fentiekben megvizsgáltuk a fürtkonfiguráció Ansible segítségével történő leírásának számos módját. Ha úgy érzi, készen áll a továbblépésre, fedezze fel group_vars
и host_vars
.
Hamarosan elmondjuk, hogyan lehet véglegesen törölni (kizárni) a példányokat a topológiából, a bootstrap vshardot, kezelni az automatikus feladatátvételi módot, konfigurálni az engedélyezést és javítani a fürt konfigurációját. Addig is tanulhatsz önállóan
Ha valami nem működik, mindenképpen tegye meg
Forrás: will.com