Replikace MySQL
Pokud stejně jako já budete používat datbázi s několika tisíci uživateli, postupem času zjistíte, že pouhé on-line backupy MySQL nestačí a je potřeba replikovat. Důvodů může být hned několik – od velkého loadu primární MySQL až po potřebu provozovat relativně aktuální kopie databází na jiném místě.
Mě osobně se týkají obě situce. V prvním případě jsem potřeboval snížit load datbáze o kterou se dělí hned několik služeb (Radius, SMTP AUTH, stistiky provozu apod.). Ve druhém případě jsem se rozhodl alespoň pro velké uzly postavit samostatné radius servery (s replikovanou databází klientů) které budou vždy připraveny v případě výpadku parentích serverů.
Jak na to?
Na hlavním stroji, ze kterého budeme databázi replikovat musíme nastavit v hlavním konfiguračním souboru MySQL (obvykle /etc/mysql.conf) – konkrétně v sekci [mysqld] následující:
#bind-address = 127.0.0.1
log-bin
server-id=1
binlog-do-db = radius
binlog-do-db = conntrack
binlog-ignore-db = mysql
Pokud je to potřeba, bindneme si MySQL klidně na nějakou jinou IP – ovšem tak ale, aby jsme se na ni z venku dostali.V dalším kroku je potřeba upravit práva pro přístup. To uděláme přes standardní cmd-line utilitu takto:
Přihlásíme se k MySQL a zadáme heslo pro root-a
# mysql -u root -p
Nastavíme práva pro replikaci
mysql> GRANT REPLICATION SLAVE ON *.* TO nejaky_uzivatel@stroj IDENTIFIED BY 'nejake_heslo';FLUSH PRIVILEGES;
Opustíme CMD-line utilitu
mysql> quit
Nyní se přesuneme na stroj kam budeme replikovat. Opět si otevřeme hlavní konfigurační soubor mysql a do sekce [mysqld] přidáme totók:
server-id = 2
master-host = ip_adresa_hlavni_mysql
master-user=nejky_uzivatel
master-password=nejake_heslo
replicate-do-db=databaze
log-warnings
Položky by měly být jasné, pro jistotu je však vysvětlím. Na první řádek dopíšeme IP adresu mysql ze které budeme replikovat, na druhém řádku napíšeme, pod kterým uživatelem a nakonec jakým heslem. Položka server-id značí UNIKÁTNÍ ID. Osobně doporučuji používat pro master ID 1, pro prvního slejva ID 2, pro druhého slejva ID 3 atd…
Co se týče replikace samotné – verze MySQL serverů by měly sedět. Pokud tomu tak není, doporučuji dát alesoň na master server nižšší verzi MySQL než na slave. Také je vhodné před započetím replikace odstranit „všechny chyby“ v databázích (a to příkazem mysqlcheck nazev_datbaze -u root -p –auto-repair). Osobně dělám replikaci z Gentoo Linuxu (MySQL 4.1.21-log) na Ubuntu Linux (MySQL 5.0.24a-Debian_9ubuntu2-log) a nemám jediný problém. Malinká odchylka u různých distribucí obvykle bývá pouze ve výchozích znakových stránkách. Ty velice jednoduše sjednotíte na obou databázových serverech v hlavním konfiguračním souboru například za pomocí následujících parametrů:
character-set-server = utf8
default-character-set = utf8
Aktuálně by již pouhým restartem MySQL serverů mohla začít samotná replikace. Bohužel tento proces by trval neúměrně dlouho a tak je lepší nejprve patřičná data z hlavní databáze zkopírovat na slejva. To lze dvěma způsoby a to pomocí příkazu mysqldump a mysqlrestore nebo klasickým cp přes scp (sftp či jiný protokol). Pro ty z Vás, kteří používáte metodu „drsňák“, upozorrňuji, že po zkopírování je potřeba opravit přístupová práva (obvykle chown -R mysql:mysql /var/lib/mysql).
Po restartu Mastra i Slejva můžete kontrolovat proces replikace. U mastra za pomocí příkazu SHOW MASTER STATUS;, u slejva pak pomocí SHOW SLAVE STATUS\G. Pokud se slejvovi nechce, zkuste ho popohnat příkazem SLAVE START a nebo LOAD DATA FROM MASTER.
velmi dobrý je produkt MyDNS, dají se tak replikovat pohodlně DNS sekundáry…
30 května, 2007 at 12:55 pmAhojky, super článek, tohle jsem přesně hledal. Snažím se to rozběhat na win. Mašiny se spojí, ale je někde nějaká botka, budeš mi moci prosím poradit? ICQ 252746181. Díky nuninek
2 listopadu, 2009 at 11:19 amnieco podobne v anglictine je aj tu
13 května, 2010 at 3:31 pmhttp://www.softwareprojects.com/resources/programming/t-how-to-move-copy-a-live-mysql-database-and-what-1257.html