
Desde el lanzamiento inicial, una de las mayores quejas que he tenido sobre Group Replication es que le ha permitido leer datos «obsoletos» y no había manera de prevenir o incluso saber que había leído datos «obsoletos». Era una gran limitación. Afortunadamente, Oráculo funciones lanzadas para controlar los niveles de consistencia, y fue hace exactamente un año! No sé ustedes, pero personalmente me ha confundido el nombre group_replication_consistency = ‘DESPUÉS’ o ‘COMIENZO’.
Así que ahora quiero tratar de darle sentido y compartir mi comprensión (incluso si es un año después).
Configurar:
Comenzaremos con el valor predeterminado group_replication_consistency = ‘EVENTUAL’ y trabajaremos desde allí. Entonces, consideremos una tabla muy simple:
CREAR TABLA `t1` (` id` int (11) NO NULL AUTO_INCREMENT, `cnt` int (11) NULO POR DEFECTO, CLAVE PRINCIPAL (` id`))
CREAR MESA `t1` ( `identificación` En t(11) NO NULO AUTOINCREMENTO, `centavo` En t(11) DEFECTO NULO, LA OFICINA DEL ALCALDE LLAVE (`identificación`) ) |
Con más de 10 millones de archivos:
selecciona el conteo
de t1; + ———- + | contar | + ———- + | 10485760 | + ———- +Seleccionecontar( * )sí t1 ; + ———- +|contar( * ) | + ———- + | 10485760 |
| + ———- +
Y haremos una acción muy sencilla.
En el Nodo 1 actualice la tabla y en el Nodo 2 lea los datos.
Nodo 1: ACTUALIZAR t1 ESTABLECER cnt = 11; Consulta OK, 10485760 fila dividida (1 min 20.23 seg) Fila correspondiente: 10485760 Cambiado: 10485760 Advertencias: 0 ACTUALIZAR t1COLOCARcentavo= 11 ;Pregunta OK , 10485760 póngase en filaafectado ( 1 min20.23 segundo )Righe acompañado :10485760 Cambio :10485760 Advertencias |
:
0
Y luego al Nodo 2: seleccione cnt de t1 donde id = 10001; + —— + | centavo | + —— + | 10 | + —— + 1 fila en conjunto (0.00 seg) Seleccione centavo sí t1dondeidentificación= 10001 ; + —— + |centavo | + —— +| 10 | + —— + 1 póngase en fila encolocar (0.00 |
segundo
- )
- Aquí hay algunas cosas a tener en cuenta:
En el Nodo 1, la transacción tardó 1 minuto y 20 segundos en ejecutarse
En el Nodo 2 obtuvimos el resultado de inmediato, pero esencialmente obtuvimos una lectura «estable» en la que los datos ya estaban actualizados, pero teníamos una versión anterior.
¿Cómo podemos obtener mejores resultados? group_replication_consistency = ‘PRIMA’; Veamos el nivel de consistencia «PRINCE».
Dice que una transacción en el Nodo 2 esperará hasta que la transacción previamente comprometida en el Nodo 1 también se comprometa en el Nodo 2.
Luego cambiamos la sesión establecida a group_replication_consistency = ‘MAIN’; en el nodo 2 y vuelva a realizar una actualización similar.
Nodo 1 (todavía group_replication_consistency = ‘EVENTUAL’;): ACTUALIZAR t1 ESTABLECER cnt = 12; Consulta OK, 10485760 fila dividida (1 min 18,66 seg) Fila correspondiente: 10485760 Cambiado: 10485760 Advertencias: 0 ACTUALIZAR t1COLOCARcentavo= 12 ;Pregunta OK , 10485760 póngase en filaafectado ( 1 min18.66 segundo )Righe acompañado :10485760 Cambio :10485760 Advertencias |
:
0
Y después de eso, en el Nodo 2 (con la sesión establecida group_replication_consistency = ‘MAIN’;): seleccione cnt de t1 donde id = 10001; + —— + | centavo | + —— + | 12 | + —— + 1 fila en conjunto (1 min 11.45 seg) Seleccione centavo sí t1dondeidentificación= 10001 ; + —— + |centavo | + —— +| 12 | + —— + 1 póngase en fila encolocar ( 1 min11.45 |
segundo
- )
- Así que hay algunos cambios notables:
- La transacción en el Nodo 2 devolvió el resultado correcto ahora.
Pero ahora tardó 1 min 11 seg en volver (en lugar de 0 seg como en el caso anterior). Básicamente, la transacción esperó a que la transacción del Nodo 1 se aplicara al Nodo 2
El tiempo de ejecución en el Nodo 1 no ha cambiado.
Este modo nos permitió hacer exactamente lo que queríamos: evitar lecturas obsoletas. ¡Gran resultado! Entonces, ¿qué pasa con group_replication_consistency = ‘DESPUÉS’?
group_replication_consistency = ‘DESPUÉS’;
Este modo dice que una transacción en el Nodo 1 no devuelve OK hasta que se asegure de que los otros nodos hayan aplicado la transacción. Para verlo en acción, coloque el Nodo 1 en group_replication_consistency = ‘AFTER’ y el Nodo 2 en group_replication_consistency = ‘EVENTUAL’;.
Nodo 1 (en group_replication_consistency = ‘DESPUÉS’): ACTUALIZAR t1 ESTABLECER cnt = 13; Consulta OK, 10485760 fila dividida (3 min 0,46 seg) Fila correspondiente: 10485760 Cambiado: 10485760 Advertencias: 0 ACTUALIZAR t1COLOCARcentavo= 13 ;Pregunta OK , 10485760 póngase en filaafectado ( 3 min0.46 segundo )Righe acompañado :10485760 Cambio :10485760 Advertencias |
:
0
Después de eso, Nodo 2 (en group_replication_consistency = ‘EVENTUAL’): seleccione cnt de t1 donde id = 10001; + —— + | centavo | + —— + | 13 | + —— + 1 fila en conjunto (0.00 seg) Seleccione centavo sí t1dondeidentificación= 10001 ; + —— + |centavo | + —— +| 13 | + —— + 1 póngase en fila encolocar (0.00 |
segundo
)
Aquí la situación es diferente. Ahora el tiempo de ejecución en el Nodo 1 se ha duplicado, ya que la transacción espera estar ocupada en todos los nodos y después del Nodo 2 la ejecución es inmediata.
- Este modo siempre evita lecturas «obsoletas», pero en este caso, hemos cambiado el tiempo de espera del Nodo 2 al Nodo 1, y así es como podemos ver la diferencia entre los modos de consistencia «PRI» y «AFTER». replicación de grupos.
- Los dos modos proporcionan una vista coherente, pero:
En modo «PRINCE»: se bloquearán los lectores de los nodos secundarios, esperando el momento en que se disponga de la vista coherente, y
En el modo «DESPUÉS», los escritores están bloqueados hasta que los otros nodos obtengan una vista coherente. Entonces, ¿qué camino elegir? En realidad, creo que es bueno tener una opción aquí. Puedes elegir, si lo deseas, configurar el tiempo de espera para tus lectores o escritores; la decisión depende de cómo esté diseñada su aplicación.