sql >> Databasteknik >  >> RDS >> Mysql

Hur man distribuerar Percona Server för MySQL för hög tillgänglighet

Percona Server för MySQL 8.0 erbjuder ett antal klustringslösningar för hög tillgänglighet direkt:

  • Single-master:
    • Asynkron replikering
    • Halvsynkron replikering
  • Multi-master:
    • Gruppreplikering
    • InnoDB Cluster (en kombination av MySQL Router, MySQL Shell och Percona Server med gruppreplikering)

Den mest populära, stridstestade och mycket skalbara lösningen är naturligtvis asynkron replikering. I det här blogginlägget kommer vi att distribuera en Percona Server-replikeringsinställning specifikt för hög tillgänglighet. Instruktionerna som beskrivs här är baserade på CentOS 7.

Installera Percona Server

För hög tillgänglighet behöver vi minst två noder i en enkel master-slav-replikeringsinställning:

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

Stegen som beskrivs i det här avsnittet bör utföras på alla databasnoder (db1 och db2). Vi börjar med att installera Percona repository-paketet:

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

Den senaste stabila versionen för närvarande är Percona Server för MySQL 8.0, men som standard är förvarspaketet bara konfigurerat fram till version 5.7. Percona-release-paketet innehåller ett skript som kan aktivera ytterligare förråd för de nyare produkterna. Låt oss köra det skriptet och aktiverade 8.0-förråd:

$ percona-release setup ps80

Installera sedan den senaste Percona-servern och Percona Xtrabackup:

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

I detta ögonblick bör du få en Percona Server för MySQL 8.0.21 installerad. Alla beroendepaket kommer att installeras som shared-compat, shared och klientpaket. Vi kan sedan aktivera MySQL-tjänsten vid uppstart och starta tjänsten:

$ systemctl enable mysql
$ systemctl start mysql

Ett nytt root-lösenord kommer att genereras under den första uppstarten. Vi måste hämta informationen om root-lösenordet först från MySQL-felloggen (standard är /var/log/mysqld.log i RHEL-baserade system):

$ 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

Som du kan se är det genererade lösenordet "o%(_M>t1)R-P". Därefter måste vi utföra en efterinstallationsuppgift för att säkra MySQL-serverinstallationen. Kör följande kommando:

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

Det genererade root-lösenordet kommer att upphöra att gälla omedelbart efter den första root-inloggningen. Ovanstående hjälpskript hjälper oss att konfigurera ett nytt MySQL root-lösenord, inaktivera fjärrinloggning för root, ta bort testdatabas och anonyma användare och även ladda om privilegietabellerna.

Vi är nu redo att konfigurera funktionen för hög tillgänglighet för Percona Server 8.0.

Halvsynkron replikering

Semisynkron replikering faller mellan asynkron och helsynkron replikering. Källan väntar tills minst en replik har tagit emot och loggat händelserna och utför sedan transaktionen. Källan väntar inte på att alla repliker ska bekräfta mottagandet, och den kräver bara en bekräftelse från replikerna, inte att händelserna har utförts helt och begåtts på repliksidan. Halvsynkron replikering garanterar därför att om källan kraschar har alla transaktioner som den har utfört överförts till minst en replik.

För bästa replikeringsintegritet, välj semisynkron replikering. För att konfigurera det, på den första noden, db1 (192.168.0.61), lägg till följande rader inuti /etc/my.cnf (det måste finnas under [mysqld]-sektionen):

# 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

På den andra noden, db2 (192.168.0.62), lägg till följande rader inuti /etc/my.cnf (det måste finnas under [mysqld]-sektionen):

# 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

Vi kan sedan fortsätta med att ställa in replikeringslänken enligt beskrivningen i "Konfigurera replikeringslänk" längre ner.

Asynkron replikering

För asynkron replikering, ta helt enkelt bort alla semisynkrona replikeringsrelaterade alternativ och vi borde vara bra. På den första noden, db1 (192.168.0.61), lägg till följande rader inuti /etc/my.cnf (det måste finnas under [mysqld]-sektionen):

