Skip to content

Hrají: MariaDB, InnoDB, Multi-Master, Failover, MaxScale Proxy, Galera

Podíváme se na jednu z možností, jak vytvořit databázi typu innodb s replikací, failoverem a rozloženou zátěží. Vzhledem k tomu, že původní MySQL je v linuxových distribucích nahrazována za MariaDB, která je s ní do určité míry kompatibilní, budu se věnovat právě MariaDB.

Je několik možností jak rozložit zátěž na sql server a ulehčit tak jedinému stroji. Máme možnost postavit master-[multi]slave konfiguraci, pokud máme hodně čtení z db a razantně tak zvedneme rychlost odezvy. V případě MySQL máme i NDB (NetworkDataBase), což je robustní řešení, které má ovšem i svoje nevýhody. Pro NDB je většinou potřeba upravit aplikaci tak, aby jí bylo možno na NDB nasadit, což v případě již rozjetého velkého projektu nemusí být snadné. Pokud využíváme InnoDB a neradi bychom přecházeli na NDB, můžeme využít [multi]master replikaci pomocí Galery. Navíc díky MaxScale proxy můžeme řídit tok požadavků mezi jednotlivé nody clusteru.

MariaDB/Galera

Galera je clusterové řešení pro xtradb a innodb. Umožňuje master-master replikaci pro 2 a více nodů. Balíčky v Debianu neobsahují verzi serveru s Galerou, je potřeba přidat externí zdroj na servery MariaDB, zde z mirror.hosting90.cz.  Poté se již v aptitude objeví i mariadb-server, který obsahuje Galeru, v tomto případě ve verzi 10.1.

deb http://mirror.hosting90.cz/mariadb/repo/10.1/debian jessie main

Po instalaci vznikne klasický konfigurační adresář /etc/mysql/, kde je potřeba upravit my.cnf. Pro galeru jsem udělal separátní soubor conf.d/galera.cnf, abych měl konfiguraci přehledněji mimo. V my.cnf jsem tedy nejdříve zakomentoval věci, které dále nastavuji v separátním souboru.

galera.cnf:

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
wsrep_on=on
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="wsrep_cluster"
wsrep_cluster_address="gcomm://192.168.0.11,192.168.0.12,192.168.0.13,192.168.0.14"
wsrep_sst_method=rsync
wsrep_node_address="192.168.0.11"
wsrep_node_name="g-1"

binlog_format=ROW – změny provedené na jednom z masterů se na další předávají již jen jako příkazy, který řádek se má jak ovlivnit/upravit/smazat/nahradit. Každý z masterů tedy nemusí provádět celou logiku operací přijatých od aplikace. Výhoda je, že logiku provede vždy jen jeden ze serverů, nevýhoda je, že pokud došlo k ovlivnění velkého počtu řádků, bude se na další mastery po síti přenášet více dat.

default-storage-engine=innodb – není třeba vysvětlovat 🙂

innodb_autoinc_lock_mode=2 – Tímto nastavením zabráníme kolizím při auto_increment. Vzhledem k tomu, že při M-M komunikaci může do databáze vkládat auto_increment každý z masterů, mohlo by dojít ke kolizím v případě klasického incrementálního narůstání čísel ve sloupci. Nastavením na „2“ zajistíme, že logiku přebere pro všechny nody Galera cluster.

query_cache_size=0 a _type=0 – Ve standalone režimu slouží jako cache pro výsledky SELECT operací. V multimasteru je jí potřeba vypnout, protože nacachovaný výsledek již nemusí být platný kvůli updatu db z jiného nodu.

bind-address=0.0.0.0 – Povolíme Marii, aby byla dostupná i mimo localhost

wsrep_on=on – Povolíme běh Galery

wsrep_provider= – Cesta k modulu Galery pro MariaDB, výše uvedená cesta je platná pro Debian a společně se souborem vznikne instalací mariadb-server

