Z pogranicza

Replikacja MySQL

Jak poważne straty może spowodować utrata danych (np. w wyniku awarii dysku) nie trzeba nikogo przekonywać. Regularne wykonywanie kopii bezpieczeństwa pozwoli zminimalizować straty, jednak są sytuacje, w których nie można sobie pozwolić na utratę danych choćby z ostatnich godzin. Administrując systemem obsługi laboratorium analitycznego przeżyłem niedawno chwile grozy, kiedy system wykazywał oznaki uszkodzenia dysku. Co prawda możliwe było odzyskanie danych z poprzedniego dnia, ale pół dnia pracy (kilka tysiecy badań), to zbyt duże straty... Wtedy postanowiłem podjąć kroki mające niewielkim kosztem (bez dodatkowych nakładów?) zapewnić tworzenie kopii na bieżąco.

Takim właśnie rozwiązaniem jest replikacja serwera MySQL (dostępna od wersji 3.25.15).
Konfiguracja jest banalnie prosta, nie zajmuje wiecej niż kilkanaście minut. Omówie to krok po kroku:
1. Na dowolnym (możliwie najmniej obciążonym) komputerze w sieci instalujemy drugi serwer MySQL.
2.  Na głównym serwerze dodajemy użytkownika z uprawnieniami REPLICATION SLAVE (w starszych wersjach FILES)
3. Zatrzymujemy nasz dotychczasowy serwer (to najprostsze rozwiązanie, przerwa nie potrwa dłużej niż kilkanaście minut, więc da się to przeprowadzić w każdym systemie)
4. Dokonujemy następujących wpisów w pliku konfiguracyjnym serwera, w sekcji [mysqld]:

#dowolna wartość od 1 do 2^32 jako unikalny numer serwera MySQL w sieci
server-id=1 
# włączamy dziennik binarny
log-bin
#podajemy nazwę bazy danych, można wymienić kilka baz w kolejnych wierszach
binlog-do-db=baza_do_replikacji 


5. Kopiujemy bazy które podlegać będą replikacji na serwer podrzędny (z katalogu 'data' serwera MySQL - jeśli serwer jest zatrzymany można kopiować całe katalogi baz danych)

6. Na 'nowym' serwerze dokonujemy następujących wpisów w pliku konfiguracyjnym

#dowolna wartość od 1 do 2^32 jako unikalny numer serwera MySQL w sieci
# ważne aby każdy serwer w systemie miał inny server-id
server-id=7
# nazwa lub adres IP serwera MySQL, dopuszczalne nazwy DNS
master-host=192.168.100.1
# użytkownik którego założyliśmy na serwerze głównym
master-user=slave_user
# hasło tego użytkownika
master-password=slave_pass
# port - z mojej praktyki wynika, że należy podać, nawet jeśli pracuje na domyślnym
master-port=3306
# bazy danych które podlegają replikacji na serwerze podrzędnym
# dopuszczalne jest podanie kilku baz w kolejnych wierszach
replicate-do-db=baza_do_replikacj


7. Uruchamiamy serwer główny (Master)
8. Uruchamiamy serwer podrzędny (Slave)

Od tej chwili, wszelkie zmiany wprowadzane na serwerze głównym niemal natychmiast są aktualizowane na serwerze podrzędnym - ale są to tylko zmiany w wyniku instrukcji MySQL`a - awaria dysku, całego serwera, czy nawet "przypadkowe" skasowanie tabeli (całej bazy) nie znajduje oczywiście odbicia na serwerze podrzędnym. Mamy więc kopie bazy na bieżąco, bez obciążania, bez pilnowania userów.... Co więcej, serwer podrzędny wcale nie musi pracować cały czas - jeśli nie pracuje, to oczywiście nie aktualizuje zmian, jednak 'pamieta' gdzie skończył replikacje i po uruchomieniu 'nadrabia' zaległości.


To jednak nie wszystko co możemy zyskać uruchamiając replikacje MySQL - można w znacznym stopniu poprawić wydajność naszego systemu - ale to zagadnienie, jak i samą zasadę działania replikacji, dodatkowe opcje konfiguracyjne, opiszę w odrębnym artykule - przygotowuje też mechanizm automatycznego przejęcia żądań przez serwer Slave w przypadku awarii serwera Master, jednak najpierw sprawdzę jego działanie w administrowanych przeze mnie systemach ;)

2 komentarze

Za Horyzontem 2007-01-01 22:09

Jasne że FILE ;)

x10d 2005-07-15 00:15

2.  Na głównym serwerze dodajemy użytkownika z uprawnieniami REPLICATION SLAVE (w starszych wersjach FILES)

Nie wiem, czy to ma znaczenie, ale w dokumentacji mysql jest FILE, a nie FILES :)