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
SELECT
oś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 znaszsudo
polecenia, 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_installation
polecenie.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ć port3306
na 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.cnf
lub/etc/mysql/my.cnf
. Można do niego również odwoływać się z jednego z plików poprzezincludedir
dyrektywa. -
Otwórz plik konfiguracyjny MySQL i zmień
bind-address
na adres IP serwera źródłowego.- Plik:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2
bind-address = <source_ip_address>
-
Odkomentuj lub dodaj wiersze dla
server-id
ilog-bin
. Ustawserver-id
do1
ilog-bin
do/var/log/mysql/mysql-bin.log
.Uwaga Upewnij się, że
skip_networking
zmienna 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 3
server-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 mysql
mysql.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 USER
skł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ą
mysqldump
narzędzie. Wybierz łatwą do zapamiętania nazwę pliku docelowego. Uwzględnij–master-data
możliwość dodania informacji o pliku dziennika i pozycji bieżącego rekordu w dzienniku.sudo mysqldump -u root -p -–all-databases -–master-data > databasecopy.sql
Uwaga 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 [email protected]<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.cnf
i zmieńbind-address
aby dopasować adres IP serwera replik.- Plik:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2
bind-address = xx.xx.xx.xx
-
Odkomentuj lub dodaj wiersze dla
server-id
ilog-bin
.server-id
musi być ustawiony na2
na replice, podczas gdylog-bin
zmienna musi być ustawiona na/var/log/mysql/mysql-bin.log
. Dodaj zmienną dlarelay-log
i ustaw go na/var/log/mysql/mysql-relay-bin.log
.Uwaga Upewnij się, że
skip_networking
zmienna 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-id
wartości w sposób sekwencyjnie rosnący. Na przykład druga replika miałabyserver-id
z3
.- Plik:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2 3 4
server-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 mysql
mysql.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 SOURCE
polecenie, wraz z następującymi szczegółami. Zastąp adres IP serwera źródłowej bazy danych w miejscesource_ip_address
. DlaSOURCE_USER
iSOURCE_PASSWORD
, wprowadź nazwę użytkownika i hasło do repliki z sekcji Konfiguracja nowego użytkownika MySQL dla repliki. DlaSOURCE_LOG_FILE
iSOURCE_LOG_POS
wartoś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=1
do 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_Error
lubLast_Error
wydarzenia.Slave_SQL_Running_State
wpis powinien wskazywać, że replika przeczytała dziennik przekaźnika.SHOW REPLICA STATUS\G
Slave_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