Občas se muže hodit replikovat data z jednoho místa na druhé. Pokud máte data, která chcete replikovat, v databázi MySQL, můžete se radovat, replikace je v MySQL přímo zabudovaná stačí tedy jen nastavit.
Proč vlastně tedy replikovat?
Replikace MySQL se muže hodit hned z několika důvodů: Když například máte databázi s několika tisíci uživateli a postupem času zjistíte, že pouhé backupy MySQL nestačí a nebo potřebujete ukočírovat vysoký load. To jsou chvíle, kdy je záhodno uvažovat nad možností replikace.
Co nám tedy může MySQL replikace pomoci řešit?
- load primární MySQL
- potřebu provozovat databázi na více místech (pro čtení)
- zálohu formou zálohovacího stroje který se začne používat v případně výpadku primárního
Nastavení replikace
Nastavení není nijak obtížné v zásadě jde jen o přidání pár řádků do konfiguračních souborů MySQL a SQL příkazů pro zajištění komunikace mezi master a slave serverem.
Nastavení Master serveru:
Na master serveru stačí jen pár úprav, tedy:
Nastavení v souboru /etc/mysql/my.cnf
V sekci [mysqld]
zakomentovat:
#bind-address = 127.0.0.1
Tímto zakomentováním se otevře potenciální bezpečností díra, neboť tento parametr zajišťoval že se k MySQL připojí jen uživatelé z localhostu, je teď tedy důležité o to více pečlivěji držet bezpečnostní politiku uživatelů uvnitř MySQL.
a přidat následující řádky:
log-bin server-id=1 binlog-ignore-db = mysql
Parametr server-id
musí být unikátní v našem případě je 1 pro Master a 2 pro Slave.
Parametr binlog-ignore-db
říká které databáze se nemají replikovat, my nebudeme replikovat pouze výchozí databázi mysql
.
Jako další krok zavoláme MySQL příkazy, které nastaví uživatele, který bude replikaci provádět.
mysql> mysql GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replication'@'%' IDENTIFIED BY 'password'; mysql> mysql FLUSH PRIVILEGES;
Výše zmíněné nastavení je velmi volné a spíše ilustrační, pro konkrétní nasazení by bylo vhodné nastavit přesné IP, z kterého se může připojovat a konkrétně definovat, jaké tabulky má právo číst.
Jako poslední věc na straně masteru je restart MySQL serveru.
# service mysql restart
Teď už jen zbývá podívat se, jestli je master server připraven k replikaci.
To provedeme následujícím příkazem:
mysql> mysql SHOW MASTER STATUS;
který nám zobrazí následující tabulku:
+--------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------+----------+--------------+------------------+ | node1.000002 | 108 | | | +--------------+----------+--------------+------------------+
ve které nás budou obě hodnoty: File i Position zajímat, budeme je totiž potřebovat při konfiguraci slave serveru.
Hodnota Position se navíc zápisem do master databáze mění, při startování replikace je tedy vhodné zabránit vstupům do master databáze, než nastartuje slave, například shozením web serveru Apache.
Nastavení Slave serveru
Dále se podíváme na nastavení slave serveru, tedy tam kam se „bude replikovat“.
Do souboru /etc/mysql/my.cnf
přidáme:
server-id=2 master-host=10.0.0.1 master-user=replication master-password=password replicate-do-db=databaze log-warnings
Zde je nastavení podobné jako na master serveru, přibyly jen definice IP adresy, uživatele a hesla s jakým se bude slave k masteru připojovat
Nejzajímavější parametr je teď pro nás replicate-do-db
který nám říká které databáze chceme na slave replikovat.
Pokud na master serveru MySQL databáze již obsahuje nějaká data, je zapotřebí udělat MySQL dump, který posléze nahrajete do databáze na slavu, replikace se totiž neprovádí zpětně.
Dále sestavíme SQL příkaz který nám upřesní komunikaci mezi master a slave serverem.
Zde se nám budou hodit hodnoty File Position z příkazu SHOW MASTER STATUS;
provedeném na masteru.
Hodnotou File naplníme master_log_file
a Position se použije do master_log_pos
.
A vyjde Nám příkaz:
mysql> mysql CHANGE MASTER TO master_host = '10.0.0.1', master_user='replication', master_password='password', master_log_file='node1.000002', master_log_pos=108;
Ted na Slave serveru můžeme nastartovat replikaci:
mysql> mysql START SLAVE;
Níže uvedeným příkazem zkontrolujeme, zda je vše v pořádku:
mysql> mysql SHOW SLAVE STATUS\G;
Od teto chvíle cokoliv se stane na Masteru, se s malým zpožděním provede se i na Slave serveru.