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

Jak wdrożyć Percona Server dla MySQL w celu zapewnienia wysokiej dostępności

Percona Server dla MySQL 8.0 oferuje szereg rozwiązań klastrowych zapewniających wysoką dostępność od razu po zainstalowaniu:

  • Jeden mistrz:
    • Replikacja asynchroniczna
    • Replikacja półsynchroniczna
  • Multi-master:
    • Replikacja grup
    • Klaster InnoDB (połączenie routera MySQL, powłoki MySQL i serwera Percona z replikacją grupową)

Najpopularniejszym, sprawdzonym w boju i wysoce skalowalnym rozwiązaniem jest oczywiście replikacja asynchroniczna. W tym poście na blogu zamierzamy wdrożyć konfigurację replikacji Percona Server specjalnie dla zapewnienia wysokiej dostępności. Opisane tutaj instrukcje są oparte na CentOS 7.

Instalowanie serwera Percona

Aby uzyskać wysoką dostępność, potrzebujemy co najmniej dwóch węzłów w prostej konfiguracji replikacji master-slave:

  • db1 - główny (192.168.0.61)
  • db2 — urządzenie podrzędne (192.168.0.62)

Czynności opisane w tej sekcji należy wykonać na wszystkich węzłach bazy danych (db1 i db2). Zaczniemy od zainstalowania pakietu repozytorium Percona:

$ yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

Najnowszą stabilną wersją w tym momencie jest Percona Server dla MySQL 8.0, ale domyślnie pakiet repozytorium jest skonfigurowany tylko do wersji 5.7. Pakiet percona-release zawiera skrypt, który może włączyć dodatkowe repozytoria dla nowszych produktów. Uruchommy ten skrypt i włączmy repozytoria 8.0:

$ percona-release setup ps80

Następnie zainstaluj najnowszą wersję Percona Server i Percona Xtrabackup:

$ yum -y install percona-server-server percona-xtrabackup-80

W tej chwili powinieneś mieć zainstalowany Percona Server dla MySQL 8.0.21. Wszystkie pakiety zależności zostaną zainstalowane, podobnie jak pakiety shared-compat, shared i client. Następnie możemy włączyć usługę MySQL podczas uruchamiania i uruchomić usługę:

$ systemctl enable mysql
$ systemctl start mysql

Nowe hasło roota zostanie wygenerowane podczas pierwszego uruchomienia. Najpierw musimy pobrać informacje o haśle roota z dziennika błędów MySQL (domyślnie /var/log/mysqld.log w systemach opartych na RHEL):

$ cat /var/log/mysqld.log | grep temporary
2020-11-06T04:53:07.402040Z 6 [Note] [MY-010454] [Server] A temporary password is generated for [email protected]: o%(_M>t1)R-P

Jak widać wygenerowane hasło to "o%(_M>t1)R-P". Następnie musimy wykonać zadanie poinstalacyjne, aby zabezpieczyć instalację serwera MySQL. Uruchom następujące polecenie:

$ mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:

The existing password for the user account root has expired. Please set a new password.


New password:
Re-enter new password:

The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.

Using existing password for root.


Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password:

Re-enter new password:

Estimated strength of the password: 100

Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.

You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

Wygenerowane hasło roota wygaśnie natychmiast po pierwszym zalogowaniu roota. Powyższy skrypt pomocniczy pomaga nam skonfigurować nowe hasło roota MySQL, wyłączając zdalne logowanie dla roota, usuwając testową bazę danych i anonimowych użytkowników, a także przeładowując tabele uprawnień.

Jesteśmy teraz gotowi do skonfigurowania funkcji wysokiej dostępności dla Percona Server 8.0.

Półsynchroniczna replikacja

Replikacja półsynchroniczna mieści się między replikacją asynchroniczną i w pełni synchroniczną. Źródło czeka, aż co najmniej jedna replika odbierze i zarejestruje zdarzenia, a następnie zatwierdza transakcję. Źródło nie czeka, aż wszystkie repliki potwierdzą odbiór i wymaga jedynie potwierdzenia od replik, a nie tego, że zdarzenia zostały w pełni wykonane i zatwierdzone po stronie repliki. Replikacja półsynchroniczna gwarantuje zatem, że jeśli źródło ulegnie awarii, wszystkie zatwierdzone transakcje zostaną przesłane do co najmniej jednej repliki.

