Hlavní navigace

MySQL: Master - Slave replikace

26. 4. 2012
Doba čtení: 3 minuty

Sdílet

Pokud jste si někdy přáli mít stejná data ze své MySQL databáze na více místech najednou, tak tento článek vás jistě potěší. Dnes si totiž ukážeme Master – Slave replikaci na MySQL, což je databázová funkce, která přesně toto dělá. Řekneme si také proč je dobré replikovat a také si ukážeme, jak na to.

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:

Cloud 24 - tip 1

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.

Byl pro vás článek přínosný?