MySQL master-slave replikáció

Időről időre előkerülő téma a MySQL replikáció kérdése, hogy milyen jó is lehet az ha tudunk olyat csinálni. Jól jöhet például egy PowerDNS szervernél, ha nem az AXFR protokollt felhasználva akarunk master-slave architektúrát kialakítani, de hasznos lehet még akkor is, ha magas rendelkezésreállást, live biztonsági mentést (itt a mentés talán kicsit sántíthat is bizonyos értelemben), vagy épp csak a fejlesztéshez folyamatosan éles adatokat szeretnénk használni többlet munka (kézi szinkronizálás) és az éles adatbázis veszélyeztetése nélkül. Ezen gondolatok eredményeképp született az alábbi kis leírás (Ubuntu linuxra), hogy hogyan is kell egy oda-vissza master-slave architectúrát kialakítani, amelynek segítségével a két adatbázis kiszolgáló valamelyikén végzett módosítás azonnal megtörténik a másikon is.

Első lépésként ha ez még nem történt volna meg, akkor mindkét gépre fel kell telepíteni a MySQL szerver alkalmazást. Ezt a következő két parancs konzolon történő kiadásával tehetjük meg:

$sudo apt-get update
$sudo apt-get install mysql-server

Előfordulhat, hogy a telepítő nem kérdezi meg a root felhasználó jelszavát. Ilyenkor kezdetben nem rendelkezik jeszóval (Fontos! Az üres jelszó és a jelszó hiánya nem ugyanazt jelenti!).

Ezt követően valamely szimpatikus szövegszerkesztővel (például vim) meg kell nyitni szerkesztésre a /etc/mysql/my.cnf fájlt, amiben a következő módosításokat kell mind a két gépen elvégezni:

$sudo vim /etc/mysql/my.cnf

[mysqld]
log-bin = mysql-bin
server-id = 19216801 # az egyediséget biztosítandó ide a szerver IP címét érdemes írni (pontok nélkül!)
auto_increment_increment  = 10
auto_increment_offset = 1
#bind-address  = 127.0.0.1    # kikommentezve kell legyen!

A log-bin és a server-id sorork telepítés után kikommentezve szerepeltek a konfigurációs fájlomba, így a log-bin sor elejéről csak a # jelet kell eltávolítani (ha szerepel utána fájlnév),  míg a server-id esetében az értéket is módosítani kell. A bind-address sor kivételével érhető el, hogy a MySQL daemon minden elérhető IP címen figyeljen, ne csak a localhost-on. Enélkül a szerver nem lenne elérhető a hálózaton keresztül!

Előfordulhat, hogy a frissen telepített MySQL szerver nem lesz azonnal elindítva. Ilyenkor annak elindításáról a következő paranccsal kell gondoskodni:

$sudo service mysql start

A sikeres indításról pedig a következőképp lehet például meggyűződni:

$sudo service mysql status

Abban az esetben, ha már előzőleg el volt indítva (pl mert a telepítő elindította), akkor az előbbi utasítás start paraméterét restart-ra cserélve újra kell indítani a MySQL-t az új konfiguráció érvényre juttatásához.

Ezt követően a master kiszolgálón létre kell hozni egy replikációs felhasználót, amivel a slave képes lesz bejelentkezni arra. Figyelem! Esetünkben mindkét szerver egyszerre lesz master és slave is! A felhasználók létrehozásához a mysql konzolos segédprogram segítségével a következő SQL utasításokat kell kiadni a szervernek (természetsen lehetne akár phpMyAdmin-t is használni, azonban azt itt macerásabbnak érzem):

$mysql -u root -p

CREATE USERreplicant@'%' IDENTIFIED BY 'password';
GRANT SELECT, PROCESS, FILE, SUPER, REPLICATION CLIENT, REPLICATION SLAVE, RELOAD ON *.* TO replicant@'%';
FLUSH PRIVILEGES;

Mostanra mind a két szerver kész betölteni egy master kiszolgáló szerepét, így már csak azt kellene elérni, hogy párhuzamosan a slave működést is megvalósítsák. Ha csak az egyik irányba szeretnénk replikálni az adatokat, akkor elegendő csak az egyik kiszolgálón elvégezni a következőkben leírtakat, egyébként pedig mindkettőn szükséges.

$mysql -u root -p

CHANGE MASTER TO
MASTER_HOST='ip_of_server2',
MASTER_USER='replicant',
MASTER_PASSWORD='password';
START SLAVE;
SHOW SLAVE STATUS\G;

Abban az esetben, ha egy már korábbról meglévő (tehát adatokat is tartalmazó) MySQL kiszolgáló mellé került beállításra egy slave, akkor szükséges a master adatait átmásolni a slave kiszolgálóra. Ezt régebbi MySQL verzió esetén a következő SQL utasítás mysql konzolon történő kiadásával lehet megtenni:

LOAD DATA FROM MASTER;

Ez azonban egy hivatalosan ellenjavallt és jelenleg már kivezetett megoldás, ezért célszerűbb a mysqldump vagy a mysqlhotcopy alkalmazása. Ezek használatát itt nem részletezem (lásd előbbi linkek).

Elméletileg már működnie is kellene a dupla master-slave architektúrának. Erről a legegyszerűbben úgy győződhetünk meg, ha nyitunk egy-egy ssh konzolt a két gép felé, amiken indítunk egy-egy mysql konzolt. Ezt követően az egyik gépen elvégzett módosíts (pl. adatbázis- létrehozás, törlés, stb) azonnal meg kell történjen a másik oldalon is.