
Už jsme o tom mluvili , který umožňuje vyvíjet distribuované aplikace a balit je. Nezbývá nic jiného: naučit se tyto aplikace nasazovat a spravovat. Nebojte se, mysleli jsme na všechno! Dali jsme dohromady všechny osvědčené postupy pro práci s kazetou Tarantool a napsali , který rozloží balíček na servery, spustí instance, zkombinuje je do clusteru, nakonfiguruje autorizaci, zavede vshard, povolí automatické převzetí služeb při selhání a opraví konfiguraci clusteru.
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 . Je ale lepší jednou vyzkoušet, než stokrát vidět, takže nasadíme malou aplikaci.
Tarantool Cartridge má vytvořit malou Cartridge aplikaci, která uchovává informace o zákaznících bank a jejich účtech a také poskytuje API pro správu dat přes HTTP. K tomu aplikace popisuje dvě možné role: api и storagekteré 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-1bude hrát roliapikterá zahrnuje rolivshard-router. Zde bude pouze jeden případ. - replikaset
storage-1implementuje rolistorage(a současněvshard-storage), zde přidáme dvě instance z různých strojů.

Abychom uvedli příklad, potřebujeme и (verze 2.8 nebo novější).
Role sama o sobě je . Toto je úložiště, které vám umožní sdílet vaši práci a používat připravené role.
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.0Zvyšujeme virtuální stroje:
$ vagrant upNainstalujte roli Tarantool Cartridge:
$ ansible-galaxy install tarantool.cartridge,1.0.1Spusťte nainstalovanou roli:
$ ansible-playbook -i hosts.yml playbook.ymlČekáme na konec provádění playbooku, přejděte na a užijte si výsledek:

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.cartridgeZde 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 -soubor 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 и host2a 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.ymlVě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í a sledujte naše nové případy:

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.ymlPodle 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ř. nebo zvýšit 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 haltk 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-1Tento 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/myapp@.sevice 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 connecta 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 pro psaní herních knih. Možná bude pro vás pohodlnější spravovat topologii 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 a experimentujte se změnou parametrů clusteru.
Pokud něco nefunguje, buďte si jisti nás o problému. Rychle to rozebereme!
Zdroj: www.habr.com
