sql >> Database >  >> RDS >> Mysql

Hoe Percona Server voor MySQL voor hoge beschikbaarheid te implementeren

Percona Server voor MySQL 8.0 biedt een aantal clusteroplossingen voor out-of-the-box hoge beschikbaarheid:

  • Enkele master:
    • Asynchrone replicatie
    • Semi-synchrone replicatie
  • Multimaster:
    • Groepsreplicatie
    • InnoDB Cluster (een combinatie van MySQL Router, MySQL Shell en Percona Server met groepsreplicatie)

De meest populaire, beproefde en zeer schaalbare oplossing is natuurlijk asynchrone replicatie. In deze blogpost gaan we een Percona Server-replicatie-setup implementeren, specifiek voor hoge beschikbaarheid. De hier beschreven instructies zijn gebaseerd op CentOS 7.

Percona Server installeren

Voor hoge beschikbaarheid hebben we ten minste twee knooppunten nodig in een eenvoudige master-slave-replicatieconfiguratie:

  • db1 - master (192.168.0.61)
  • db2 - slaaf (192.168.0.62)

De stappen die in deze sectie worden beschreven, moeten worden uitgevoerd op alle databaseknooppunten (db1 en db2). We beginnen met het installeren van het Percona-repositorypakket:

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

De nieuwste stabiele versie op dit moment is Percona Server voor MySQL 8.0, maar standaard is het repositorypakket alleen geconfigureerd tot versie 5.7. Het percona-releasepakket bevat een script dat extra opslagplaatsen voor de nieuwere producten kan inschakelen. Laten we dat script uitvoeren en 8.0-repository's inschakelen:

$ percona-release setup ps80

Installeer vervolgens de nieuwste Percona Server en Percona Xtrabackup:

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

Op dit moment zou u een Percona Server voor MySQL 8.0.21 moeten installeren. Alle afhankelijkheidspakketten worden geïnstalleerd, zoals shared-compat-, shared- en client-pakketten. We kunnen dan de MySQL-service inschakelen bij het opstarten en de service starten:

$ systemctl enable mysql
$ systemctl start mysql

Er wordt een nieuw root-wachtwoord gegenereerd tijdens de eerste keer opstarten. We moeten eerst de root-wachtwoordinformatie ophalen uit het MySQL-foutlogboek (standaard is /var/log/mysqld.log in op RHEL gebaseerde systemen):

$ 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

Zoals je kunt zien is het gegenereerde wachtwoord "o%(_M>t1)R-P". Vervolgens moeten we een post-installatietaak uitvoeren om de MySQL-serverinstallatie te beveiligen. Voer de volgende opdracht uit:

$ 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!

Het gegenereerde root-wachtwoord zal onmiddellijk verlopen bij de eerste root-login. Het bovenstaande helperscript helpt ons om een ​​nieuw MySQL-rootwachtwoord te configureren, remote login voor root uit te schakelen, testdatabase en anonieme gebruikers te verwijderen en ook de privilegetabellen opnieuw te laden.

We zijn nu klaar om de functie voor hoge beschikbaarheid voor Percona Server 8.0 te configureren.

Semi-synchrone replicatie

Semi-synchrone replicatie valt tussen asynchrone en volledig synchrone replicatie. De bron wacht totdat ten minste één replica de gebeurtenissen heeft ontvangen en geregistreerd, en voert vervolgens de transactie door. De bron wacht niet tot alle replica's de ontvangst bevestigen en vereist alleen een bevestiging van de replica's, niet dat de gebeurtenissen volledig zijn uitgevoerd en vastgelegd aan de replicazijde. Semi-synchrone replicatie garandeert daarom dat als de bron crasht, alle transacties die zijn vastgelegd, naar ten minste één replica zijn verzonden.

Voor de beste replicatie-integriteit kiest u semi-synchrone replicatie. Om het te configureren, voegt u op het eerste knooppunt, db1 (192.168.0.61) de volgende regels toe in /etc/my.cnf (het moet onder de sectie [mysqld] staan):

# 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

Voeg op het tweede knooppunt, db2 (192.168.0.62) de volgende regels toe in /etc/my.cnf (het moet onder de sectie [mysqld] staan):

# 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

We kunnen dan doorgaan met het instellen van de replicatielink zoals beschreven in de "Replicatielink instellen" verderop.

Asynchrone replicatie

