Minulé díly minisérie se věnovali instalace a použití MariaDB na Fedoře 24 a probrali jsme většinu základních novinek ve verzi 10.1. Jednu novinku jsme ale proběhli velmi rychle, protože ta si zaslouží vlastní článek. Jedná se o Galeru, synchronní multi-master replikaci. Jeden by mohl říct, že Galera replikace mohla být používána už dříve, dokonce i ve Fedoře, takže co ten humbuk? Toto si zaslouží detailnější vysvětlení, ke kterému by nám mohla pomoci implementace, pojďme se tedy na ní zběžně podívat.

MySQL a tím pádem i MariaDB tradičně podporuje klasickou master-slave replikaci a to bez dalších pluginů nebo toolingu okolo. Klasická master-slave replikace znamená, že máme jeden server, který prování zápisové operace, a jeden nebo více serverů určených pouze pro čtení. Taková replikace dokáže pomoci při nutnosti škálovat čtecí operace, což nemusí být vždy dostatečné. Zároveň tu ale vždy máme single-point of failure, neboť když master server není dostupný nebo úplně spadne, je potřeba na to reagovat a buďto se pokusit ho obnovit nebo jeden ze slave serverů povýšit na master.

Galera nabízí alternativu a jde na problém škálování jiným způsobem -- prohlásí všechny servery za plnohodnotné master servery, navzájem propojeny, a tím pádem můžeme provádět zápisové operace na libovolném z nich. Data se potom synchronně replikují napříč klastrem, který je tzv. virtuálně synchronní -- neboli každý z uzlů klastru transakce zapíše (commit) ve stejném pořadí, nicméně ne ve stejnou chvíli. Důležité je ovšem uvědomit si, že synchronní typ operace znamená riziko prodlev, zejména u serverů navzájem propojených na velké vzdálenosti.

Jak to celé vzniklo

Galera řešení je vyvíjeno společností Codership a sestává se ze dvou částí. Jednou je wsrep plugin pro server a druhou patch, který přidává do kódu standardního MySQL nebo MariaDB serveru wsrep API pro synchronní replikaci. Patch byl již ve verzi MariaDB 10.0 a nižší k dispozici a dokonce i aplikován upstreamem MariaDB, nicméně pro použití musel uživatel stáhnout extra balík. Ve Fedoře 23 například existuje balík mariadb-galera-server, který vedle balíku mariadb-server nabízí právě zdroj s tímto patchem.

Od verze 10.1 se autorům MariaDB povedlo patch udělat natolik izolovaný a natolik ho otestovat, že se mohl stát součástí plnohodnotného archivu a nemusíme tím pádem stahovat extra balíky. Pro použití Galera replikace tedy potřebujeme již jenom zmíněný plugin a potom volitelně démona (wsrep provider neboli replikační engine/arbitr), který celý klastr hlídá, ale o tom později.

Ve fedoře je vlastně stále extra balík, který nainstalujeme, chceme-li používat Galera replikaci, ten ale pouze doplňuje standardní mariadb-server balík o potřebný plugin a navíc dodává nějaké podpůrné utilitky, aby bylo možné v běžných případech zmenšit velikost mariadb-server balíku. Začněme tedy jeho instalací, nainstalujeme ho společně s mariadb-server balíkem:

$ sudo dnf install mariadb-server mariadb-server-galera

Nyní na jednom ze serveru nastavíme adresy všech ostatních uzlů (není to nutné, ale má to své výhody při řešení zotavení). Řekněme, že chceme klast rozjet na třech serverech:

$ sudo vim /etc/my.cnf.d/galera.cnf
wsrep_cluster_address="gcomm://192.168.0.1,gcomm://192.168.0.2,gcomm://192.168.0.3"

Nyní můžeme tzv. bootstrapovat galera klastr:

$ sudo galera_new_cluster

Tento skript nastartuje první uzel klastru se speciální volbou --wsrep-new-cluster. Můžeme zkontrolovat, zda uzel naběhl:

$ sudo systemctl status mariadb

Služby na jiných serverech nastartujeme jako obvykle:

$ sudo systemctl start mariadb

Nyní máme nastartovány tři MariaDB démony, kteří mezi sebou sdílí data. Počet serverů je při multi-master replikaci důležitý a měl by ideálně být lichý. Proč chceme většinou mít lichý počet uzlů, je celkem jednoduché -- řekněme, že provozujeme servery na všech kontinentech a že se po cestě přes oceán porouchá spojení. Pokud bychom měli sudý počet uzlů a poruchou vznikly dva shodne velké klastry, ani jeden z nich by nebyl schopen rozhodnout, zda je ten správný (tedy viditelný uživatelům) a dostali bychom se do stavu označovaného jako split-branin. Lichý počet je tím pádem vhodnější.

Dostáváme se tím pádem i k arbitru, neboli wsrep provideru. Ten se dokáže připojit jako jeden z uzlů a slouží mimojiné k rozuzlení na první pohled nerozluštitelného rébusu při split-brain stavu: která ze dvou polovin klastru je ta správná. Tento wsrep provider se chová jako běžný klient, to znamená, že přijímá všechna data, akorát přijatá data zahazuje. Nasazení providera znamená tedy i jisté zdroje navíc (distribuce dat vezme část kapacity sítě), nicméně jeho absence nebo pád zbytek klastru nijak neovlivní." Po pádu lze samozřejmě znovu připojit.

Arbitr najdeme v balíku galera:

$ sudo dnf install galera

Nastavit arbitra lze zadáním alespoň jednoho uzlu z klastru a názvu celého klastru, např. takto:

GALERA_NODES="192.168.0.1:4567"
GALERA_GROUP="my_wsrep_cluster"

Nyní můžeme nastartovat démona a jít na kafe:

$ sudo systemctl start garbd

Pokud zvolíme rozumný pořet uzlů a nastavíme je tak, aby se při pádu znovu připojili, máme najednou fungující a automaticky se obnovující klastr uzlů, kde navíc nemusíme řešit, ke kterému z nich se klient připojí. Pomocí proxy lze pak zařídit připojení vždy k nejbližšímu nebo nejméně využitému serveru.

To je vše a jako vždy, pokud máte jakékoliv pocity, zkušenosti nebo náměty týkající se nejenom MariaDB, MySQL, ale i jiných databází ve Fedoře, budu rád za jakoukoliv zpětnou vazbu.