Mysql
 sql >> Database >  >> RDS >> Mysql

Replica asincrona Failover automatico in MySQL 8.0.22

 

Oracle ha recentemente rilasciato MySQL 8.0.22 e questa nuova versione include un nuovo meccanismo di failover della connessione asincrona. Consente a una replica di stabilire automaticamente una connessione di replica asincrona a una nuova origine, nel caso in cui quella esistente si guasta.

In questo blog, esamineremo questo meccanismo di failover della connessione.

Panoramica

Il meccanismo di failover asincrono può essere utilizzato per mantenere una replica sincronizzata con un gruppo di server che condividono i dati (slave multisorgente). Sposterà la connessione di replica su una nuova origine quando la connessione di origine esistente non riesce.

Principio di lavoro

Quando l'origine della connessione esistente non riesce, la replica prima riprova la stessa connessione per il numero di volte specificato da MASTER_RETRY_COUNT. L'intervallo tra i tentativi è impostato dall'opzione MASTER_CONNECT_RETRY. Quando questi tentativi sono esauriti, il meccanismo di failover della connessione asincrona assume il controllo del processo di failover.

Nota che per impostazione predefinita MASTER_RETRY_COUNT è 86400 (1 giorno --> 24 ore) e il valore predefinito MASTER_CONNECT_RETRY è 60.

Per garantire che il meccanismo di failover della connessione asincrona possa essere attivato tempestivamente, impostare MASTER_RETRY_COUNT su un numero minimo che consenta solo alcuni tentativi con la stessa sorgente, nel caso in cui l'interruzione della connessione sia causata da una rete transitoria interruzione.

Come attivare il failover della connessione asincrona

  • Per attivare il failover della connessione asincrona per un canale di replica, impostare SOURCE_CONNECTION_AUTO_FAILOVER=1 sull'istruzione CHANGE MASTER TO per il canale.
  • Abbiamo due nuove funzioni, che aiuteranno ad aggiungere ed eliminare le voci del server dall'elenco dei sorgenti.
    • connessione_asincrona_failover_add_source (aggiungi le voci del server dall'elenco dei sorgenti)
    • connessione_asincrona_failover_delete_source (elimina le voci del server dall'elenco dei sorgenti)

Durante l'utilizzo di queste funzioni, è necessario specificare argomenti come ('channel','host',port,'network_namespace',weight).

Esempio

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)

I server di origine devono essere configurati nella tabella "mysql.replication_asynchronous_connection_failover". Possiamo anche utilizzare la tabella "performance_schema.replication_asynchronous_connection_failover" per visualizzare i server disponibili nell'elenco dei sorgenti.

Nota:se non si utilizza alcuna replica basata sul canale, questo meccanismo di failover funzionerà. Durante l'esecuzione dell'istruzione change master, non è necessario menzionare alcun nome di canale. Ma assicurati che GTID sia abilitato su tutti i server.

Casi d'uso della produzione

Supponiamo che tu abbia tre nodi PXC-5.7 con dati di produzione, in esecuzione dietro ProxySQL. Ora configureremo la replica asincrona basata sul canale nel nodo 1 (192.168.33.12).

  • nodo 1 - 192.168.33.12
  • nodo 2 - 192.168.33.13
  • nodo 3 - 192.168.33.14
  • Leggi replica - 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)

Diagramma architettonico

Caso di prova 1

Aggiungeremo le impostazioni di failover:

 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 tutto bene, posso attivare l'auto_failover. Fermiamo il nodo 1 (192.168.33.12) MySQL. ProxySQL promuoverà il prossimo master adatto.

[[email protected] lib]# service mysqld stop

Redirecting to /bin/systemctl stop mysqld.service

Nel server di replica

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)

Il thread IO è in stato di "connessione". Ciò significa che sta tentando di stabilire la connessione dall'origine esistente (nodo 1) in base alle impostazioni master_retry_count e master_connect_retry.

Dopo alcuni secondi, puoi vedere che source_host è stato modificato nel nodo 2 (192.168.33.13). Ora il failover è terminato.

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:

Dal registro errori

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)

Caso di prova 2 

Durante l'esecuzione dell'istruzione change master, non è necessario menzionare alcun nome di canale, indipendentemente dal fatto che tu stia utilizzando la replica basata sul canale o meno.

Esempio

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)

Quindi aggiungi le impostazioni di failover come di seguito,

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)

Ora fermerò il nodo 1 (192.168.33.12).

Errore di replica

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)

Dal registro errori 

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.

Utilizzo di ClusterControl

Ora useremo ClusterControl per ripetere questo processo di failover automatico. Ho tre nodi pxc (5.7) distribuiti da ClusterControl. Ho uno slave di replica 8.0.22 sotto il mio nodo PXC2 e aggiungeremo questa replica di lettura utilizzando ClusterControl.

Fase 1

Imposta l'accesso SSH senza password dal nodo ClusterControl per leggere il nodo di replica.

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

Fase 2

Vai su ClusterControl e fai clic sull'icona a discesa e seleziona l'opzione Aggiungi replica slave.

Fase 3

Quindi scegli l'opzione "Slave di replica esistente" e inserisci l'IP di replica di lettura, quindi fai clic su "Aggiungi slave di replica".

Fase 4

Verrà attivato un lavoro ed è possibile monitorare l'avanzamento in ClusterControl> Registri> Lavori. Una volta completato il processo, lo slave verrà visualizzato nella tua pagina Panoramica come evidenziato nello screenshot seguente.

Ora puoi controllare la topologia corrente in ClusterControl> Topologia 

Replica processo di failover automatico

Ora eseguirò i test di failover e aggiungerò le impostazioni seguenti a questa funzione (asynchronous_connection_failover_add_source) nella mia replica di lettura.

 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)

Sto per interrompere il nodo 2 (192.168.33.13). In ClusterControl, il parametro (enable_cluster_autorecovery) è abilitato, quindi promuoverà il prossimo master adatto.

Ora il mio master attuale è inattivo, quindi la replica di lettura sta tentando di connettersi di nuovo il maestro.

Errore di replica dalla replica di lettura

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)

Una volta che ClusterControl promuove il prossimo master adatto, la mia replica di lettura si connetterà a uno qualsiasi dei nodi del cluster disponibili.

Il processo di failover automatico è completato e la mia replica di lettura è tornata al nodo 1 (192.168.33.13) server.

Conclusione

Questa è una delle grandi funzionalità di MySQL, non è necessario alcun intervento manuale. Questo processo di failover automatico può farti risparmiare tempo. E riduce l'interruzione del server di replica. Vale la pena notare che quando il mio vecchio master tornava alla rotazione, la connessione di replica non tornava al vecchio master.