Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak skonfigurować replikację źródła-repliki w MySQL?

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

  1. Jeśli jeszcze tego nie zrobiłeś, utwórz konto Linode i instancję obliczeniową. Zobacz nasze przewodniki Wprowadzenie do Linode i tworzenie instancji obliczeniowej.

  2. 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.

  3. 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 przedrostkiem sudo . Jeśli nie znasz sudo 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:

  1. Zainstaluj MySQL.
  2. Skonfiguruj źródłową bazę danych MySQL.
  3. Skonfiguruj nowego użytkownika MySQL dla repliki.
  4. Przygotuj dane MySQL do replikacji.
  5. Skonfiguruj bazę danych MySQL Replica.
  6. 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:

  1. Ulepsz Linody.

     sudo apt-get update && sudo apt-get upgrade
    
  2. 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
    
  3. Skonfiguruj opcje bezpieczeństwa, w tym hasło roota, za pomocą mysql_secure_installation polecenie.

     sudo mysql_secure_installation
    
  4. Jeśli używasz zapory, takiej jak ufw , upewnij się, że przepuszcza ruch MySQL. Dodaj następującą regułę, aby otworzyć port 3306 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.

  1. 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 poprzez includedir dyrektywa.

  2. 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>
        
  3. Odkomentuj lub dodaj wiersze dla server-id i log-bin . Ustaw server-id do 1 i log-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 wiersz binlog_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
        
  4. Uruchom ponownie usługę MySQL.

     sudo systemctl restart mysql
    
  5. 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.

  1. Wejdź do powłoki MySQL.

     sudo mysql -u root -p
    
  2. 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 zamiast REPLICA_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.
  3. 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.

  1. Pozostań w powłoce MySQL i usuń uprawnienia, aby ponownie załadować tabele grantów bez ponownego uruchamiania bazy danych.

     FLUSH PRIVILEGES;
    
  2. 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.
  3. 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)
  4. 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 .
  5. Wróć do oryginalnej powłoki MySQL, odblokuj źródłową bazę danych.

     UNLOCK TABLES;
    
  6. Wyjdź z powłoki MySQL.

     QUIT;
    
  7. 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.

  1. 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
        
  2. Odkomentuj lub dodaj wiersze dla server-id i log-bin . server-id musi być ustawiony na 2 na replice, podczas gdy log-bin zmienna musi być ustawiona na /var/log/mysql/mysql-bin.log . Dodaj zmienną dla relay-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 pliku binlog_do_db = database_name . Aby skonfigurować więcej niż jedną replikę, podaj server-id wartości w sposób sekwencyjnie rosnący. Na przykład druga replika miałaby server-id z 3 .
    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
        
  3. Uruchom ponownie usługę MySQL, aby wprowadzić zmiany.

     sudo systemctl restart mysql
    
  4. 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
  5. (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.

  1. 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
    
  2. Zaloguj się do powłoki MySQL.

     sudo mysql -u root -p
    
  3. Zatrzymaj replikę.

     STOP REPLICA;
    
  4. Wpisz CHANGE REPLICATION SOURCE polecenie, wraz z następującymi szczegółami. Zastąp adres IP serwera źródłowej bazy danych w miejsce source_ip_address . Dla SOURCE_USER i SOURCE_PASSWORD , wprowadź nazwę użytkownika i hasło do repliki z sekcji Konfiguracja nowego użytkownika MySQL dla repliki. Dla SOURCE_LOG_FILE i SOURCE_LOG_POS wartości, wprowadź informacje, które zapisałeś w SHOW 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.
  5. Uruchom ponownie replikę.

     START REPLICA;
    
  6. Sprawdź stan repliki. Replika powinna czekać na zdarzenia i nie powinno być żadnego Last_IO_Error lub Last_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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy JavaScript może łączyć się z MySQL?

  2. Zrzuć wszystkie tabele w formacie CSV, używając „mysqldump”

  3. INSERT INTO lub AKTUALIZUJ z dwoma warunkami

  4. MySQLSyntaxErrorException w pobliżu ? podczas próby wykonania Przygotowanego Oświadczenia

  5. Zapytania parametryczne MySQL