Aby uzyskać najlepszą integralność replikacji, wybierz replikację półsynchroniczną. Aby to skonfigurować, na pierwszym węźle, db1 (192.168.0.61), dodaj następujące wiersze w /etc/my.cnf (musi znajdować się w sekcji [mysqld]):

# Compatibility
default-authentication-plugin = mysql_native_password

# Replication
server_id = 61 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.61 # IP address of this host
read_only = OFF # Set ON on slave
super_read_only = OFF # Set ON on slave

# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON

# Semi-sync
plugin_load_add = rpl_semi_sync_master=semisync_master.so
plugin_load_add = rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled = ON
rpl_semi_sync_master_timeout = 1000
rpl_semi_sync_slave_enabled = ON

W drugim węźle, db2 (192.168.0.62), dodaj następujące wiersze w /etc/my.cnf (musi znajdować się w sekcji [mysqld]):

# Compatibility
default-authentication-plugin = mysql_native_password

# Replication
server_id = 62 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.62 # IP address of this host
read_only = ON # Set ON on slave
super_read_only = ON # Set ON on slave

# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON

# Semi-sync
plugin_load_add = rpl_semi_sync_master=semisync_master.so
plugin_load_add = rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled = ON
rpl_semi_sync_master_timeout = 1000
rpl_semi_sync_slave_enabled = ON

Następnie możemy przystąpić do konfiguracji łącza replikacji zgodnie z opisem w sekcji „Konfigurowanie łącza replikacji” poniżej.

Replikacja asynchroniczna

W przypadku replikacji asynchronicznej po prostu usuń wszystkie opcje związane z replikacją półsynchroniczną i powinniśmy być w porządku. Na pierwszym węźle, db1 (192.168.0.61), dodaj następujące wiersze w /etc/my.cnf (musi znajdować się w sekcji [mysqld]):

# Compatibility
default-authentication-plugin = mysql_native_password

# Replication
server_id = 61 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.61 # IP address of this host
read_only = OFF # Set ON on slave
super_read_only = OFF # Set ON on slave

# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON

W drugim węźle, db2 (192.168.0.62), dodaj następujące wiersze w /etc/my.cnf (musi znajdować się w sekcji [mysqld]):

# Compatibility
default-authentication-plugin = mysql_native_password

# Replication
server_id = 62 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.62 # IP address of this host
read_only = ON # Set ON on slave
super_read_only = ON # Set ON on slave

# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON

Następnie możemy przystąpić do konfiguracji łącza replikacji zgodnie z opisem w sekcji „Konfigurowanie łącza replikacji” poniżej.

Konfigurowanie łącza replikacji

Na urządzeniu głównym (db1) utwórz użytkownika podrzędnego i zezwól użytkownikowi na połączenie ze wszystkich hostów w tej sieci (za pomocą symbolu wieloznacznego %):

mysql> CREATE USER 'slave'@'192.168.0.%' IDENTIFIED WITH mysql_native_password BY '[email protected]&9';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.0.%';

Na urządzeniu podrzędnym (db2) zresetuj dzienniki binarne, skonfiguruj poświadczenia replikacji i rozpocznij proces replikacji:

mysql> RESET MASTER;
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.0.61', MASTER_USER = 'slave', MASTER_PASSWORD = '[email protected]&9', MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;

Sprawdź stan replikacji:

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.61
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000008
          Read_Master_Log_Pos: 912
               Relay_Log_File: db2-relay-bin.000007
                Relay_Log_Pos: 1081
        Relay_Master_Log_File: binlog.000008
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 912
              Relay_Log_Space: 1500
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        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: 66
                  Master_UUID: f60cf793-1feb-11eb-af72-5254008afee6
             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
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: f60cf793-1feb-11eb-af72-5254008afee6:5-7
            Executed_Gtid_Set: f60cf793-1feb-11eb-af72-5254008afee6:1-7
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
       Master_public_key_path:
        Get_master_public_key: 0
            Network_Namespace:

Zwróć uwagę na następujący ważny stan, aby określić, czy replikacja jest poprawnie skonfigurowana, a urządzenie podrzędne dogoniło urządzenie nadrzędne:

  • Slave_IO_Running:Tak
  • Slave_SQL_Running:Tak
  • Seconds_Behind_Master:0

Jeśli włączona jest replikacja półsynchroniczna, powinieneś otrzymać następujące dane wyjściowe na urządzeniu głównym:

mysql> SHOW STATUS LIKE '%semi%status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON    |
| Rpl_semi_sync_slave_status  | OFF   |
+-----------------------------+-------+