# 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

På den andra noden, db2 (192.168.0.62), lägg till följande rader inuti /etc/my.cnf (det måste finnas under [mysqld]-sektionen):

# 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

Vi kan sedan fortsätta med att ställa in replikeringslänken enligt beskrivningen i "Konfigurera replikeringslänk" nedan.

Konfigurera replikeringslänken

På mastern (db1), skapa en slavanvändare och låt användaren ansluta från alla värdar under detta nätverk (med % jokertecken):

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

På slaven (db2), återställ de binära loggarna, konfigurera replikeringsuppgifterna och starta replikeringsprocessen:

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;

Kontrollera replikeringsstatusen:

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:

Var uppmärksam på följande viktiga status för att avgöra om replikeringen är korrekt konfigurerad och slaven har kommit ikapp mastern:

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

Om semi-synkron replikering är aktiverad bör du få följande utdata på mastern:

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

Medan på slaven är statusen som nedan:

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

För asynkron replikering ska ovanstående fråga inte returnera något (tom uppsättning), eftersom de semisynkrona replikeringspluginerna inte är aktiverade. I en replikeringsuppsättning är det möjligt att ha en blandning av slavvärdar som replikerar med asynkron och semisynkron replikering.

Distribuera Percona Server för MySQL med ClusterControl

Det är praktiskt taget enkelt att distribuera en master-slav Percona Server-replikering med ClusterControl, och som standard kommer ClusterControl att konfigurera replikeringsdistributionen med en asynkron replikering. Förbered helt enkelt noderna som du vill distribuera, och i det här exemplet kommer vi att distribuera en Percona Server med tre noder för MySQL 8.0 med master-slave replikering. När ClusterControl kommer in i bilden krävs att vi har en extra nod för ClusterControl. Därför ser vår inställning ut så här:

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

På ClusterControl-servern installerar du ClusterControl med hjälp av installationsskriptet. Kör följande som root:

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

Följ installationsinstruktionerna tills den är klar. Öppna sedan en webbläsare och gå till http://{ClusterControl_IP_address}/clustercontrol och skapa en standardadminanvändare och ett lösenord. Därefter måste vi ställa in lösenordslös SSH från ClusterControl-servern till alla databasnoder. Som root-användare måste vi först generera en SSH-nyckel:

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

Kopiera sedan den skapade offentliga SSH-nyckeln till alla databasnoder:

$ 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

Vi är nu redo att starta klusterdistributionen. Gå till ClusterControl -> Deploy -> MySQL-replikering och ange nödvändiga detaljer enligt nedan:

Klicka sedan på "Fortsätt" för att gå vidare till nästa steg där vi konfigurerar MySQL-installationsspecifikationen:

Välj "Percona" för leverantören och 8.0 som version. Behåll resten som standard och ange MySQL root-lösenordet. Klicka på "Fortsätt" för att fortsätta till värd- och topologikonfigurationen:

Ange IP-adressen eller värdnamnet för databasvärdarna en efter en och gör se till att du får de gröna bockikonerna efter varje infogning. Detta indikerar att ClusterControl kan nå motsvarande värdar via lösenordslös SSH med den angivna SSH-användaren och nyckeln som definieras i steg 1. Klicka på knappen "Distribuera" för att starta distributionen.

ClusterControl utlöser sedan ett distributionsjobb där du kan övervaka distributionsförloppet genom att gå till ClusterControl -> Aktivitet -> Jobb -> Skapa kluster -> Fullständig jobbinformation, som visas i följande skärmdump:

När processen är klar bör du se att klustret är listat i instrumentpanelen :

Det var allt. Utplaceringen är nu klar.


  1. Länka om Grid Infrastructure

  2. Rekursiv fråga används för transitiv stängning

  3. Vilket är snabbare:flera enkla INSERT eller en INSERT med flera rader?

  4. SQL Server-markörtyper - Dynamisk markör | SQL Server Tutorial / TSQL Tutorial