Cuando se ejecuta una operación DDL en el nodo primario, este retiene un bloqueo de metadatos (MDL). Los nodos de solo lectura deben esperar a que se sincronice esa información de bloqueo antes de reanudar el análisis sintáctico de los registros redo. Esto provoca que las operaciones DDL se detengan. La replicación asíncrona de MDL desacopla la sincronización de MDL del análisis sintáctico de los registros redo. De esta forma, los nodos de solo lectura continúan aplicando los registros redo mientras esperan la información del bloqueo, lo que reduce el impacto de las operaciones DDL en el rendimiento del clúster.
Versiones compatibles
|
Versión |
Revisión mínima |
|
PolarDB for MySQL 5.6 |
Todas las versiones de revisión |
|
PolarDB for MySQL 5.7 |
Todas las versiones de revisión |
|
PolarDB for MySQL 8.0 |
8.0.1.1.10 o posterior |
Para comprobar la versión de su clúster, consulte Query the engine version.
Funcionamiento
Sin la replicación asíncrona de MDL, la sincronización de MDL y el análisis sintáctico de los registros redo están acoplados en los nodos de solo lectura:
|
Nodo primario |
Nodo de solo lectura |
|
Ejecuta la operación DDL y adquiere el MDL |
Recibe la señal para sincronizar el MDL |
|
La operación DDL retiene el MDL |
Espera a que finalice la sincronización del MDL |
|
Detiene el análisis sintáctico de los registros redo durante la espera |
|
|
Finaliza la operación DDL y libera el MDL |
Finaliza la sincronización del MDL y reanuda el análisis sintáctico de los registros redo |
Con la replicación asíncrona de MDL, el nodo de solo lectura desacopla estas dos operaciones. Continúa analizando y aplicando los registros redo en segundo plano, mientras un hilo de trabajo dedicado gestiona la sincronización de MDL en paralelo.
Supervisión de la sincronización de MDL
Esta función se habilita de forma predeterminada en los clústeres compatibles. No se requiere ninguna configuración.
Dos vistas de INFORMATION_SCHEMA le permiten consultar el estado de la sincronización de MDL en un nodo de solo lectura.
Ambas consultas requieren las siguientes versiones de revisión mínimas. Si su clúster no cumple estos requisitos, upgrade the cluster version .
MySQL 8.0.1: revisión 8.0.1.1.24 o posterior
MySQL 5.7: revisión 5.7.1.0.20 o posterior
MySQL 5.6: revisión 5.6.1.0.33 o posterior Para ejecutar una consulta en un nodo específico, consulte la sección "Hint" de Descripción general .
Consulta del estado de las ranuras de MDL
Ejecute la siguiente instrucción en un nodo de solo lectura para consultar todas las ranuras activas de sincronización de MDL:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOG_MDL_SLOT;
Salida de ejemplo:
+---------+------------+-------------------+----------+-------------------+
| slot_id | slot_state | slot_name | slot_lsn | thread_id |
+---------+------------+-------------------+----------+-------------------+
| 0 | SLOT_NONE | no targeted table | 0 | no running thread |
| 1 | SLOT_NONE | no targeted table | 0 | no running thread |
| 2 | SLOT_NONE | no targeted table | 0 | no running thread |
| 3 | SLOT_NONE | no targeted table | 0 | no running thread |
| 4 | SLOT_NONE | no targeted table | 0 | no running thread |
+---------+------------+-------------------+----------+-------------------+
Cada fila representa una ranura de sincronización de MDL. La columna slot_name identifica la tabla de destino y slot_state muestra la fase actual de sincronización:
|
** |
Significado |
|
|
Estado de inicialización. No hay ninguna solicitud de MDL activa. |
|
|
El nodo de solo lectura recibió una solicitud de MDL y espera un hilo de trabajo del programador. |
|
|
Se asignó un hilo de trabajo y el nodo de solo lectura está enviando la solicitud de MDL. Si otra conexión retiene el MDL, la ranura permanece en este estado hasta que se libere el bloqueo. |
|
|
El MDL se adquirió y el nodo de solo lectura lo retiene. |
|
|
El nodo de solo lectura recibió una solicitud de liberación de MDL y espera un hilo de trabajo del programador. |
Diagnóstico de una espera de bloqueo: si una ranura se queda atascada en SLOT_ACQUIRING, es probable que el nodo de solo lectura esté esperando un MDL retenido por otra conexión. Use la consulta de hilos de trabajo que se muestra a continuación para confirmarlo. Después, compruebe si alguna conexión del nodo primario retiene un bloqueo en la tabla indicada en slot_name.
Consulta del estado de los hilos de trabajo
Ejecute la siguiente instrucción en un nodo de solo lectura para consultar los hilos de trabajo que procesan las solicitudes de sincronización de MDL:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOG_MDL_THREAD;
Salida de ejemplo:
+-----------+-----------+------------------+-------------------+----------+
| thread_id | thr_state | slot_state | slot_name | slot_lsn |
+-----------+-----------+------------------+-------------------+----------+
| 0 | free | not in acquiring | no targeted table | 0 |
| 1 | free | not in acquiring | no targeted table | 0 |
| 2 | free | not in acquiring | no targeted table | 0 |
| 3 | free | not in acquiring | no targeted table | 0 |
+-----------+-----------+------------------+-------------------+----------+
Si INNODB_LOG_MDL_SLOT muestra una ranura en SLOT_ACQUIRING y el hilo de trabajo correspondiente en INNODB_LOG_MDL_THREAD tiene un valor de thr_state distinto de free, es muy probable que el nodo de solo lectura esté esperando un MDL. Compruebe si alguna conexión del nodo primario retiene un bloqueo en la tabla indicada en slot_name.
Contacto
Si tiene dudas sobre las operaciones DDL, contáctenos.
Contacto
Si tiene dudas sobre las operaciones DDL, Contact us.