Replikace databází vytváří redundanci, která může chránit před ztrátou dat a umožňuje optimalizovaný výkon aplikací. Tento tutoriál pokryje základy replikace existující hlavní databáze MariaDB 10.0 na jednoho nebo více podřízených. V následujících příkladech je hostitelským operačním systémem Debian 8.
Tyto pokyny lze použít pro jiné operační systémy, ale uvědomte si, že několik příkazů a výchozí umístění souborů se bude lišit. Konkrétně byste měli nahradit názvy cest /etc/mysql/my.cnf , /var/lib/mysql , výchozí název a cestu vašeho binárního souboru protokolu a příkazy pro spouštění, zastavování a restartování mysqld podle specifik vašeho systému.
1. Ověřte připojení
Než budete pokračovat, ujistěte se, že se master a slave mohou v síti navzájem spojit a že každý má pro toho druhého záznam ve svých příslušných /etc/hosts soubory. Každý hostitel by měl umět ping druhý a měli byste být schopni ssh od jednoho k druhému jako běžného uživatele.
2. Povolit binární protokol mysqld na hlavním serveru
Na hlavním hostiteli zkontrolujte, zda je povoleno binární protokolování. Vyvolání mysqld pomocí přepínačů --verbose --help zobrazí provozní hodnoty pro démona MariaDB. Jako root:
mysqld --verbose --help | grep log-bin
...
log-bin (No default value)
...
Hodnota položky log-bin definuje konvenci pojmenování binárních souborů protokolu. V Debianu jsou tyto soubory umístěny v /var/lib . Pokud je hodnota log-bin je (žádná výchozí hodnota) , budete muset povolit protokolování úpravou konfiguračního souboru my.cnf . V Debianu my.cnf je umístěn v adresáři /etc/mysql .
Otevřete /etc/mysql/my.cnf v textovém editoru a vyhledejte [mysqld] skupina. Pokud neexistuje, vytvořte jej a zadejte řádek, který jednoduše zní log-bin .
[mysqld]
log-bin
Zahrnutím této položky povolíte binární protokolování při restartu mysqld.
Můžete nastavit hodnotu pro log-bin , např. log-bin=název souboru , k definování vlastního názvu pro binární soubor protokolu. V tomto tutoriálu nenastavíme hodnotu a použijí se výchozí názvy souborů protokolu.
Restartujte mysqld:
service mysql restart
Ověřte, že se změna projevila:
mysqld --verbose --help | grep log-bin
...
log-bin mysqld-bin
...
Jak je zde ukázáno, výchozí název souboru binárního protokolu v Debianu začíná mysqld-bin , např. mysqld-bin.nnnnnn .
3. Udělte práva uživateli replikace
Je osvědčeným postupem nechat všechny úlohy replikace provádět vyhrazený uživatel replikace. V těchto příkladech pojmenujeme uživatele repluser a nastavte heslo tohoto uživatele na řetězec replpass .
Udělte tomuto uživateli globální oprávnění SUPER , ZNOVU NAČÍST a REPLICATION SLAVE . Ty umožní uživateli replikace spouštět příkazy superuživatele, vyprázdnit mezipaměť databáze a načítat aktualizace z hlavního serveru.
Zadejte klienta MariaDB jako kořen databáze:
mysql -u root -p
Na výzvu MariaDB zadejte příkaz:
GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'replpass';
Zde zástupný znak názvu hostitele '% ' umožňuje uživateli replikace připojit se z libovolného hostitele.
Ověřte, že byla udělena práva:
SHOW GRANTS FOR 'repluser'\G;
4. Vyprázdnění mezipaměti databáze a nastavení tabulek pouze pro čtení
V rámci přípravy na vytvoření snímku databází vyprázdněte všechny tabulky a nastavte je na READ LOCK . To by mělo být provedeno rychle, v době mimo špičku nebo v období údržby systému.
Na hlavní:
FLUSH TABLES WITH READ LOCK;
Nyní, když jsou tabulky uzamčeny, zkontrolujte hlavní stav:
ZOBRAZIT STAV HLAVNÍHO;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000005 | 995 | | |
+-------------------+----------+--------------+------------------+
Vaše informace se budou lišit, ale poznamenejte si hodnoty Soubor a Pozice . Tyto informace použijete v kroku 7.
Ukončete klienta MariaDB:
\q
5. Snímek databází pro podřízeného hostitele
Vytvořte archiv databáze nebo databází, které existují na hlavním serveru, který chcete replikovat. Každá z těchto databází má svůj vlastní adresář v /var/lib/mysql . V tomto příkladu budeme tarovat vytvořit jedinou databázi, která se nachází na cestě /var/lib/mysql/dbname .
Tento příkaz archivuje jednu databázi. Pokud archivujete další databáze, připojte k příkazu jejich úplné názvy, např. /var/lib/mysql/dbname1 /var/lib/mysql/dbname2 ...
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
Nyní jako normální uživatel uživatelské jméno , přeneste tento soubor do běžného uživatelského účtu na podřízeném hostiteli:
rsync -avP mysql-master.tar.bz2 [username]@slavehost:~/.
nebo pomocí scp:
scp mysql-master.tar.bz2 [username]@slavehost:~/.
Poté SSH na podřízeného hostitele:
ssh [username]@slavehost
Jako root zastavte mysqld na slave:
service mysql stop
...a rozbalte archiv:
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
6. Nakonfigurujte ID serverů pro master a slave
Upravte /etc/mysql/my.cnf na hlavním serveru přidáním položky server-id=n v [mysqld] skupina, kde n je jedinečné celé číslo identifikující server. Obvykle n =1 pro hlavní server, ale n může být libovolné jedinečné celé číslo v rozsahu [1 , 2^32-1 ]. Náš hlavní server nastavíme na id-serveru=1 a náš otrok id serveru=100 .
(Pokud my.cnf na otroku neexistuje, vytvořte jej. Pokud existuje, vyhledejte existující ID serveru záznam a zrušte komentář/upravte tento řádek).
V /etc/mysql/my.cnf na hlavním hostiteli:
[mysqld]
server-id=1
V /etc/mysql/my.cnf na podřízeném hostiteli:
[mysqld]
server-id=100
7. Odemkněte tabulky a spusťte/restartujte mysqld na hlavním a podřízeném zařízení
Na hlavním serveru v klientovi MariaDB jako kořen databáze odemkněte tabulky:
mysql -u root -p
UNLOCK TABLES;
\q
Restartujte mysqld na hlavním serveru:
service mysql restart
A spusťte to na otroku:
service mysql start
Můžete ověřit, že nové ID serveru hodnota se projevila u každého hostitele. Jako root:
mysqld --verbose --help | grep server-id
8. Nakonfigurujte identitu master na slave
Na podřízeném serveru nakonfigurujte identitu hlavního serveru. Zadejte klienta MariaDB:
mysql -u root -p
Proveďte následující příkaz, kterým nahraďte hodnoty MASTER_LOG_FILE a MASTER_LOG_POS s binárním logem Soubor a Pozice které jste zaznamenali v kroku 4, a hodnoty MASTER_HOST , MASTER_USER a MASTER_PASSWORD se svými vlastními hodnotami.
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=995;
9. Aktivovat slave
Na slave v klientovi MariaDB jako kořen databáze:
START SLAVE;
Nyní můžete zkontrolovat stav podřízeného:
SHOW SLAVE STATUS \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: masterhost
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000009
Read_Master_Log_Pos: 1330
Relay_Log_File: mysqld-relay-bin.000008
Relay_Log_Pos: 1618
Relay_Master_Log_File: mysqld-bin.000009
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1330
Relay_Log_Space: 2204
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Pokud se v procesech replikace vyskytnou nějaké chyby, uvidíte je zde.
10. Proveďte změny na masteru a ověřte replikaci na slave
Probíhá replikace můžete ověřit vytvořením nové databáze na masteru a zobrazením změn na slave.
mysql -u root -p
Vytvořte novou databázi:
CREATE DATABASE repltest;
USE repltest
Vytvořte tabulku a vložte hodnotu:
CREATE TABLE test (hello VARCHAR(10));
INSERT INTO test VALUES ('world');
\q
Nyní zadejte klienta MariaDB na slave:
mysql -u root -p
USE repltest
SELECT * FROM test;
+-------+
| hello |
+-------+
| world |
+-------+
1 row in set (0.00 sec)
11. Opakujte proces pro další podřízené
Tento proces můžete opakovat pro každého dalšího slave. Konkrétně proveďte tyto kroky:
11 (a ). Na hlavním serveru v klientovi MariaDB jako kořenové, vyrovnávací a zamykací tabulky databáze:
FLUSH TABLES WITH READ LOCK;
Po uzamčení zobrazit hlavní stav:
SHOW MASTER STATUS;
Poznamenejte si Soubor a Pozice hodnoty.
11 (b ). Na hlavním serveru jako root:
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
11 (c ). Na hlavním serveru jako normální uživatel:
rsync -avP mysql-master.tar.bz2 [username]@slavehost2:~/.
11 (d ). Na slave jako root:
service mysql stop
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
11 (e ). V /etc/mysql/my.cnf na podřízeném hostiteli přidejte nebo upravte server-id= řádku v [mysqld] group, kde je hodnota server-id je nový a jedinečný:
[mysqld]
server-id=200
11 (f ). Na hlavním serveru v klientovi MariaDB jako kořen databáze odemkněte tabulky:
UNLOCK TABLES;
11 (g ). Na hlavním serveru jako root restartujte mysqld:
service mysql restart
11 (h ). Na slave jako root spusťte mysqld:
service mysql start
11 (i ). Na podřízeném v klientovi MariaDB jako kořen databáze nakonfigurujte hlavní identitu a název souboru a pozici binárního protokolu z kroku 10(a):
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.nnnnnn’, MASTER_LOG_POS=n;
11 (j ). Na slave v klientovi MariaDB jako kořen databáze aktivujte replikaci:
START SLAVE;
12. Odstraňování problémů:Slave se nemůže připojit k master
Zkontrolujte /var/mysql/my.cnf na masteru pro bind-address vstup. Pokud bind-address je nastavena na 127.0.0.1 , server bude přijímat pouze připojení z localhost. Zakomentujte tento řádek nebo nastavte hodnotu na * povolit připojení ze všech adres IPv4 a IPv6. Pokud upravíte my.cnf , nezapomeňte restartovat mysqld.
Pokud připojení stále nefungují, ujistěte se, že váš server povoluje připojení na portu 3306 . Na hlavním serveru vypište tabulky brány firewall jádra:
iptables -L
Pomocí následujícího příkazu můžete vytvořit povolenou hodnotu pro připojení na portu 3306 a nahradit eth0 názvem zařízení vašeho síťového rozhraní. podle potřeby:
iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT