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:
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ý
Server 3 je již dostupný a synchronizovaný
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';
🙂
Time limit is exhausted. Please reload the CAPTCHA.