Voor asynchrone replicatie, verwijder eenvoudig alle semi-synchrone replicatie-gerelateerde opties en we zouden goed moeten zijn. Voeg op het eerste knooppunt, db1 (192.168.0.61), de volgende regels toe in /etc/my.cnf (het moet onder de sectie [mysqld] staan):

# 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

Voeg op het tweede knooppunt, db2 (192.168.0.62) de volgende regels toe in /etc/my.cnf (het moet onder de sectie [mysqld] staan):

# 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

We kunnen dan doorgaan met het instellen van de replicatielink zoals beschreven in de "Replicatielink instellen" hieronder.

De replicatielink instellen

Maak op de master (db1) een slave-gebruiker aan en laat de gebruiker verbinding maken vanaf alle hosts onder dit netwerk (met % wildcard):

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.%';

Reset op de slave (db2) de binaire logboeken, configureer de replicatiereferenties en start het replicatieproces:

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;

Controleer de replicatiestatus:

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:

Let op de volgende belangrijke status om te bepalen of de replicatie correct is geconfigureerd en de slave de master heeft ingehaald:

  • Slave_IO_Running:Ja
  • Slave_SQL_Running:Ja
  • Seconds_Behind_Master:0

Als semi-synchrone replicatie is ingeschakeld, zou u de volgende uitvoer op de master moeten krijgen:

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

Tijdens de slave is de status als volgt:

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

Voor asynchrone replicatie levert de bovenstaande query niets op (lege set), omdat de semi-synchrone replicatie-plug-ins niet zijn ingeschakeld. In één replicatieset is het mogelijk om een ​​combinatie van slaves te hosten die repliceren met asynchrone en semi-synchrone replicatie.

Percona Server voor MySQL implementeren met ClusterControl

Het is praktisch eenvoudig om een ​​master-slave Percona Server-replicatie met ClusterControl te implementeren, en standaard zal ClusterControl de replicatie-implementatie configureren met een asynchrone replicatie. Bereid eenvoudig de knooppunten voor die u wilt implementeren, en in dit voorbeeld gaan we een Percona Server met drie knooppunten implementeren voor MySQL 8.0 met master-slave-replicatie. Met ClusterControl komt in beeld, we zijn verplicht om een ​​extra node voor ClusterControl te hebben. Daarom ziet onze opstelling er als volgt uit:

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

Installeer ClusterControl op de ClusterControl-server met behulp van het installatiescript. Voer als root het volgende uit:

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

Volg de installatie-instructies totdat het klaar is. Open vervolgens een webbrowser en ga naar http://{ClusterControl_IP_address}/clustercontrol en maak een standaardbeheerdersgebruiker en -wachtwoord aan. Vervolgens moeten we SSH zonder wachtwoord instellen van de ClusterControl-server naar alle databaseknooppunten. Als rootgebruiker moeten we eerst een SSH-sleutel genereren:

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

Kopieer vervolgens de gemaakte openbare SSH-sleutel naar alle databaseknooppunten:

$ 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

We zijn nu klaar om de clusterimplementatie te starten. Ga naar ClusterControl -> Deploy -> MySQL-replicatie en specificeer de vereiste details zoals hieronder:

Klik vervolgens op "Doorgaan" om door te gaan naar de volgende stap waar we configureren de MySQL-installatiespecificatie:

Kies "Percona" voor de leverancier en 8.0 als de versie. Houd de rest als standaard en voer het MySQL-rootwachtwoord in. Klik op "Doorgaan" om door te gaan naar de host- en topologieconfiguratie:

Specificeer het IP-adres of de hostnaam van de databasehosts één voor één en maak zorg ervoor dat u na elke invoeging de groene vinkjes krijgt. Dit geeft aan dat ClusterControl de corresponderende hosts kan bereiken via SSH zonder wachtwoord met de verstrekte SSH-gebruiker en sleutel zoals gedefinieerd in stap 1. Klik op de knop "Deploy" om de implementatie te starten.

ClusterControl activeert vervolgens een implementatietaak waar u de voortgang van de implementatie kunt volgen door naar ClusterControl -> Activiteit -> Taken -> Cluster maken -> Volledige taakdetails te gaan, zoals weergegeven in de volgende schermafbeelding:

Zodra het proces is voltooid, zou u moeten zien dat het cluster wordt vermeld in het Dashboard :

Dat is het. De implementatie is nu voltooid.


  1. Leer elementaire SQL-query's met MySQL

  2. SQL Group By met een Order By

  3. UnicodeEncodeError:'latin-1' codec kan geen teken coderen

  4. 4 manieren om het gegevenstype van een kolom in MariaDB te controleren