sql >> Base de Datos >  >> RDS >> Mysql

Conmutación por error automática de replicación asíncrona en MySQL 8.0.22

 

Oracle lanzó recientemente MySQL 8.0.22, y esta nueva versión viene con un nuevo mecanismo de conmutación por error de conexión asincrónica. Permite que una réplica establezca automáticamente una conexión de replicación asincrónica a una nueva fuente, en caso de que falle la existente.

En este blog, veremos este mecanismo de conmutación por error de conexión.

Resumen

El mecanismo de conmutación por error asíncrono se puede utilizar para mantener una réplica sincronizada con un grupo de servidores que comparten datos (esclavo multifuente). Moverá la conexión de replicación a una nueva fuente cuando falle la conexión de fuente existente.

Principio de funcionamiento

Cuando falla la fuente de conexión existente, la réplica primero vuelve a intentar la misma conexión la cantidad de veces especificada por MASTER_RETRY_COUNT. El intervalo entre intentos lo establece la opción MASTER_CONNECT_RETRY. Cuando se agotan estos intentos, el mecanismo de conmutación por error de la conexión asincrónica se hace cargo del proceso de conmutación por error.

Tenga en cuenta que, de forma predeterminada, MASTER_RETRY_COUNT es 86400 (1 día --> 24 horas) y el valor predeterminado de MASTER_CONNECT_RETRY es 60.

Para garantizar que el mecanismo de conmutación por error de la conexión asíncrona se pueda activar rápidamente, establezca MASTER_RETRY_COUNT en un número mínimo que solo permita algunos reintentos con la misma fuente, en caso de que la falla de la conexión sea causada por una red transitoria interrupción.

Cómo activar la conmutación por error de conexión asíncrona

  • Para activar la conmutación por error de conexión asíncrona para un canal de replicación, configure SOURCE_CONNECTION_AUTO_FAILOVER=1 en la instrucción CHANGE MASTER TO para el canal.
  • Tenemos dos funciones nuevas, que ayudarán a agregar y eliminar las entradas del servidor de la lista de fuentes.
    • asynchronous_connection_failover_add_source (agregue las entradas del servidor de la lista de fuentes)
    • asynchronous_connection_failover_delete_source (eliminar las entradas del servidor de la lista de fuentes)

Al usar estas funciones, debe especificar argumentos como ('canal', 'host', puerto, 'network_namespace', peso).

Ejemplo

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)

Los servidores de origen deben configurarse en la tabla "mysql.replication_asynchronous_connection_failover". También podemos usar la tabla "performance_schema.replication_asynchronous_connection_failover" para ver los servidores disponibles en la lista de fuentes.

Nota:si no está utilizando ninguna replicación basada en canales, este mecanismo de conmutación por error funcionará. Mientras se ejecuta la instrucción maestra de cambio, no es necesario mencionar ningún nombre de canal. Pero asegúrese de que GTID esté habilitado en todos los servidores.

Casos de uso de producción

Supongamos que tiene tres nodos PXC-5.7 con datos de producción, ejecutándose detrás de ProxySQL. Ahora, vamos a configurar la replicación asincrónica basada en canales en el nodo 1 (192.168.33.12).

  • nodo 1 - 192.168.33.12
  • nodo 2 - 192.168.33.13
  • nodo 3 - 192.168.33.14
  • Réplica de lectura: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)

Diagrama de arquitectura

Caso de prueba 1

Agregaremos la configuración de conmutación por error:

 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 todo bien, puedo activar el auto_failover. Detengamos el nodo 1 (192.168.33.12) MySQL. ProxySQL promoverá el siguiente maestro adecuado.

[[email protected] lib]# service mysqld stop

Redirecting to /bin/systemctl stop mysqld.service

En el Servidor Réplica

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)

El subproceso IO está en estado de "conexión". Esto significa que está intentando establecer la conexión desde la fuente existente (nodo 1) en función de la configuración master_retry_count y master_connect_retry .

Después de unos segundos, puede ver que source_host se cambió al nodo 2 (192.168.33.13). Ahora la conmutación por error está hecha.

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:

Desde el registro de errores

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 de prueba 2 

Mientras se ejecuta la declaración maestra de cambios, no es necesario mencionar ningún nombre de canal, ya sea que esté utilizando la replicación basada en canales o no.

Ejemplo

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)

Luego agregue la configuración de conmutación por error como se muestra a continuación,

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)

Ahora, voy a detener el nodo 1 (192.168.33.12).

Error de replicación

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)

Desde el registro de errores 

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.

Uso de ClusterControl

Ahora usaremos ClusterControl para repetir este proceso de conmutación por error automático. Tengo tres nodos pxc (5.7) implementados por ClusterControl. Tengo un esclavo de replicación 8.0.22 en mi PXC node2 y agregaremos esta réplica de lectura usando ClusterControl.

Paso 1

Configure el inicio de sesión SSH sin contraseña desde el nodo ClusterControl para leer el nodo de réplica.

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

Paso 2

Vaya a ClusterControl y haga clic en el ícono desplegable y seleccione la opción Agregar esclavo de replicación.

Paso 3

Luego, elija la opción "Esclavo de replicación existente" e ingrese la IP de la réplica de lectura y luego haga clic en "Agregar esclavo de replicación".

Paso 4

Se activará un trabajo y podrá monitorear el progreso en ClusterControl> Registros> Trabajos. Una vez que se complete el proceso, el esclavo aparecerá en su página de Descripción general como se destaca en la siguiente captura de pantalla.

Ahora puede comprobar la topología actual en ClusterControl> Topología 

Proceso de conmutación por error automático de réplica

Ahora voy a realizar una prueba de conmutación por error y agregaré la siguiente configuración a esta función (asynchronous_connection_failover_add_source) en mi réplica de lectura.

 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)

Voy a detener el nodo 2 (192.168.33.13). En ClusterControl, el parámetro (enable_cluster_autorecovery) está habilitado, por lo que promoverá el siguiente maestro adecuado.

Ahora mi maestro actual está inactivo, por lo que la réplica de lectura está intentando conectarse de nuevo el maestro.

Error de replicación de la réplica de lectura

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 vez que ClusterControl promueve el siguiente maestro adecuado, mi réplica de lectura se conectará a cualquiera de los nodos de clúster disponibles.

El proceso de conmutación por error automático se completó y mi réplica de lectura se unió nuevamente al nodo 1 (192.168.33.13) servidor.

Conclusión

Esta es una de las grandes características de MySQL, no se necesita intervención manual. Este proceso de conmutación por error automático puede ahorrarle algo de tiempo. Y reduce la interrupción del servidor de réplica. Vale la pena señalar que, cuando mi maestro anterior volvió a la rotación, la conexión de replicación no volvería a cambiar al maestro anterior.