MySQL to system zarządzania relacyjnymi bazami danych, który jest jednym z najpopularniejszych projektów open-source. Chociaż znany ze swojej stabilności, MySQL jest jeszcze bardziej niezawodny, jeśli skonfigurowana jest replikacja źródła-replika. Podczas replikacji jeden serwer MySQL jest zwykle określany jako źródło . Źródło wysyła wszelkie zmiany bazy danych i aktualizacje danych do co najmniej jednej repliki serwery baz danych. Procedura replikacji danych MySQL jest elastyczna, a serwery replik nie muszą być na stałe połączone ze źródłem. Ten przewodnik wyjaśnia, jak skonfigurować replikację danych źródłowych repliki w MySQL.
Jak działa replikacja danych MySQL
Proces replikacji najpierw przechowuje dane w źródłowej bazie danych, a następnie kopiuje je do dowolnych replik. Po przetworzeniu instrukcji serwer źródłowej bazy danych śledzi zmianę w dzienniku binarnym. Dziennik służy jako sekwencyjny zapis wszystkich zmian w strukturze i zawartości bazy danych. SELECT oświadczenia nie są rejestrowane, ponieważ nie zmieniają zawartości bazy danych.
Aktualizacje odbywają się asynchronicznie, więc repliki nie muszą być stale połączone. Kontrastuje to z architekturą synchroniczną systemów o wysokiej niezawodności. Jeśli wymagana jest synchronizacja w czasie rzeczywistym, MySQL zaleca użycie klastra NDB .
Każda replika pobiera dane ze źródła, żądając zawartości dziennika binarnego źródła. Replika następnie stosuje oświadczenia w kolejności, skutecznie odtwarzając zdarzenia, które miały miejsce w źródle. Każda replika jest niezależna i śledzi swoją aktualną pozycję za pomocą źródłowego dziennika binarnego. Dodatkowo każda replika może synchronizować się ze źródłem według własnego harmonogramu. Dane można odczytać z dowolnego serwera, w tym z replik.
MySQL pozwala na wysoki stopień szczegółowości. Możliwa jest replikacja w określonych bazach danych lub nawet w określonych tabelach w bazie danych. Domyślny format replikacji to Replikacja oparta na wyciągach (SBR), w którym replikowana jest cała instrukcja SQL. Jednak Replikacja oparta na wierszach (RBR) jest również dostępny. Ten format replikuje zmienione wiersze. Możliwe jest również skonfigurowanie bardziej skomplikowanych konfiguracji wiele-do-wielu. Zapoznaj się z dokumentacją MySQL, aby uzyskać więcej informacji na temat różnych opcji replikacji.
Uwaga MySQL wcześniej określał replikację Source-Replica jako „Replikację Master-Slave”. Organizacja MySQL niedawno zmieniła terminologię, wyjaśniając swoje rozumowanie w aktualizacji aterminologii. Starszy termin „master” został zmieniony na „źródło”, a „slave” jest teraz określany jako „replika”. Stare terminy mogą nadal pojawiać się w niektórych poleceniach i ekranach wyjściowych, podczas gdy MySQL aktualizuje swoją bazę kodu. Ten przewodnik używa preferowanych terminów MySQL w instrukcjach.
Zalety replikacji danych MySQL
Włączenie replikacji źródła-repliki ma wiele istotnych zalet w porównaniu z systemem bez nadmiarowości. Poniższa lista zawiera przegląd niektórych korzyści:
-
Tworzenie kopii zapasowej na żywo w dowolnym momencie jest łatwe. Ponieważ proces replikacji jest asynchroniczny, replikacja może przebiegać zgodnie z dowolnym harmonogramem. Repliki nie muszą być zsynchronizowane ze źródłem, aby działać niezawodnie.
-
Dodanie repliki może wydłużyć czas pracy i niezawodność całego systemu. Podstawowa kontrola może przełączyć się na replikę, jeśli wymagana jest konserwacja lub źródłowa baza danych jest niedostępna.
-
Każda replika zapewnia kolejną czytelną instancję bazy danych. Pozwala to programom do eksploracji danych lub analizy na wysyłanie zapytań do repliki bez dodatkowego obciążania oryginalnej źródłowej bazy danych.
-
Ta architektura zwiększa skalowalność i wydajność. Odczyty bazy danych i
SELECToświadczenia mogą być zrównoważone między serwerami, zmniejszając opóźnienia. -
Strony trzecie mogą uzyskać dostęp tylko do odczytu do bazy danych za pośrednictwem repliki i nie wymagają już dostępu do źródła. Replikę bazy danych można utworzyć na żądanie, gdy jest potrzebna, i zniszczyć, gdy nie jest już potrzebna. Ta technika zwiększa bezpieczeństwo i uniemożliwia manipulowanie oryginalnymi danymi.
Zanim zaczniesz
-
Jeśli jeszcze tego nie zrobiłeś, utwórz konto Linode i instancję obliczeniową. Zobacz nasze przewodniki Wprowadzenie do Linode i tworzenie instancji obliczeniowej.
-
Postępuj zgodnie z naszym przewodnikiem Konfigurowanie i zabezpieczanie instancji Compute, aby zaktualizować system. Możesz także ustawić strefę czasową, skonfigurować nazwę hosta, utworzyć ograniczone konto użytkownika i utwardzić dostęp SSH.
-
Musisz mieć co najmniej dwa oddzielne Linody, aby skonfigurować replikację źródła-repliki MySQL. Jeden Linode obsługuje źródłową bazę danych, podczas gdy inny węzeł jest niezbędny dla serwera repliki.
Uwaga Czynności opisane w tym przewodniku zostały napisane dla użytkownika innego niż root. Polecenia wymagające podwyższonych uprawnień są poprzedzone przedrostkiemsudo. Jeśli nie znaszsudopolecenia, zobacz przewodnik po użytkownikach i grupach Linuksa.
Konfiguruj replikację źródła-repliki w MySQL
Aby skonfigurować replikację źródło-replika, MySQL musi być zainstalowany na dwóch oddzielnych serwerach, które mogą się ze sobą komunikować. Te instrukcje dotyczą dystrybucji Ubuntu, ale ogólnie mają zastosowanie do wszystkich dystrybucji Linuksa. Proces składa się z następujących kroków:
- Zainstaluj MySQL.
- Skonfiguruj źródłową bazę danych MySQL.
- Skonfiguruj nowego użytkownika MySQL dla repliki.
- Przygotuj dane MySQL do replikacji.
- Skonfiguruj bazę danych MySQL Replica.
- Zaimportuj zreplikowane dane MySQL i aktywuj replikację.
Zainstaluj MySQL
Jeśli MySQL nie jest jeszcze dostępny na obu Linodach, zainstaluj go, wykonując następujące czynności:
-
Ulepsz Linody.
sudo apt-get update && sudo apt-get upgrade -
Zainstaluj serwer MySQL i aplikacje klienckie zarówno na serwerze źródłowym, jak i na serwerze replik.
sudo apt-get install mysql-server mysql-client -y -
Skonfiguruj opcje bezpieczeństwa, w tym hasło roota, za pomocą
mysql_secure_installationpolecenie.sudo mysql_secure_installation -
Jeśli używasz zapory, takiej jak
ufw, upewnij się, że przepuszcza ruch MySQL. Dodaj następującą regułę, aby otworzyć port3306na zaporze.ufw allow mysql
Skonfiguruj źródłową bazę danych MySQL
Aby włączyć replikację MySQL, edytuj niektóre zmienne w głównym pliku konfiguracyjnym MySQL. Wprowadź następujące zmiany w konfiguracji źródłowej bazy danych.
-
Znajdź główny plik konfiguracyjny MySQL na serwerze źródłowej bazy danych. Ten plik zwykle znajduje się w
/etc/mysql/mysql.conf.d/mysqld.cnf. Jednak we wcześniejszych instalacjach może znajdować się w/etc/my.cnflub/etc/mysql/my.cnf. Można do niego również odwoływać się z jednego z plików poprzezincludedirdyrektywa. -
Otwórz plik konfiguracyjny MySQL i zmień
bind-addressna adres IP serwera źródłowego.- Plik:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2bind-address = <source_ip_address>
-
Odkomentuj lub dodaj wiersze dla
server-idilog-bin. Ustawserver-iddo1ilog-bindo/var/log/mysql/mysql-bin.log.Uwaga Upewnij się, że
skip_networkingzmienna nie jest nigdzie zadeklarowana. Skomentuj to, jeśli pojawia się w tym pliku. Aby zreplikować pojedynczą bazę danych, dodaj wierszbinlog_do_db = <database_name>do pliku.- Plik:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2 3server-id = 1 log_bin = /var/log/mysql/mysql-bin.log
-
Uruchom ponownie usługę MySQL.
sudo systemctl restart mysql -
Sprawdź stan MySQL i upewnij się, że jest
active.sudo systemctl status mysqlmysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2021-05-30 13:06:47 UTC; 1 day 1h ago
Skonfiguruj nowego użytkownika MySQL dla repliki
Musisz utworzyć nowego użytkownika na serwerze źródłowym, który będzie reprezentował replikę. Nowi użytkownicy są tworzeni w powłoce MySQL.
-
Wejdź do powłoki MySQL.
sudo mysql -u root -p -
Dodaj użytkownika do konta repliki za pomocą MySQL
CREATE USERskładnia. Nazwa użytkownika musi składać się z nazwy konta repliki,@symbol i adres IP serwera replik. Wybierz bezpieczniejsze hasło do konta zamiastREPLICA_PASSWORD.CREATE USER 'replica_account_name'@'replica_ip_address‘ IDENTIFIED WITH sha256_password BY 'REPLICA_PASSWORD';Uwaga Aby replika mogła łączyć się z dowolnego adresu, określ użytkownika jako
'replica_account_name'@'%'.%symbol reprezentuje dowolny adres lub domenę. Zapewnia to dodatkową elastyczność kosztem pewnego bezpieczeństwa. -
Przyznaj prawa replikacji użytkownikowi zdalnej repliki.
GRANT REPLICATION SLAVE ON *.* TO 'replica_account_name'@'replica_ip_address';
Przygotuj dane MySQL do replikacji
W tym momencie konieczne jest opróżnienie i zablokowanie źródłowej bazy danych w celu przygotowania danych do replikacji.
-
Pozostań w powłoce MySQL i usuń uprawnienia, aby ponownie załadować tabele grantów bez ponownego uruchamiania bazy danych.
FLUSH PRIVILEGES; -
Zablokuj bazę danych, aby zamrozić bazę danych w stabilnym punkcie, z którego mają być eksportowane dane. Pozostaw uruchomionego klienta MySQL, dopóki nie wyeksportujesz bazy danych. Wprowadzenie dowolnego polecenia zapisu lub wyjście z powłoki MySQL zwalnia blokadę.
FLUSH TABLES WITH READ LOCK;Uwaga To polecenie blokuje wszystkie zatwierdzenia w źródłowej bazie danych. Wyeksportuj dane, zanim zezwolisz źródłu na przetworzenie kolejnych zatwierdzeń. W przeciwnym razie baza danych repliki może zostać uszkodzona lub niespójna ze źródłową bazą danych. Wykonaj dwa pozostałe kroki w tej sekcji tak szybko, jak to możliwe.
-
Sprawdź stan bazy danych za pomocą następującej komendy. To polecenie wyświetla bieżący plik dziennika wraz z pozycją ostatniego rekordu w tym pliku. Zapisz te informacje, ponieważ są one wymagane do późniejszego zainicjowania replikacji.
SHOW MASTER STATUS;+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 1301 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) -
Używając powłoki Linux z innej konsoli, wyeksportuj bazę danych za pomocą
mysqldumpnarzędzie. Wybierz łatwą do zapamiętania nazwę pliku docelowego. Uwzględnij–master-datamożliwość dodania informacji o pliku dziennika i pozycji bieżącego rekordu w dzienniku.sudo mysqldump -u root -p -–all-databases -–master-data > databasecopy.sqlUwaga Aby wyeksportować pojedynczą bazę danych, dołącz
--opt <database_name>opcja zamiast-–all-databases. -
Wróć do oryginalnej powłoki MySQL, odblokuj źródłową bazę danych.
UNLOCK TABLES; -
Wyjdź z powłoki MySQL.
QUIT; -
Skopiuj wyeksportowany plik bazy danych na serwer repliki bazy danych, używając
ftp,scp, lub inna metoda przesyłania pliku.scp databasecopy.sql example@sqldat.com<replica_ip_address>
Skonfiguruj bazę danych MySQL Replica
Do konfiguracji bazy danych repliki należy zastosować następującą konfigurację. Aby zainstalować MySQL na serwerze replik, zobacz sekcję Instalacja MySQL.
-
Otwórz główny plik MySQL, zwykle znajdujący się w
/etc/mysql/mysql.conf.d/mysqld.cnfi zmieńbind-addressaby dopasować adres IP serwera replik.- Plik:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2bind-address = xx.xx.xx.xx
-
Odkomentuj lub dodaj wiersze dla
server-idilog-bin.server-idmusi być ustawiony na2na replice, podczas gdylog-binzmienna musi być ustawiona na/var/log/mysql/mysql-bin.log. Dodaj zmienną dlarelay-logi ustaw go na/var/log/mysql/mysql-relay-bin.log.Uwaga Upewnij się, że
skip_networkingzmienna nie jest ustawiona nigdzie w tym pliku. Aby zreplikować pojedynczą bazę danych, dodaj następującą dyrektywę do plikubinlog_do_db = database_name. Aby skonfigurować więcej niż jedną replikę, podajserver-idwartości w sposób sekwencyjnie rosnący. Na przykład druga replika miałabyserver-idz3.- Plik:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2 3 4server-id = 2 log_bin = /var/log/mysql/mysql-bin.log relay-log = /var/log/mysql/mysql-relay-bin.log
-
Uruchom ponownie usługę MySQL, aby wprowadzić zmiany.
sudo systemctl restart mysql -
Sprawdź stan MySQL i upewnij się, że jest
active.sudo systemctl status mysqlmysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:> Active: active (running) since Mon 2021-05-31 16:29:48 UTC; 6s ago -
(Opcjonalnie ) MySQL zaleca używanie SSL do łączenia się ze źródłem dla większego bezpieczeństwa. Więcej informacji na temat konfiguracji SSL można znaleźć w dokumentacji MySQL SSL. Narzędzie do konfiguracji RSA może być użyty do przyspieszenia tego procesu.
Importuj zreplikowane dane MySQL i aktywuj replikację
Następnym krokiem jest zaimportowanie kopii danych bazy danych, ustawienie źródła replikacji i ponowne uruchomienie serwera bazy danych repliki. Replika powinna być wtedy zsynchronizowana i gotowa do użycia.
-
Wprowadź następujące polecenie z powłoki systemu Linux, aby zaimportować źródłową bazę danych. Określ nazwę bazy danych używaną do wcześniejszego eksportu danych.
sudo mysql -u root -p < databasecopy.sql -
Zaloguj się do powłoki MySQL.
sudo mysql -u root -p -
Zatrzymaj replikę.
STOP REPLICA; -
Wpisz
CHANGE REPLICATION SOURCEpolecenie, wraz z następującymi szczegółami. Zastąp adres IP serwera źródłowej bazy danych w miejscesource_ip_address. DlaSOURCE_USERiSOURCE_PASSWORD, wprowadź nazwę użytkownika i hasło do repliki z sekcji Konfiguracja nowego użytkownika MySQL dla repliki. DlaSOURCE_LOG_FILEiSOURCE_LOG_POSwartości, wprowadź informacje, które zapisałeś wSHOW MASTER STATUS;polecenie.CHANGE REPLICATION SOURCE TO SOURCE_HOST='source_ip_address',SOURCE_USER='replica_account_name', SOURCE_PASSWORD='REPLICA_PASSWORD', SOURCE_LOG_FILE='log_file_name', SOURCE_LOG_POS=log_position;Uwaga Aby używać SSL dla połączenia, co zaleca MySQL, dodaj atrybut
SOURCE_SSL=1do polecenia. Więcej informacji na temat używania SSL w kontekście replikacji źródłowej można znaleźć w dokumentacji MySQL. -
Uruchom ponownie replikę.
START REPLICA; -
Sprawdź stan repliki. Replika powinna czekać na zdarzenia i nie powinno być żadnego
Last_IO_ErrorlubLast_Errorwydarzenia.Slave_SQL_Running_Statewpis powinien wskazywać, że replika przeczytała dziennik przekaźnika.SHOW REPLICA STATUS\GSlave_IO_State: Waiting for master to send event Master_Host: 178.79.153.39 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 156 Relay_Log_File: mysql-relay-bin.000006 Relay_Log_Pos: 371 Relay_Master_Log_File: mysql-bin.000006 Slave_IO_Running: Yes Slave_SQL_Running: Yes .. Last_Errno: 0 Last_Error: .. Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 5bed9d10-c140-11eb-bc63-f23c92a2a6ac Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Testuj replikację źródła-repliki MySQL
Jeśli źródłowa baza danych była już zapełniona przed utworzeniem instancji repliki, wymagane są dodatkowe testy. W takim przypadku sprawdź, czy bazy danych i tabele istniejące w źródle są obecne w replice po zaimportowaniu danych. W SHOW REPLICA STATUS wyświetlacz, Slave_SQL_Running_State wpis powinien brzmieć Slave has read all relay log .
Aby sprawdzić, czy replikacja przebiega prawidłowo, utwórz nową bazę danych lub tabelę w źródle. Po kilku sekundach nowy wpis powinien pojawić się na replice. Sprawdź obecność bazy danych za pomocą SHOW DATABASES; Komenda. Aby potwierdzić obecność tabeli, przełącz się na bazę danych za pomocą USE databasename; i wpisz SHOW TABLES; . Dobrym pomysłem jest również uruchomienie SHOW REPLICA STATUS polecenia i przeanalizuj dane wyjściowe pod kątem ewentualnych błędów. Last_Error i Last_IO_Error pola powinny być puste, a replika powinna pozostać podłączona.
Dowiedz się więcej o replikacji replik źródła MySQL
Najlepszym źródłem informacji o replikacji źródło-replika jest oficjalna dokumentacja MySQL. Sekcja poświęcona replikacji zawiera obszerniejsze informacje o architekturze i procesie instalacji. Pomocne mogą być również fora MySQL.
Więcej informacji
Dodatkowe informacje na ten temat można znaleźć w poniższych zasobach. Chociaż są one dostarczane w nadziei, że będą przydatne, należy pamiętać, że nie możemy ręczyć za dokładność ani aktualność materiałów hostowanych zewnętrznie.
- Dokumentacja MySQL