wsrep_cluster_name=“wsrep_cluster“ – jméno clusteru

wsrep_cluster_address=“gcomm://…“ – seznam IP adres (je možno použít i jména) jednotlivých nodů v clusteru. Seznam je totožný na všech nodech.

wsrep_sst_method=rsync – Nastavení synchronizace mezi nody v případě, že nějaký z nich vypadl a znovu startuje. Takto si opět stáhne snapshot současného stavu db. Rsync je výchozí nastavení, dále je možno zvolit mysqldump a xtrabackup (pro xtradb).

wsrep_node_address= – adresa nodu

wsrep_node_name= – jméno nodu

 

V případě multi-master replikace je potřeba myslet na to, že pokud se cluster vypíná celý, je zapotřebí, aby node, který se vypnul jako poslední, se zapnul jako první a to samozřejmě kvůli konzistenci dat. Z takového nodu si poté ostatní nody dotáhnou rozdíly v db a pokud by se jako první zapnul některý jiný node, nemusel by mít celou historii dat. Po synchronizaci by pak data byla nenávratně ztracena. Ideální je tím pádem i vypnout automatické spuštění MariaDB při startu systému.

Pokud tedy máme konfiguraci hotovou, můžem zapnout první node. Vzhledem k tomu, že se jedná o první node, kdy žádný další neběží, nezapíná se MariaDB klasickým způsobem přes systemctl nebo jiné init scripty, ale volá se pomocí galera_new_cluster (platí pro verzi 10.1, u starší je to přes mysqld –wsrep-new-cluster). Toto zajistí, že další spuštěné nody budou vědět, odkud si mají stáhnout potřebná data. Další nody se tedy již spouští klasicky.

Pro zjištění počtu nodů se připojíme do db a provedeme příkaz:

select variable_value as "cluster size" from information_schema.global_status where variable_name="wsrep_cluster_size";

Dva nody:

galera-node-status2

V tuto chvíli můžeme tedy číst a zapisovat na libovolný node, vše co uděláme se zreplikuje na další. V případě výpadku některého nodu ho nyní stačí opět zapnout a veškeré změny se na něj přenesou automaticky.

 

MaxScale Proxy

Když už máme více sql serverů, bude potřeba mezi nimi řešit přístupy. MaxScale je proxy od týmu MariaDB. Umí řešit rozkládání read/write požadavků ať už na master nody nebo i na pouhé slave servery, což můžeme využít pokud nemáme cluster, ale jen master a slave server. Proxy řeší nejen rozložení požadavků, ale v případě výpadku některého nodu směruje požadavky jinam.

Ze stránek MariaDB stáhneme maxscale-1.3.0-1.deb_jessie.x86_64.deb a nainstalujeme. V současné době je to stable verze. V /etc/maxscale.cnf je veškeré nastavení, které budeme potřebovat.

[maxscale]
threads=1

[server1]
type=server
address=192.168.0.11
port=3306
protocol=MySQLBackend

[server2]
type=server
address=192.168.0.12
port=3306
protocol=MySQLBackend

[server3]
type=server
address=192.168.0.13
port=3306
protocol=MySQLBackend

[Galera Monitor]
type=monitor
module=galeramon
servers=server1,server2,server3
user=root
passwd=a
disable_master_failback=1
monitor_interval=10000

[Read-Write Service]
type=service
router=readconnroute
router_options=synced
servers=server1,server2,server3
user=root
passwd=a
max_slave_connections=100%
enable_root_user=1
localhost_match_wildcard_host=1

[MaxAdmin Service]
type=service
router=cli

[Read-Write Listener]
type=listener
service=Read-Write Service
protocol=MySQLClient
port=3306

[MaxAdmin Listener]
type=listener
service=MaxAdmin Service
protocol=maxscaled
port=6603

V sekcích označených jako [server1] apod. jsou informace o jednotlivých nodech.