W urządzeniu podrzędnym status jest następujący:

mysql> SHOW STATUS LIKE '%semi%status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF   |
| Rpl_semi_sync_slave_status  | ON    |
+-----------------------------+-------+

W przypadku replikacji asynchronicznej powyższe zapytanie nie zwróci nic (pusty zestaw), ponieważ wtyczki replikacji półsynchronicznej nie są włączone. W jednym zestawie replikacji można mieć mieszankę replikacji hostów podrzędnych z replikacją asynchroniczną i półsynchroniczną.

Wdrażanie Percona Server dla MySQL przy użyciu ClusterControl

Wdrożenie replikacji Master-Slave Percona Server za pomocą ClusterControl jest praktycznie łatwe, a ClusterControl domyślnie skonfiguruje wdrożenie replikacji z replikacją asynchroniczną. Wystarczy przygotować węzły, które chcesz wdrożyć, aw tym przykładzie wdrożymy trzywęzłowy serwer Percona Server dla MySQL 8.0 z replikacją typu master-slave. Gdy pojawia się ClusterControl, musimy mieć dodatkowy węzeł dla ClusterControl. Dlatego nasza konfiguracja wygląda tak:

  • ClusterControl – cc (192.168.0.19)
  • Master - db1 (192.168.0.61)
  • Slave - db2 (192.168.0.62)
  • Slave - db3 (192.168.0.63)

Na serwerze ClusterControl zainstaluj ClusterControl za pomocą skryptu instalacyjnego. Jako root uruchom następujące polecenie:

$ wget http://severalnines.com/downloads/cmon/install-cc
$ chmod 755 install-cc
$ ./install-cc

Postępuj zgodnie z instrukcjami instalacji, aż się zakończy. Następnie otwórz przeglądarkę internetową i przejdź pod adres http://{ClusterControl_IP_address}/clustercontrol i utwórz domyślnego użytkownika i hasło administratora. Następnie musimy skonfigurować bezhasłowe SSH z serwera ClusterControl do wszystkich węzłów bazy danych. Jako użytkownik root musimy najpierw wygenerować klucz SSH:

$ whoami
root
$ ssh-keygen -t rsa # press Enter on all prompts

Następnie skopiuj utworzony klucz publiczny SSH do wszystkich węzłów bazy danych:

$ ssh-copy-id -i ~/.ssh/id_rsa [email protected] # db1
$ ssh-copy-id -i ~/.ssh/id_rsa [email protected] # db2
$ ssh-copy-id -i ~/.ssh/id_rsa [email protected] # db3

Jesteśmy teraz gotowi do rozpoczęcia wdrażania klastra. Przejdź do ClusterControl -> Wdróż -> Replikacja MySQL i określ wymagane szczegóły, jak poniżej:

Następnie kliknij „Kontynuuj”, aby przejść do następnego kroku, w którym konfigurujemy specyfikacja instalacji MySQL:

Wybierz „Percona” dla dostawcy i 8.0 jako wersję. Resztę zachowaj jako domyślną i wprowadź hasło roota MySQL. Kliknij „Dalej”, aby przejść do konfiguracji hosta i topologii:

Podaj jeden po drugim adres IP lub nazwę hosta bazy danych i upewnij się, że po każdym wstawieniu pojawią się zielone ikony haczyków. Wskazuje to, że ClusterControl jest w stanie połączyć się z odpowiednimi hostami przez SSH bez hasła z podanym użytkownikiem SSH i kluczem, jak zdefiniowano w kroku 1. Kliknij przycisk „Wdróż”, aby rozpocząć wdrażanie.

ClusterControl następnie wyzwala zadanie wdrażania, w którym można monitorować postęp wdrażania, przechodząc do ClusterControl -> Aktywność -> Zadania -> Utwórz klaster -> Pełne szczegóły zadania, jak pokazano na poniższym zrzucie ekranu:

Po zakończeniu procesu klaster powinien zostać wyświetlony na pulpicie nawigacyjnym :

To wszystko. Wdrożenie zostało zakończone.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLite INSERT - PRZY AKTUALIZACJI ZDUPLIKOWANEGO KLUCZA (UPSERT)

  2. Przykład użycia bind_result vs get_result

  3. Migracja z Oracle do MySQL

  4. mysql SQL:określony element jako pierwszy, a następnie sortowanie pozostałych elementów

  5. Znaczenie MySQL INT