sql >> Database >  >> RDS >> Mysql

Asynchrone replicatie Automatische failover in MySQL 8.0.22

 

Oracle heeft onlangs MySQL 8.0.22 uitgebracht en deze nieuwe versie kwam met een nieuw failover-mechanisme voor asynchrone verbindingen. Hiermee kan een replica automatisch een asynchrone replicatieverbinding met een nieuwe bron tot stand brengen, voor het geval de bestaande faalt.

In deze blog kijken we naar dit failover-mechanisme voor verbindingen.

Overzicht

Het asynchrone failover-mechanisme kan worden gebruikt om een ​​replica gesynchroniseerd te houden met een groep servers die gegevens delen (Multisource-slave). Het zal de replicatieverbinding naar een nieuwe bron verplaatsen wanneer de bestaande bronverbinding mislukt.

Werkingsprincipe

Als de bestaande verbindingsbron faalt, probeert de replica eerst dezelfde verbinding opnieuw voor het aantal keren dat is opgegeven door de MASTER_RETRY_COUNT. Het interval tussen pogingen wordt ingesteld door de optie MASTER_CONNECT_RETRY. Wanneer deze pogingen zijn uitgeput, neemt het failover-mechanisme van de asynchrone verbinding het failover-proces over.

Merk op dat de MASTER_RETRY_COUNT standaard 86400 (1 dag --> 24 uur) is en de MASTER_CONNECT_RETRY standaardwaarde 60 is.

Om ervoor te zorgen dat het asynchrone failover-mechanisme voor de verbinding snel kan worden geactiveerd, stelt u MASTER_RETRY_COUNT in op een minimaal aantal dat slechts enkele pogingen met dezelfde bron toestaat, voor het geval de verbindingsfout wordt veroorzaakt door een tijdelijk netwerk storing.

Asynchrone verbindingsfailover activeren

  • Als u een asynchrone verbindingsfailover voor een replicatiekanaal wilt activeren, stelt u SOURCE_CONNECTION_AUTO_FAILOVER=1 in op de CHANGE MASTER TO-instructie voor het kanaal.
  • We hebben twee nieuwe functies, die helpen bij het toevoegen en verwijderen van serveritems uit de bronlijst.
    • asynchronous_connection_failover_add_source (voeg de serververmeldingen toe uit de bronlijst)
    • asynchronous_connection_failover_delete_source (verwijder de serververmeldingen uit de bronlijst)

Tijdens het gebruik van deze functies moet u de argumenten specificeren zoals ('channel','host',port,'network_namespace',weight).

Voorbeeld

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)

De bronservers moeten worden geconfigureerd in de tabel "mysql.replication_asynchronous_connection_failover". We kunnen ook de tabel "performance_schema.replication_asynchronous_connection_failover" gebruiken om de beschikbare servers in de bronlijst te bekijken.

Opmerking:als je geen kanaalgebaseerde replicatie gebruikt, werkt dit failover-mechanisme. Tijdens het uitvoeren van de change master-instructie is het niet nodig om een ​​kanaalnaam te noemen. Maar zorg ervoor dat GTID is ingeschakeld op alle servers.

Gebruiksscenario's voor productie

Stel dat je drie PXC-5.7-knooppunten met productiegegevens hebt, die achter ProxySQL draaien. Nu gaan we de kanaalgebaseerde asynchrone replicatie configureren onder knooppunt 1 (192.168.33.12).

  • knooppunt 1 - 192.168.33.12
  • knooppunt 2 - 192.168.33.13
  • knooppunt 3 - 192.168.33.14
  • Replica lezen - 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)

Architectuurdiagram

Testcase 1

We gaan de failover-instellingen toevoegen:

 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, alles goed, ik kan de auto_failover activeren. Laten we knooppunt 1 (192.168.33.12) MySQL stoppen. ProxySQL zal de volgende geschikte master promoten.

[[email protected] lib]# service mysqld stop

Redirecting to /bin/systemctl stop mysqld.service

In de replicaserver

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)

De IO-thread heeft de status "verbinden". Dit betekent dat het probeert de verbinding tot stand te brengen vanaf de bestaande bron (knooppunt 1) op basis van de master_retry_count en master_connect_retry instellingen.

Na een paar seconden kunt u zien dat de source_host is gewijzigd in node 2 (192.168.33.13). Nu is de failover voltooid.

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:

Uit het foutenlogboek

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 

Tijdens het uitvoeren van de change master-instructie is het niet nodig om een ​​kanaalnaam te vermelden, of u nu kanaalgebaseerde replicatie gebruikt of niet.

Voorbeeld

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)

Voeg vervolgens de failover-instellingen toe zoals hieronder,

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 ga ik knooppunt 1 (192.168.33.12) stoppen.

Replicatiefout

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)

Uit het foutenlogboek 

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.

ClusterControl gebruiken

Nu gaan we ClusterControl gebruiken om dit automatische failoverproces te herhalen. Ik heb drie knooppunten pxc (5.7) geïmplementeerd door ClusterControl. Ik heb een 8.0.22-replicatieslave onder mijn PXC-node2 en we gaan deze leesreplica toevoegen met ClusterControl.

Stap 1

Stel de wachtwoordloze SSH-aanmelding in vanaf het ClusterControl-knooppunt om het replicaknooppunt te lezen.

$ ssh-copy-id -i ~/.ssh/id_rsa 192.168.33.15

Stap 2

Ga naar ClusterControl en klik op het vervolgkeuzepictogram en selecteer de optie Replicatie-slave toevoegen.

Stap 3

Kies vervolgens de optie "Bestaande replicatieslave" en voer het gelezen replica-IP in en klik vervolgens op "Replicatieslave toevoegen".

Stap 4

Er wordt een taak geactiveerd en u kunt de voortgang volgen via ClusterControl> Logboeken> Taken. Zodra het proces is voltooid, wordt de slave weergegeven op uw overzichtspagina, zoals gemarkeerd in de volgende schermafbeelding.

Nu kunt u de huidige topologie controleren via ClusterControl> Topologie 

Replica automatisch failoverproces

Nu ga ik failover-testen doen en de onderstaande instellingen toevoegen aan deze functie (asynchronous_connection_failover_add_source) in mijn leesreplica.

 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)

Ik ga knooppunt 2 stoppen (192.168.33.13). In ClusterControl is de parameter (enable_cluster_autorecovery) ingeschakeld, zodat deze de volgende geschikte master zal promoten.

Mijn huidige master is nu offline, dus de gelezen replica probeert opnieuw verbinding te maken de meester.

Replicatiefout van leesreplica

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)

Zodra de ClusterControl de volgende geschikte master promoot, zal mijn leesreplica verbinding maken met een van de beschikbare clusterknooppunten.

Het automatische failoverproces is voltooid en mijn leesreplica is teruggekoppeld naar knooppunt 1 (192.168.33.13) server.

Conclusie

Dit is een van de geweldige functies in MySQL, er is geen handmatige tussenkomst nodig. Dit automatische failoverproces kan u wat tijd besparen. En het vermindert de uitval van de replicaserver. Het is vermeldenswaard dat toen mijn oude master weer in rotatie kwam, de replicatieverbinding niet terugging naar de oude master.


  1. Door komma's gescheiden resultaten in SQL

  2. LEN-functie zonder volgspaties in SQL Server

  3. Wijzig en reset het MySQL-rootwachtwoord

  4. Een string splitsen in MySQL