WEDOS Cloud – MariaDB (MySQL) databáze s vysokou dostupností

Tento komunitní článek je aktuální k 1. 12. 2020.

V předchozím návodu jsme si popsali, jak na WEDOS Cloud vytvořit vysoce dostupné webservery s PHP. Jelikož většina webových aplikací potřebuje ke své funkci databázi, ukážeme si, jak nainstalovat a nakonfigurovat MariaDB servery v režimu Master-Slave.

Master-Slave režim funguje na principu replikace dat z hlavního (Master) serveru na záložní (Slave), který umožňuje pouze čtení dat. Veškeré zápisy je tedy nutno provádět na Master serveru. Hlavní výhodou tohoto řešení je (pokud to aplikace podporuje), že většina požadavků na databázi je pouze čtení dat pro zobrazení na stránce nebo získání informací o uživateli. Tyto požadavky se mohou odesílat na Slave server, a tak ulehčit Master serveru, který bude zajišťovat pouze několik zápisů. Slave serverů může být několik, a tak je možné rozložit zátěž na více VPS.

Výpadek slave serveru by pro aplikace připojené k databázi neznamenal výpadek, jelikož se mohou přepojit na master server a získat data z něj. V případě, že by výpadek postihl master server, znamenalo by to nemožnost upravovat veškerá data v databázi, dokud by slave serveru nebyla přiřazena role masteru nebo dokud by původní server nenaběhl zpět.

Existuje také režim master-master, ve kterém je možné provádět zápisy na všechny servery. Tento režim má ovšem také svá negativa a je více náchylný k poškození dat na serveru a split-brain situaci. Ta může nastat v případě, že by servery nebyly schopné data mezi sebou synchronizovat a každý ze serverů by tak obsahoval jiná data.

Vytvoření VPS

Postup bude velice podobný jako při instalaci webserveru. Budeme tedy následovat část Vytvoření VPS a NAT z předchozího návodu s tím rozdílem, že pro databázové servery vybereme jiné adresy a vnější porty. V tomto příkladu si zvolíme adresy 192.168.1.20 a 192.168.1.21 a porty 3333 a 4444.

Instalace a konfigurace MySQL na master serveru

Prvním krokem je samotná instalace MariaDB. Tu nainstalujeme pomocí příkazu:

apt update && apt install mariadb-server -y

Po dokončení instalace otevřeme konfigurační soubor /etc/mysql/mariadb.conf.d/50-server.cnf

nano /etc/mysql/mariadb.conf.d/50-server.cnf

Zde upravíme následující řádky:

bind-address = 192.168.1.20
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10

Položka bind-adress určuje adresu, na které bude databáze naslouchat pro příchozí spojení. Zde nastavíme adresu VPS, na kterou jsme server nainstalovali. V server-id nastavíme číslo, které musí být na každém serveru jiné. Jedná se o jeho identifikátor. log_bin a expire_logs_days definují, kam se bude ukládat soubor obsahující veškeré transakce v databázi a kolik dní se bude uchovávat.

Následně MySQL databázi restartujeme, aby se změny aplikovaly.

service mysql restart

Doporučujeme provést příkaz mysql_secure_installation a následovat průvodce. Tento příkaz nastaví heslo pro uživatele root a zakáže pro něj vzdálený přístup.

Pokračujeme přihlášením do mysql pomocí následujícího příkazu. Heslo je ve výchozí instalací prázdné.

mysql -u root -p

Po přihlášení se nám zobrazí MySQL shell, do které zadáme následující příkaz, který vytvoří nového uživatele replica s heslem password. Na tento účet je možné se připojit pouze z adresy 192.168.1.21, na které se nachází slave server.

GRANT REPLICATION SLAVE ON *.* TO 'replica'@'192.168.1.21' IDENTIFIED BY 'password';

Dále je potřeba zobrazit aktuální stav Master serveru následujícím příkazem. Je důležité si zapsat hodnotu pole File a Position, jelikož budou potřeba při nastavování slave serveru.

SHOW MASTER STATUS;
Status master serveru
Status master serveru

Instalace a konfigurace MySQL na slave serveru

Postup instalace je stejný jako u master serveru. Začneme tedy instalací MariaDB:

apt update && apt install mariadb-server -y

Po dokončení instalace otevřeme konfigurační soubor /etc/mysql/mariadb.conf.d/50-server.cnf

nano /etc/mysql/mariadb.conf.d/50-server.cnf

Zde upravíme následující řádky:

bind-address = 192.168.1.21
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10

Je důležité v konfiguračním souboru správně nastavit bind-address IP adresu, na které server běží a server-id na rozdílnou hodnotu než má nastavenou master server.

Následně MySQL databázi restartujeme, aby se změny aplikovaly.

service mysql restart

Pokračujeme přihlášením do mysql pomocí příkazu, heslo je ve výchozí instalaci prázdné.

mysql -u root -p

Po přihlášení se nám zobrazí MySQL shell, do které zadáme následující příkazy, které se přihlásí k master serveru a začnou si replikovat veškeré databáze. Je potřeba upravit MASTER_LOG_FILE a MASTER_LOG_POS podle dat, které jsme získali z master serveru v předchozí sekci.

STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='192.168.1.20', MASTER_USER='replica', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;
START SLAVE;

Status synchronizace lze zobrazit pomocí následujícího příkazu:

SHOW SLAVE STATUS\G;

Pokud jsme vše provedli správně, měl by první řádek obsahovat Waiting for master to send event

Status synchronizace slave serveru
Status synchronizace slave serveru

Ověření funkčnosti

Připojíme se na master server a vytvoříme novou databázi. Ta by se měla během pár vteřin replikovat na slave server.

CREATE DATABASE test;

Na slave server si můžeme zobrazit databáze pomocí následujícího příkazu:

SHOW DATABASES;
Výsledek příkazu na slave serveru
Výsledek příkazu na slave serveru

Pokud databázi ve výpisu vidíme, proběhla synchronizace v pořádku.

Povýšení slave na master

V případě, že by vypadl master server, zůstane slave v režimu pouze pro čtení, do té doby, než se master server opět spustí. Pokud by byl výpadek závaznější a bylo potřeba master server delší dobu obnovovat, existuje možnost slave server „povýšit“ na master, a tak znovu obnovit plnou funkci databáze.

Na slave serveru se připojíme k mysql a spustíme následující příkazy:

STOP ALL SLAVES;
RESET SLAVE ALL;
SELECT @@global.gtid_binlog_pos;
SET @@global.read_only=0;

Po jejich spuštění bude možné zapisovat i na nový master server a aplikace připojené k databázi budou moci opět zapisovat. Je důležité, aby se aplikace nepokoušela připojovat k master serveru po tom, co se znovu spustí, jelikož bude obsahovat stará data z doby před výpadkem.