Replikacja MySQL to interesująca funkcja, która pozwala użytkownikom zarządzać wieloma kopiami jednej lub więcej baz danych MySQL. Dane są kopiowane automatycznie z źródłowych do replikowanych baz danych. Może to być przydatne w wielu sytuacjach, takich jak praca z danymi bez narażania głównej bazy danych, tworzenie kopii zapasowych danych lub skalowanie dostępu do bazy danych itp.
W tym poradniku omówimy kroki konfiguracji instancji MySQL na jednym serwerze jako bazy źródłowej, a następnie skonfigurowania instancji MySQL na innym serwerze, aby działała jako jej replika.
Wymagania wstępne
Ten poradnik zademonstruje bardzo prosty przykład replikacji MySQL. Obejmuje on jedną źródłową i jedną replikowaną bazę danych. Baza źródłowa jest główną kopią bazy danych, podczas gdy baza replika będzie repliką źródłowej bazy danych. Na potrzeby naszej demonstracji skonfigurowano dwa serwery o następujących adresach IP:
- Serwer źródłowy: 31.171.240.179
- Serwer repliki: 31.171.250.139
Każdy serwer jest skonfigurowany z najnowszą wersją Ubuntu 20.04 server. Najpierw wykonaj kroki z samouczka, które pokazują jak skonfigurować serwer Ubuntu. Pamiętaj, że liczba baz replik może być większa. Ten poradnik zakłada, że masz już zainstalowany i skonfigurowany serwer MySQL. Potrzebujesz pomocy z instalacją MySQL? Ten poradnik szczegółowo przedstawia kroki instalacji i podstawowego użytkowania MySQL.
Krótko mówiąc, oto pakiety, których potrzebujesz:
|
1 |
$ sudo apt install mysql-server mysql-client |
Zapory sieciowe (firewalle) na obu systemach powinny być skonfigurowane tak, aby zezwalać na ruch z obu systemów na porcie 3306. Jest to domyślny port dla MySQL. Możesz dowiedzieć się więcej o podstawach UFW wraz z demonstracją z naszego wpisu na blogu.
Konfiguracja źródłowej bazy danych
-
Dostrajanie konfiguracji MySQL
MySQL używa my.cnf jako głównego pliku konfiguracyjnego. Zaktualizujemy my.cnf, aby wyznaczyć serwer jako źródłowy. Najpierw otwórz plik konfiguracyjny za pomocą edytora tekstu:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
Następnie dodaj poniższe linie w sekcji mysqld:
|
1 2 3 4 |
bind-address = 31.171.240.179 server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = newdatabase |
Co oznaczają te linie?
bind-address: To wpis, który definiuje powiązanie między usługą a adresem IP. Domyślnie wartością może być127.0.0.1(localhost). Nową wartością będzie adres IP serwera.server-id: W replikacji MySQL każdy serwer must mieć unikalny identyfikator serwera (server ID). Może to być dowolna liczba. Dla uproszczenia ustawiono go na1.log_bin: Przechowuje rzeczywiste szczegóły replikacji. Baza danych repliki skopiuje wszystko, co zostało zarejestrowane w logu.binlog_do_db: Ten wpis wskazuje bazę danych, która będzie podlegać replikacji na serwerze repliki. Baz danych może być więcej niż jedna. W tym przypadku przykładową bazą danych jestnewdatabase.
Po wprowadzeniu zmian zapisz plik konfiguracyjny. MySQL wymaga restartu, aby załadować zmiany w my.cnf:
|
1 |
$ sudo service mysql restart |
-
Nadawanie uprawnień użytkownikowi repliki
Kolejnym krokiem jest utworzenie użytkownika repliki i nadanie mu odpowiednich uprawnień. Należy to zrobić z poziomu powłoki MySQL. Najpierw uruchom powłokę MySQL:
|
1 |
$ sudo mysql -u root -p |
Następnie utwórz dedykowanego użytkownika dla bazy danych repliki. Odpowiednio zmień nazwę użytkownika i hasło:
|
1 |
$ CREATE USER 'cloudsigma_s'@'31.171.240.179' IDENTIFIED BY 'password_123'; |
Teraz nadaj użytkownikowi odpowiednie uprawnienia:
|
1 |
$ GRANT REPLICATION SLAVE ON *.* TO 'cloudsigma_s'@'31.171.240.179'; |
Więcej informacji o użytkownikach i uprawnieniach MySQL znajdziesz w naszym wpisie na blogu. Następnie przeładuj tabelę uprawnień, aby zmiany weszły w życie:
|
1 |
$ FLUSH PRIVILEGES; |
-
Dostrajanie bazy danych
Potrzebujemy kopii źródłowej bazy danych na replice. Istnieje możliwość ręcznego zbudowania struktury. Jednak w większości przypadków jest to dość niewygodne. Dlatego bezpośredni eksport bazy danych jest najbardziej optymalnym rozwiązaniem. W tym przykładzie źródłową bazą danych jest newdatabase. Zmień bieżącą bazę danych:
|
1 |
$ USE newdatabase; |
Poniższe polecenie zablokuje bazę danych, zapobiegając wprowadzaniu nowych zmian:
|
1 |
$ FLUSH TABLES WITH READ LOCK; |
Następnie sprawdź status bazy danych:
|
1 |
$ SHOW MASTER STATUS; |
Z tej pozycji baza danych repliki rozpocznie replikację ze źródła. Te liczby będą przydatne później, więc warto je zapisać. Jeśli jakiekolwiek zmiany zostaną wprowadzone z tego samego okna, MySQL automatycznie odblokuje bazę danych. Dlatego zaleca się wykonanie kolejnych kroków w innej karcie lub oknie terminala. Baza danych jest nadal zablokowana. Wyeksportuj ją do przenośnego pliku SQL:
|
1 |
$ mysqldump -u root -p --opt newdatabase > newdatabase.sql |
Zadanie zostało zakończone. Następnie odblokuj bazę danych:
|
1 |
$ UNLOCK TABLES; |
Na koniec wyjdź z powłoki:
|
1 |
$ QUIT; |
Konfiguracja repliki
Teraz nadszedł czas na skonfigurowanie bazy danych repliki.
-
Importowanie źródłowej bazy danych
Potrzebujemy kopii źródłowej bazy danych na serwerze repliki. W tym celu użyjemy wyeksportowanego wcześniej pliku SQL. Uruchom powłokę MySQL:
|
1 |
$ sudo mysql -u root -p |
Następnie utwórz pustą bazę danych, używając tej samej nazwy bazy danych:
|
1 |
$ CREATE DATABASE newdatabase; |
Następnie wyjdź z powłoki:
|
1 |
$ EXIT; |
Teraz zaimportuj plik SQL do bazy danych:
|
1 |
$ sudo mysql -u root -p newdatabase < newdatabase.sql |
-
Dostrajanie konfiguracji MySQL
W pliku konfiguracyjnym MySQL należy zadeklarować kilka rzeczy. Otwórz plik konfiguracyjny w edytorze tekstu:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
Poniższe wpisy powinny znaleźć się w sekcji mysqld. W przeciwnym razie to nie zadziała. Pierwszym z nich jest identyfikator serwera (server ID). Jak wspomniano wcześniej, musi on być unikalny dla wszystkich serwerów w konfiguracji replikacji źródło-replika. Na potrzeby demonstracji ustawiono go na 2:
|
1 |
$ server-id = 2 |
Następnie dodaj następujące linie:
|
1 2 3 |
$ relay-log = /var/log/mysql/mysql-relay-bin.log $ log_bin = /var/log/mysql/mysql-bin.log $ binlog_do_db = newdatabase |
W tym miejscu tylko relay-log jest nowym wpisem. Jest to dziennik, który serwer repliki tworzy podczas replikacji. Format dziennika jest taki sam jak w przypadku dziennika binarnego. Zapisz plik konfiguracyjny i zrestartuj MySQL:
|
1 |
$ sudo service mysql restart |
-
Włączanie replikacji
Na koniec jesteśmy gotowi do włączenia replikacji z poziomu MySQL. Uruchom powłokę MySQL:
|
1 |
$ sudo mysql -u root -p |
Uruchom następujące polecenie. Najpierw odpowiednio zmień adres IP, nazwę użytkownika i hasła:
|
1 |
$ CHANGE MASTER TO MASTER_HOST='31.171.240.179',MASTER_USER='cloudsigma_master', MASTER_PASSWORD='password_123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107; |
Polecenie to realizuje następujące zadania:
- Bieżący serwer zostaje oznaczony jako replika serwera źródłowego.
- Serwer repliki posiada odpowiednie dane logowania.
- Serwer repliki wie, od którego miejsca rozpocząć replikację. Pamiętasz status bazy danych, który sprawdzaliśmy na serwerze źródłowym? Stamtąd pochodzą plik dziennika źródłowego i pozycja dziennika.
Na koniec aktywuj serwer repliki:
|
1 |
$ START REPLICA; |
-
Różne
Chcesz sprawdzić szczegóły bieżącego stanu repliki? Uruchom następujące polecenie w powłoce MySQL. Znak \G na końcu służy do zmiany układu tekstu, aby uczynić go bardziej czytelnym:
|
1 |
$ SHOW REPLICA STATUS\G |
Jeśli wystąpi problem z połączeniem, spróbuj uruchomić serwer repliki, aby go pominąć:
|
1 |
$ SET GLOBAL SQL_REPLICA_SKIP_COUNTER = 1; REPLICA START; |
Podsumowanie
Replikacja MySQL niesie za sobą wiele konsekwencji. To tylko krótka demonstracja jej podstawowej formy. Można ją jednak łatwo rozszerzyć na konfiguracje z wieloma źródłami i replikami. Te same kroki będą miały zastosowanie również do wszelkich bardziej złożonych konfiguracji wyższego poziomu. Zawsze warto przetestować konfigurację po jej zakończeniu. Spróbuj wykonać kilka poleceń insert, delete lub update na źródłowej bazie danych. Jeśli konfiguracja działa, baza danych repliki powinna poprawnie wszystko pobrać.
Ponadto możesz zapoznać się z dodatkowymi materiałami na naszym blogu, opisującymi, co można zrobić z MySQL:
- SQLite vs MySQL vs PostgreSQL: porównanie relacyjnych systemów zarządzania bazami danych
- Jak zresetować hasło roota w MariaDB lub MySQL
- Jak zainstalować stos LEMP (Linux, Nginx, MySQL PHP) na Ubuntu 20.04
Miłego korzystania!







Komentarze
Brak komentarzy. Bądź pierwszy.