MySQL
Replikacja
Szukaj…
Uwagi
Replikacja służy do kopiowania danych [Backup] z jednego serwera bazy danych MySQL na jeden lub więcej serwerów bazy danych MySQL.
Master - serwer bazy danych MySQL, który służy do kopiowania danych
Slave - serwer bazy danych MySQL, kopiuje dane obsługiwane przez Master
W MySQL replikacja jest domyślnie asynchroniczna. Oznacza to, że urządzenia podrzędne nie muszą być podłączone na stałe, aby otrzymywać aktualizacje od urządzenia nadrzędnego. Na przykład, jeśli twój Slave jest WYŁĄCZONY lub nie jest połączony z Master, a następnie włączasz Slave lub łączysz się z Master w późniejszym czasie, wówczas automatycznie zsynchronizuje się z Master.
W zależności od konfiguracji można replikować wszystkie bazy danych, wybrane bazy danych, a nawet wybrane tabele w bazie danych.
Formaty replikacji
Istnieją dwa podstawowe typy formatów replikacji
Replikacja oparta na instrukcjach (SBR) - która replikuje całe instrukcje SQL. W tym master zapisuje instrukcje SQL do dziennika binarnego. Replikacja elementu nadrzędnego na urządzeniu podrzędnym polega na wykonaniu instrukcji SQL na urządzeniu podrzędnym.
Replikacja oparta na wierszach (RBR) - która replikuje tylko zmienione wiersze. W tym przypadku moduł główny zapisuje zdarzenia w dzienniku binarnym, które wskazują, jak zmieniane są poszczególne wiersze tabeli. Replikacja elementu nadrzędnego do elementu podrzędnego polega na kopiowaniu zdarzeń reprezentujących zmiany w wierszach tabeli do elementu podrzędnego.
Możesz także użyć trzeciej odmiany, Mieszanej replikacji (MBR) . W tym przypadku wykorzystywane jest rejestrowanie zarówno na podstawie instrukcji, jak i na podstawie wierszy. Dziennik zostanie utworzony w zależności od tego, który jest najbardziej odpowiedni dla zmiany.
Format oparty na instrukcjach był domyślny w wersjach MySQL starszych niż 5.7.7. W MySQL 5.7.7 i nowszych domyślny jest format oparty na wierszach.
Konfiguracja replikacji Master - Slave
Rozważ 2 serwery MySQL do konfiguracji replikacji, jeden to Master, a drugi to Slave.
Zamierzamy skonfigurować Master, aby prowadził dziennik każdej wykonanej na nim akcji. Zamierzamy skonfigurować serwer Slave, aby sprawdzał dziennik na Master i za każdym razem, gdy nastąpią zmiany w logu na Master, powinien robić to samo.
Konfiguracja główna
Przede wszystkim musimy utworzyć użytkownika na Master. Ten użytkownik będzie używany przez Slave do utworzenia połączenia z Master.
CREATE USER 'user_name'@'%' IDENTIFIED BY 'user_password';
GRANT REPLICATION SLAVE ON *.* TO 'user_name'@'%';
FLUSH PRIVILEGES;
Zmień user_name
i user_password
według nazwy użytkownika i hasła.
Teraz my.inf
(my.cnf w systemie Linux) powinien być edytowany. Uwzględnij następujące wiersze w sekcji [mysqld].
server-id = 1
log-bin = mysql-bin.log
binlog-do-db = your_database
Pierwszy wiersz służy do przypisania identyfikatora do tego serwera MySQL.
Drugi wiersz mówi MySQL, aby zaczął zapisywać dziennik w określonym pliku dziennika. W Linuksie można to skonfigurować jak log-bin = /home/mysql/logs/mysql-bin.log
. Jeśli rozpoczynasz replikację na serwerze MySQL, na którym replikacja była już używana, upewnij się, że w tym katalogu nie ma żadnych dzienników replikacji.
Trzeci wiersz służy do skonfigurowania bazy danych, dla której będziemy zapisywać dziennik. Powinieneś zastąpić your_database
danych nazwą swojej bazy danych.
Upewnij się, że skip-networking
nie jest włączone i zrestartuj serwer MySQL (Master)
Konfiguracja Slave
Plik my.inf
powinien być również edytowany w Slave. Uwzględnij następujące wiersze w sekcji [mysqld].
server-id = 2
master-host = master_ip_address
master-connect-retry = 60
master-user = user_name
master-password = user_password
replicate-do-db = your_database
relay-log = slave-relay.log
relay-log-index = slave-relay-log.index
Pierwszy wiersz służy do przypisania identyfikatora do tego serwera MySQL. Ten identyfikator powinien być unikalny.
Druga linia to adres IP serwera głównego. Zmień to zgodnie z adresem IP swojego systemu głównego
Trzeci wiersz służy do ustawienia limitu ponownych prób w sekundach.
Następne dwa wiersze podają nazwę użytkownika i hasło do urządzenia podrzędnego, za pomocą którego łączy się z urządzeniem nadrzędnym.
W następnym wierszu ustaw bazę danych, którą musi replikować.
Dwa ostatnie wiersze używane do przypisywania nazw plików relay-log
relay-log-index
i relay-log
relay-log-index
.
Upewnij się, że skip-networking
nie jest włączone i zrestartuj serwer MySQL (Slave)
Skopiuj dane do Slave
Jeśli dane są ciągle dodawane do Master, będziemy musieli uniemożliwić dostęp do wszystkich baz danych na Master, aby nic nie można było dodać. Można to osiągnąć, uruchamiając następującą instrukcję w Master.
FLUSH TABLES WITH READ LOCK;
Jeśli do serwera nie są dodawane żadne dane, możesz pominąć powyższy krok.
Zamierzamy wykonać kopię zapasową danych Master przy użyciu mysqldump
mysqldump your_database -u root -p > D://Backup/backup.sql;
Zmień your_database
i katalog kopii zapasowej zgodnie z konfiguracją. Będziesz teraz mieć plik o nazwie backup.sql
w podanej lokalizacji.
Jeśli Twoja baza danych nie istnieje w Slave, utwórz ją, wykonując następujące czynności
CREATE DATABASE `your_database`;
Teraz musimy zaimportować kopię zapasową do serwera Slave MySQL.
mysql -u root -p your_database <D://Backup/backup.sql
--->Change `your_database` and backup directory according to your setup
Rozpocznij replikację
Aby rozpocząć replikację, musimy znaleźć nazwę pliku dziennika i pozycję dziennika w module głównym. Więc uruchom następujące w Master
SHOW MASTER STATUS;
To da ci wynik jak poniżej
+---------------------+----------+-------------------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+-------------------------------+------------------+
| mysql-bin.000001 | 130 | your_database | |
+---------------------+----------+-------------------------------+------------------+
Następnie uruchom następujące polecenie w Slave
SLAVE STOP;
CHANGE MASTER TO MASTER_HOST='master_ip_address', MASTER_USER='user_name',
MASTER_PASSWORD='user_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=130;
SLAVE START;
Najpierw zatrzymujemy Niewolnika. Następnie mówimy dokładnie, gdzie szukać w głównym pliku dziennika. W MASTER_LOG_FILE
nazwy MASTER_LOG_FILE
i MASTER_LOG_POS
użyj wartości, które otrzymaliśmy, uruchamiając polecenie SHOW MASTER STATUS
na urządzeniu głównym.
Powinieneś zmienić adres IP urządzenia nadrzędnego w MASTER_HOST
oraz odpowiednio zmienić użytkownika i hasło.
Slave będzie teraz czekał. Status urządzenia podrzędnego można wyświetlić, uruchamiając następujące polecenie
SHOW SLAVE STATUS;
Jeśli wcześniej FLUSH TABLES WITH READ LOCK
w Master, zwolnij tabele z blokady, wykonując następujące czynności
UNLOCK TABLES;
Teraz Master prowadzi dziennik dla każdej wykonywanej na nim akcji, a serwer Slave patrzy na dziennik na Master. Ilekroć nastąpią zmiany w logowaniu na Master, Slave powiela to.
Błędy replikacji
Ilekroć wystąpi błąd podczas uruchamiania zapytania w urządzeniu slave, MySQL automatycznie zatrzymuje replikację, aby zidentyfikować problem i go naprawić. Jest tak głównie dlatego, że zdarzenie spowodowało zduplikowanie klucza lub nie znaleziono wiersza i nie można go zaktualizować ani usunąć. Możesz pominąć takie błędy, nawet jeśli nie jest to zalecane
Aby pominąć tylko jedno zapytanie zawieszające slave, użyj następującej składni
SET GLOBAL sql_slave_skip_counter = N;
To oświadczenie pomija następne N zdarzeń z mastera. Ta instrukcja jest ważna tylko wtedy, gdy wątki podrzędne nie są uruchomione. W przeciwnym razie spowoduje błąd.
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;
W niektórych przypadkach jest to w porządku. Ale jeśli wyciąg jest częścią transakcji złożonej z wielu wyciągów, staje się bardziej złożony, ponieważ pominięcie wyciągu powodującego błąd spowoduje pominięcie całej transakcji.
Jeśli chcesz pominąć więcej zapytań, które generują ten sam kod błędu i jeśli masz pewność, że pominięcie tych błędów nie spowoduje niespójności urządzenia slave i chcesz je wszystkie pominąć, dodaj wiersz, aby pominąć ten kod błędu w my.cnf
.
Na przykład możesz pominąć wszystkie duplikaty błędów, które możesz napotkać
1062 | Error 'Duplicate entry 'xyz' for key 1' on query
Następnie dodaj następujące elementy do my.cnf
slave-skip-errors = 1062
Możesz pominąć także inne rodzaje błędów lub wszystkie kody błędów, ale upewnij się, że pominięcie tych błędów nie spowoduje niespójności urządzenia slave. Poniżej przedstawiono składnię i przykłady
slave-skip-errors=[err_code1,err_code2,...|all]
slave-skip-errors=1062,1053
slave-skip-errors=all
slave-skip-errors=ddl_exist_errors