Replikace MySQL

Z DCEwiki
Skočit na navigaci Skočit na vyhledávání

Replikační mechanismus MySQL databáze zajišťuje udržení konzistentního stavu databází mezi master databází a slave databázemi.


Sestavení replikace

V konfiguračním souboru my.cnf na master stroji je potřeba uvést:

log-bin
server-id        = 1
expire_logs_days = 14

Master musí mít ID vždy rovné jedné. Expirování bin-logu zajistí, že neroste do nekonečna. Délka tohoto okna určuje, na jak dlouho se může replikace rozpadnout. Slave konfigurace v my.cnf musí obsahovat:

log-bin        = mysql-bin
server-id      = 2
report-host    = hostname

Master vidí slave pod uvedeným hostname. Slave může mít ID libovolné (kladné hodnoty, kromě 0 a 1). Nyní je potřeba vytvořit na master serveru uživatele s heslem, pod kterým se budou slave servery hlásit. Uživatel musí mít právo: REPLICATION SLAVE. Mělo by stačit toto:

mysql> CREATE USER 'replicator'@'slave_hostname' IDENTIFIED BY 'heslo%veslo';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'slave_hostname';

Aktuální stav databáze je nejlepší přenést z mastera na slave ručně pomocí mysqldump/mysql nebo prostým překopírování souborů z adresáře DB. Při kopírování je potřeba dát pozor na práva k souborům na slave stroji. Před samotným kopírováním dat musíme uzamknout tabulky pro zápis a zjistit aktuální pozici v bin-logu. V terminálu mysql na master stroji provedeme:

mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;

Terminál, kde byl uzamknut zámek, nesmíme zavřít - došlo by k odemčení zámku. Na master stroji provedeme export:

% mysqldump --all-databases -p | bzip2 -c -z > dbdump.bz2

Nějak (SCP/NFS/..) překopírujeme na slave stroj a importujeme:

% bzip2 -c -d dbdump.bz2 | mysql -p

Pokud se složka se soubory MySQL nachází na LVM, můžeme využit snapshotů na LVM. Lze tak významně zkrátit dobu po kterou musí být uzamknuty tabulky. Vytvoříme snapshot, odemkneme tabulky, připojíme snapshot a překopírujeme data na slave:

% lvcreate -L500M -s -n dbback /dev/vg0/srv
% mount /dev/vg0/dbback /mnt/db

Odemknutí zámku v původním mysql terminálu:

mysql> UNLOCK TABLES; 

Data překopírujeme a na slave stroji nastavíme práva mysql adresáře, spustíme MySQL server a v terminálu nastavíme připojení k master stroji:

mysql> CHANGE MASTER TO
  MASTER_HOST = 'master_hostname',
  MASTER_USER = 'username',
  MASTER_PASSWORD = 'password',
  MASTER_LOG_FILE = 'poznamenana_hodnota',
  MASTER_LOG_POS = poznamenana_pozice;

Replikaci spustíme příkazem:

  mysql> START SLAVE;
# umount /mnt/ops/dbbackup
# lvremove /dev/ops/dbbackup