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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow