Už jsme o tom mluvili
Zajímavý? Pak se zeptám pod střihem, vše řekneme a ukážeme.
Začněme příkladem
Pokryjeme pouze část funkčnosti naší role. Kompletní popis všech jeho vlastností a vstupních parametrů vždy najdete v
Tarantool Cartridge má api
и storage
které lze přiřadit k instancím.
Cartridge sama o sobě neříká nic o tom, jak spouštět procesy, poskytuje pouze možnost konfigurovat již běžící instance. Zbytek si musí uživatel udělat sám: rozložit konfigurační soubory, spustit služby a nastavit topologii. Ale my tohle všechno neuděláme, Ansible to udělá za nás.
Od slov k činům
Pojďme tedy nasadit naši aplikaci na dva virtuální stroje a nastavit jednoduchou topologii:
- Replikační sada
app-1
bude hrát roliapi
která zahrnuje rolivshard-router
. Zde bude pouze jeden případ. - replikaset
storage-1
implementuje rolistorage
(a současněvshard-storage
), zde přidáme dvě instance z různých strojů.
Abychom uvedli příklad, potřebujeme
Role sama o sobě je
Naklonujte úložiště pomocí příkladu:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Zvyšujeme virtuální stroje:
$ vagrant up
Nainstalujte roli Tarantool Cartridge:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Spusťte nainstalovanou roli:
$ ansible-playbook -i hosts.yml playbook.yml
Čekáme na konec provádění playbooku, přejděte na
Můžete nalít data. V pohodě, že?
Nyní pojďme přijít na to, jak s tím pracovat, a zároveň přidat do topologie další sadu replik.
Začínáme rozumět
Tak, co se stalo?
Zprovoznili jsme dva VM a provozovali ansible playbook, který nastavil náš cluster. Podívejme se na obsah souboru 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
Zde se nic zajímavého neděje, spustíme ansible-roli, která se nazývá tarantool.cartridge
.
Všechno nejdůležitější (jmenovitě konfigurace clusteru) je umístěno 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še, co potřebujeme, je naučit se spravovat instance a replikacety změnou obsahu tohoto souboru. Dále do něj přidáme nové sekce. Abyste se nepletli, kam je přidat, můžete nahlédnout do finální verze tohoto souboru, hosts.updated.yml
, který je v ukázkovém úložišti.
Správa instancí
Z hlediska Ansible je každá instance hostitelem (neplést se železným serverem), tj. uzel infrastruktury, který bude Ansible spravovat. Pro každého hostitele můžeme specifikovat parametry připojení (např ansible_host
и ansible_user
), stejně jako konfiguraci instance. Popis instancí je v sekci hosts
.
Zvažte konfiguraci instance storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
V proměnné config
specifikovali jsme parametry instance - advertise URI
и HTTP port
.
Níže jsou uvedeny parametry instance app-1
и storage-1-replica
.
Musíme Ansible sdělit parametry připojení pro každou instanci. Zdá se logické seskupit instance do skupin virtuálních strojů. K tomu jsou instance sloučeny do skupin. host1
и host2
a v každé skupině v sekci vars
hodnoty ansible_host
и ansible_user
pro jeden virtuální stroj. A v sekci hosts
- hostitelé (jsou to instance), kteří jsou zahrnuti v této skupině:
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čínáme se měnit hosts.yml
. Přidejme další dva případy, storage-2-replica
na prvním virtuálním počítači a storage-2
Na druhém:
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: # <==
...
Spustit ansible playbook:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Věnujte pozornost možnosti --limit
. Vzhledem k tomu, že každá instance clusteru je hostitelem ve smyslu Ansible, můžeme explicitně určit, které instance by měly být nakonfigurovány při spuštění playbooku.
Zpět na webové uživatelské rozhraní
Neusneme na vavřínech a zvládneme ovládání topologie.
Správa topologie
Pojďme sloučit naše nové instance do replikační sady storage-2
. Přidat novou skupinu replicaset_storage_2
a popsat ve svých proměnných parametry replikační sady analogicky s replicaset_storage_1
. V sekci hosts
určete, které instance budou zahrnuty do této skupiny (to je naše sada 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čněme znovu s příručkou:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
Podle možnosti --limit
tentokrát jsme předali jméno skupiny, která odpovídá naší replikační sadě.
Zvažte možnost tags
.
Naše role postupně provádí různé úkoly, které jsou označeny následujícími značkami:
cartridge-instances
: správa instance (konfigurace, připojení k členství);cartridge-replicasets
: správa topologie (správa replikasetu a trvalé odstranění (vyhození) instancí z clusteru);cartridge-config
: správa dalších parametrů clusteru (vshard bootstrapping, automatický režim převzetí služeb při selhání, parametry autorizace a konfigurace aplikace).
Můžeme výslovně specifikovat, jakou část práce chceme dělat, pak role přeskočí zbytek úkolů. V našem případě chceme pracovat pouze s topologií, proto jsme upřesnili cartridge-replicasets
.
Zhodnoťme výsledek našeho snažení. Hledání nové repliky
Hurá!
Experimentujte s překonfigurováním instancí a replikací a sledujte, jak se mění topologie clusteru. Můžete vyzkoušet různé provozní scénáře, např. memtx_memory
. Role se to pokusí provést bez restartování instance, aby se zkrátily možné prostoje vaší aplikace.
Nezapomeň běžet vagrant halt
k zastavení virtuálních počítačů, když s nimi skončíte.
A co je pod kapotou?
Zde budu mluvit více o tom, co se dělo pod pokličkou ansible role během našich experimentů.
Pojďme se podívat na nasazení aplikace Cartridge krok za krokem.
Instalace balíčku a spouštění instancí
Nejprve musíte balíček doručit na server a nainstalovat. Nyní může role pracovat s balíčky RPM a DEB.
Dále spustíme instance. Všechno je zde velmi jednoduché: každá instance je samostatná systemd
-servis. Mluvím o příkladu:
$ systemctl start myapp@storage-1
Tento příkaz spustí instanci storage-1
aplikace myapp
. Spuštěná instance ji vyhledá /etc/tarantool/conf.d/
. Protokoly instancí lze zobrazit pomocí journald
.
Soubor jednotky /etc/systemd/system/[email protected]
pro službu systemd bude doručena s balíčkem.
Ansible má vestavěné moduly pro instalaci balíčků a správu systemd služeb, nic nového jsme zde nevymysleli.
Konfigurace topologie clusteru
A tady začíná to nejzajímavější. Souhlasím, bylo by divné obtěžovat se speciální ansible-rolí pro instalaci balíčků a spouštění systemd
-služby.
Cluster můžete nastavit ručně:
- První možnost: otevřete webové uživatelské rozhraní a klikněte na tlačítka. Pro jednorázové spuštění několika instancí je to docela vhodné.
- Druhá možnost: můžete použít GraphQl API. Zde si již můžete něco zautomatizovat, například napsat skript v Pythonu.
- Třetí možnost (pro silné povahy): přejděte na server, připojte se k jedné z instancí pomocí
tarantoolctl connect
a provést všechny potřebné manipulace s modulem Luacartridge
.
Hlavním úkolem našeho vynálezu je udělat toto, pro vás nejobtížnější část práce.
Ansible vám umožňuje napsat svůj vlastní modul a používat jej v roli. Naše role využívá tyto moduly ke správě různých součástí clusteru.
Jak to funguje? Požadovaný stav clusteru popíšete v deklarativní konfiguraci a role poskytne každému modulu jeho konfigurační sekci jako vstup. Modul přijímá aktuální stav clusteru a porovnává jej se vstupem. Dále je přes soket jedné z instancí spuštěn kód, který uvede cluster do požadovaného stavu.
Výsledky
Dnes jsme si řekli a ukázali, jak nasadit vaši aplikaci na kazetu Tarantool a nastavit jednoduchou topologii. K tomu jsme použili Ansible, výkonný nástroj, který se snadno používá a umožňuje současně konfigurovat mnoho uzlů infrastruktury (v našem případě se jedná o instance clusteru).
Výše jsme se zabývali jedním z mnoha způsobů, jak popsat konfiguraci clusteru pomocí Ansible. Jakmile víte, že jste připraveni jít dál, učte se group_vars
и host_vars
.
Velmi brzy vám řekneme, jak trvale odebrat (vyloučit) instance z topologie, zavést vshard, spravovat automatický režim převzetí služeb při selhání, nakonfigurovat autorizaci a opravit konfiguraci clusteru. Mezitím můžete studovat sami
Pokud něco nefunguje, buďte si jisti
Zdroj: www.habr.com