Oracle udgav for nylig MySQL 8.0.22, og denne nye version kom med en ny asynkron forbindelses-failover-mekanisme. Det giver en replika mulighed for automatisk at etablere en asynkron replikeringsforbindelse til en ny kilde, hvis dens eksisterende fejler.
I denne blog vil vi se på denne forbindelses failover-mekanisme.
Oversigt
Den asynkrone failover-mekanisme kan bruges til at holde en replika synkroniseret med en gruppe servere, der deler data (Multisource-slave). Det vil flytte replikeringsforbindelsen til en ny kilde, når den eksisterende kildeforbindelse mislykkes.
Arbejdsprincip
Når den eksisterende forbindelseskilde fejler, prøver replikaen først den samme forbindelse igen i det antal gange, der er angivet af MASTER_RETRY_COUNT. Intervallet mellem forsøg er indstillet af MASTER_CONNECT_RETRY-indstillingen. Når disse forsøg er udtømt, overtager den asynkrone forbindelse failover-mekanisme failover-processen.
Bemærk, at MASTER_RETRY_COUNT som standard er 86400 (1 dag --> 24 timer) og MASTER_CONNECT_RETRY standardværdien er 60.
For at sikre, at den asynkrone forbindelsesfejlmekanisme kan aktiveres omgående, skal du indstille MASTER_RETRY_COUNT til et minimalt antal, der kun tillader et par genforsøg med den samme kilde, i tilfælde af at forbindelsesfejlen er forårsaget af et forbigående netværk udfald.
Sådan aktiveres asynkron forbindelsesfejl
- For at aktivere asynkron forbindelsesfejl for en replikeringskanal skal du indstille SOURCE_CONNECTION_AUTO_FAILOVER=1 på CHANGE MASTER TO-sætningen for kanalen.
- Vi har to nye funktioner, som vil hjælpe med at tilføje og slette serverposterne fra kildelisten.
- asynchronous_connection_failover_add_source (tilføj serverposterne fra kildelisten)
- asynchronous_connection_failover_delete_source (slet serverposterne fra kildelisten)
Mens du bruger disse funktioner, skal du angive argumenter som ('kanal', 'vært', port, 'netværksnavneområde', vægt).
Eksempel
mysql> select asynchronous_connection_failover_add_source('testing', '192.168.33.12', 3306, '', 100);
+----------------------------------------------------------------------------------------+
| asynchronous_connection_failover_add_source('testing', '192.168.33.12', 3306, '', 100) |
+----------------------------------------------------------------------------------------+
| The UDF asynchronous_connection_failover_add_source() executed successfully. |
+----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Kildeserverne skal konfigureres i tabellen "mysql.replication_asynchronous_connection_failover". Vi kan også bruge tabellen "performance_schema.replication_asynchronous_connection_failover" til at se de tilgængelige servere på kildelisten.
Bemærk:Hvis du ikke bruger nogen kanalbaseret replikering, vil denne failover-mekanisme fungere. Mens du kører change master-sætningen, er der ingen grund til at nævne noget kanalnavn. Men sørg for, at GTID er aktiveret på alle serverne.
Produktionsbrug
Sig, at du har tre PXC-5.7 noder med produktionsdata, der kører bag ProxySQL. Nu vil vi konfigurere den kanalbaserede asynkrone replikering under node 1 (192.168.33.12).
- node 1 - 192.168.33.12
- node 2 - 192.168.33.13
- node 3 - 192.168.33.14
- Læs replika - 192.168.33.15
mysql> change master to master_user='repl',master_password='[email protected]',master_host='192.168.33.12',master_auto_position=1,source_connection_auto_failover=1,master_retry_count=3,master_connect_retry=6 for channel "prod_replica";
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start replica for channel 'prod_replica';
Query OK, 0 rows affected (0.00 sec)
Arkitekturdiagram
Testtilfælde 1
Vi vil tilføje failover-indstillingerne:
mysql> select asynchronous_connection_failover_add_source('prod_replica', '192.168.33.12', 3306, '', 100);
+---------------------------------------------------------------------------------------------+
| asynchronous_connection_failover_add_source('prod_replica', '192.168.33.12', 3306, '', 100) |
+---------------------------------------------------------------------------------------------+
| The UDF asynchronous_connection_failover_add_source() executed successfully. |
+---------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select asynchronous_connection_failover_add_source('prod_replica', '192.168.33.13', 3306, '', 80);
+--------------------------------------------------------------------------------------------+
| asynchronous_connection_failover_add_source('prod_replica', '192.168.33.13', 3306, '', 80) |
+--------------------------------------------------------------------------------------------+
| The UDF asynchronous_connection_failover_add_source() executed successfully. |
+--------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
mysql> select asynchronous_connection_failover_add_source('prod_replica', '192.168.33.14', 3306, '', 60);
+--------------------------------------------------------------------------------------------+
| asynchronous_connection_failover_add_source('prod_replica', '192.168.33.14', 3306, '', 60) |
+--------------------------------------------------------------------------------------------+
| The UDF asynchronous_connection_failover_add_source() executed successfully. |
+--------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from mysql.replication_asynchronous_connection_failover;
+-------------------+---------------+------+-------------------+--------+
| Channel_name | Host | Port | Network_namespace | Weight |
+-------------------+---------------+------+-------------------+--------+
| prod_replica | 192.168.33.12 | 3306 | | 100 |
| prod_replica | 192.168.33.13 | 3306 | | 80 |
| prod_replica | 192.168.33.14 | 3306 | | 60 |
+-------------------+---------------+------+-------------------+--------+
3 rows in set (0.00 sec)
Ok alt godt, jeg kan aktivere auto_failover. Lad os stoppe node 1 (192.168.33.12) MySQL. ProxySQL vil promovere den næste passende master.
[[email protected] lib]# service mysqld stop
Redirecting to /bin/systemctl stop mysqld.service
I replikaserveren
mysql> show replica status\G
*************************** 1. row ***************************
Slave_IO_State: Reconnecting after a failed master event read
Master_Host: 192.168.33.12
Master_User: repl
Master_Port: 3306
Connect_Retry: 6
Master_Log_File: binlog.000004
Read_Master_Log_Pos: 1143
Relay_Log_File: relay-bin-testing.000006
Relay_Log_Pos: 1352
Relay_Master_Log_File: binlog.000004
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
Replicate_Do_DB:
Last_IO_Error: error reconnecting to master '[email protected]:3306' - retry-time: 10 retries: 2 message: Can't connect to MySQL server on '192.168.33.12' (111)
IO-tråden er i "connecting"-tilstand. Det betyder, at den forsøger at etablere forbindelsen fra den eksisterende kilde (node 1) baseret på indstillingerne master_retry_count og master_connect_retry.
Efter et par sekunder kan du se, at source_host blev ændret til node 2 (192.168.33.13). Nu er failoveren udført.
mysql> show replica status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.33.13
Master_User: repl
Master_Port: 3306
Connect_Retry: 6
Master_Log_File: binlog.000004
Read_Master_Log_Pos: 1162
Relay_Log_File: relay-bin-testing.000007
Relay_Log_Pos: 487
Relay_Master_Log_File: binlog.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Error:
Fra fejlloggen
2020-10-29T22:22:05.679951Z 54 [ERROR] [MY-010584] [Repl] Slave I/O for channel 'prod_replica': error reconnecting to master '[email protected]:3306' - retry-time: 10 retries: 3 message: Can't connect to MySQL server on '192.168.33.12' (111), Error_code: MY-002003
2020-10-29T22:22:05.681121Z 58 [Warning] [MY-010897] [Repl] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.
2020-10-29T22:22:05.682830Z 58 [System] [MY-010562] [Repl] Slave I/O thread for channel 'prod_replica': connected to master '[email protected]:3306',replication started in log 'FIRST' at position 2660
2020-10-29T22:22:05.685175Z 58 [Warning] [MY-010549] [Repl] The master's UUID has changed, although this should not happen unless you have changed it manually. The old UUID was 31b5b7d0-1a25-11eb-8076-080027090068.
(END)
Testcase 2
Når du kører change master-sætningen, er der ingen grund til at nævne noget kanalnavn, uanset om du bruger kanalbaseret replikering eller ej.
Eksempel
mysql> change master to master_user='repl',master_password='[email protected]',master_host='192.168.33.12',master_auto_position=1,source_connection_auto_failover=1,master_retry_count=3,master_connect_retry=10;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start replica;
Query OK, 0 rows affected (0.00 sec)
Tilføj derefter failover-indstillingerne som nedenfor,
select asynchronous_connection_failover_add_source('', '192.168.33.12', 3306, '', 100);
select asynchronous_connection_failover_add_source('', '192.168.33.13', 3306, '', 80);
select asynchronous_connection_failover_add_source('', '192.168.33.14', 3306, '', 60);
mysql> select * from mysql.replication_asynchronous_connection_failover;
+--------------+---------------+------+-------------------+--------+
| Channel_name | Host | Port | Network_namespace | Weight |
+--------------+---------------+------+-------------------+--------+
| | 192.168.33.12 | 3306 | | 100 |
| | 192.168.33.13 | 3306 | | 80 |
| | 192.168.33.14 | 3306 | | 60 |
+--------------+---------------+------+-------------------+--------+
3 rows in set (0.00 sec)
Nu vil jeg stoppe node 1 (192.168.33.12).
replikeringsfejl
Last_IO_Error: error connecting to master '[email protected]:3306' - retry-time: 10 retries: 2 message: Can't connect to MySQL server on '192.168.33.12' (111)
Fra fejlloggen
2020-10-30T00:38:03.471482Z 27 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master '[email protected]:3306' - retry-time: 10 retries: 3 message: Can't connect to MySQL server on '192.168.33.12' (111), Error_code: MY-002003
2020-10-30T00:38:03.472002Z 29 [Warning] [MY-010897] [Repl] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.
2020-10-30T00:38:03.473493Z 29 [System] [MY-010562] [Repl] Slave I/O thread for channel '': connected to master '[email protected]:3306',replication started in log 'FIRST' at position 234
2020-10-30T00:38:03.475471Z 29 [Warning] [MY-010549] [Repl] The master's UUID has changed, although this should not happen unless you have changed it manually. The old UUID was 1ff8a919-1a39-11eb-a27a-080027090068.
Brug af ClusterControl
Nu vil vi bruge ClusterControl til at gentage denne automatiske failover-proces. Jeg har tre noder pxc (5.7) implementeret af ClusterControl. Jeg har en 8.0.22 replikeringsslave under min PXC node2, og vi vil tilføje denne læsereplika ved hjælp af ClusterControl.
Trin 1
Konfigurer det adgangskodeløse SSH-login fra ClusterControl-knudepunktet for at læse replika-noden.
$ ssh-copy-id -i ~/.ssh/id_rsa 192.168.33.15
Trin 2
Gå til ClusterControl, klik på rullemenuen, og vælg Tilføj replikeringsslave.
Trin 3
Vælg derefter "Eksisterende replikeringsslave" og indtast den læste replika-IP, og klik derefter på "Tilføj replikeringsslave".
Trin 4
Et job vil blive udløst, og du kan overvåge fremskridtene på ClusterControl> Logs> Jobs. Når processen er fuldført, vil slaven dukke op på din oversigtsside som fremhævet på det følgende skærmbillede.
Nu kan du tjekke den aktuelle topologi på ClusterControl> Topologi
Replica Auto Failover Process
Nu skal jeg lave failover-test og tilføjede nedenstående indstillinger til denne funktion (asynchronous_connection_failover_add_source) i min læsereplika.
select asynchronous_connection_failover_add_source('prod_replica', '192.168.33.12', 3306, '', 100);
select asynchronous_connection_failover_add_source('prod_replica', '192.168.33.13', 3306, '', 80);
select asynchronous_connection_failover_add_source('prod_replica', '192.168.33.14', 3306, '', 60);
mysql> select * from mysql.replication_asynchronous_connection_failover;
+--------------+---------------+------+-------------------+--------+
| Channel_name | Host | Port | Network_namespace | Weight |
+--------------+---------------+------+-------------------+--------+
| prod_replica | 192.168.33.12 | 3306 | | 100 |
| prod_replica | 192.168.33.13 | 3306 | | 80 |
| prod_replica | 192.168.33.14 | 3306 | | 60 |
+--------------+---------------+------+-------------------+--------+
3 rows in set (0.00 sec)
mysql> select CONNECTION_RETRY_INTERVAL,CONNECTION_RETRY_COUNT,SOURCE_CONNECTION_AUTO_FAILOVER from performance_schema.replication_connection_conf
iguration;
+---------------------------+------------------------+---------------------------------+
| CONNECTION_RETRY_INTERVAL | CONNECTION_RETRY_COUNT | SOURCE_CONNECTION_AUTO_FAILOVER |
+---------------------------+------------------------+---------------------------------+
| 6 | 3 | 1 |
+---------------------------+------------------------+---------------------------------+
1 row in set (0.00 sec)
Jeg vil stoppe node 2 (192.168.33.13). I ClusterControl er parameteren (enable_cluster_autorecovery) aktiveret, så den vil fremme den næste passende master.
Nu er min nuværende master nede, så læsereplikaen forsøger at oprette forbindelse igen mesteren.
replikeringsfejl fra læst replika
Last_IO_Error: error connecting to master '[email protected]:3306' - retry-time: 6 retries: 2 message: Can't connect to MySQL server on '192.168.33.13' (111)
Når ClusterControl promoverer den næste passende master, vil min læsereplika oprette forbindelse til en hvilken som helst af de tilgængelige klynge noder.
Den automatiske failover-proces er fuldført, og min læste replika er sluttet tilbage til node 1 (192.168.33.13) server.
Konklusion
Dette er en af de fantastiske funktioner i MySQL, der er ingen manuel indgriben nødvendig. Denne automatiske failover-proces kan spare dig noget tid. Og det reducerer replika-serverafbrydelsen. Værd at bemærke, da min gamle master kom tilbage til rotation, ville replikeringsforbindelsen ikke skifte tilbage til den gamle master.