Pokud využíváme Galeru, je nutné do konfigurace přidat sekci [Galera Monitor]. MaxScale si za normálních okolností hlídá master server a v případě jeho výpadku zvolí jako nový master další možný node. Po navrácení původního masteru MaxScale opět nastaví tento server jako master. V případě Galery lze ale za master považovat libovolný node. Parametr disable_master_failback zakáže navrácení master statusu na původní node, protože to není třeba. V případě Galery a tedy multi-master konfigurace MaxScale sice vždy ukazuje jeden z nodů jako hlavní, tato informace ale není v této konfiguraci podstatná a ani MaxScale se k danému nodu nechová jinak než k ostatním masterům.

Dále je zde uveden modul galeramon, který je potřeba právě pro provoz MaxScale a Galery.

Uživatel root a jeho heslo je potřeba do konfigurace dodat proto, aby MaxScale mohl číst oprávnění z MariaDB systémové databáze (mysql.user). Samozřejmě je možné do konfigurace dodat jiného uživatele s patřičnými právy.

router=readconnroute je round-robin nastavení pro rozkládání zátěže a nebere ohled na read-write požadavky (opakem je readwritesplit, který naopak analyzuje požadavek a posílá read a write na odlišné servery)

router_options=synced se používá právě pro Galeru. Říkáme tím MaxScale, že může požadavky směrovat na kterýkoliv ze serverů, které jsou v „Synced“ stavu

max_slave_connections=100% můžeme nastavit poměr či počet serverů, které se mohou použít jako slavy pro read operace. V Galeře můžeme použít všechny dostupné.

MaxScale po nainstalování a nakonfigurování spustíme klasicky jako systemctl start maxscale. Stav jednotlivých nodů pak můžeme sledovat pomocí maxadmin (výchozí heslo pro maxadmin je mariadb, jak je vidět na screenshotu). Do console pro MaxScale se lze dostat pomocí maxadmin -u admin -pmariadb a zde provádět další úpravy.

Server1 a 2 jsou zapnuté mastery a server3 je vypnutý či nedostupný

maxscale

Server 3 je již dostupný a synchronizovaný

maxscale2

Jak je vidět, označuje tedy interně MaxScale pouze jeden server jako master. Technicky se ale ke všem chová jako k masterům přesně podle výše uvedené konfigurace, nenechte se tedy výpisem zmást.

 

Live ukázka a soubor ke stažení (vbox galera-1 je výpis z galery, vbox maxscale je výpis přímo z MaxScale):

 

Kromě sekcí, které jsem zmínil, jsou zde ještě další jejichž význam je zřejmý z konfigurace, proto jen stručně:
[Read-Write Service ] – Definice service – co má dělat, jaké výše definované servery k tomu má použít, povolení loginu na roota přes proxy (defaultně zakázáno, zde explicitně povoleno)
[MaxAdmin Service] – interní service, CLI přístupné přes výše uvedený maxadmin
[MaxAdmin Listener] – Každá service musí mít další sekci Listener, ve které se definuje port a protokol pro přístup
[Read-Write Listener] – Definice Listeneru pro náš Galera cluster

 

Pro systemd ještě doporučuji zvednout hodnotu TimeoutSec= v service souboru pro marii třeba na 10min, protože pokud spouštíte galeru a dochází k syncu druhého až n-tého nodu, tak se mariadb bude spouštět dlouho než se povede rsyncem přenést celou db (pokud má např. pár GB). V opačném případě systemd po 30s vyhodnotí start jako failed.

 

Na závěr bych dodal, že MariaDB má velmi pěkně zpracovanou dokumentaci a stojí za to si jí přečíst. Poměrně detailně jsou zde popsány volby a nastavení, kterých je velké množství.

 

SELECT * FROM World WHERE "Someone" LIKE 'You';

🙂

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Time limit is exhausted. Please reload the CAPTCHA.