Maestro-esclavo MySQL, domínalo en 5 minutos
Los maestros y subordinados de MySQL siempre han sido entrevistados frecuentes. Los puntos de conocimiento que contiene son muy básicos, pero no muchos estudiantes pueden responder todas las preguntas.
Por ejemplo, cuando estaba en una entrevista en Xiaomi, me preguntaron sobre el principio de replicación maestro-esclavo y la solución al retraso maestro-esclavo. Debido a que respondí muy bien, dejé una muy buena impresión. el entrevistador.
Esta es la primera vez que veo el problema maestro-esclavo en MySQL.
El llamado maestro-esclavo MySQL consiste en crear dos bases de datos idénticas, una es la base de datos maestra y la otra es la base de datos esclava. La base de datos maestra proporciona operaciones de lectura/escritura y la base de datos esclava proporciona operaciones de lectura. El siguiente es un modelo maestro-esclavo:
Para una implementación independiente de la base de datos, una máquina 8G de 4 núcleos que ejecute MySQL 5.7 puede admitir aproximadamente 500 TCP/IP.
Para una implementación de base de datos independiente que ejecuta MySQL 5.7 en una máquina 8G de 4 núcleos, puede admitir aproximadamente 500 TPS y 10 000 QPS. El tráfico de consultas aumenta cuando hay alguna actividad, por lo que necesita una separación maestro-esclavo.
El modelo de acceso de la mayoría de los sistemas es leer más y escribir menos, y la brecha entre las solicitudes de lectura y escritura puede ser de varios órdenes de magnitud, por lo que podemos usar master-many-slave Este método significa que el el maestro solo es responsable de parte de la lógica central de escritura y consulta, mientras que varios esclavos solo son responsables de la consulta. Esto puede mejorar el rendimiento de la consulta y reducir la presión sobre la base de datos maestra.
La base de datos maestro-esclavo MySQL también puede lograr una alta disponibilidad, por lo que cuando la base de datos maestra deja de funcionar, la base de datos esclava se puede cambiar a la base de datos maestra para garantizar una alta disponibilidad del servicio, y luego a la base de datos maestra. También puede realizar la recuperación de desastres de los datos.
La situación general se resume a continuación:
La replicación maestro-esclavo de MySQL se basa en binlog, que es un archivo de registro binario que registra todos los cambios en MySQL y los guarda en formato binario. en el disco.
La replicación maestro-esclavo es el proceso de transferir datos en el binlog desde la estación maestra a la estación esclava. Generalmente es un proceso asincrónico, es decir, la operación en la estación maestra no espera a que se ejecute. sincronización de binlog para completarse.
Los detalles del proceso son los siguientes:
¿Qué sucede si la sincronización de datos entre el maestro y el esclavo se interrumpe repentinamente? Dado que se mantiene un enlace largo entre la estación maestra y la estación esclava, la estación maestra tiene un hilo interno dedicado a servir el enlace largo de la estación esclava.
En el siguiente escenario, si la estación principal ejecuta el siguiente SQL, en el que a y create_time son ambos índices:
Sabemos que cuando los datos seleccionan a índice y create_time selecciona el índice a, de Los datos que salen del límite 1 suelen ser diferentes.
Entonces ocurre esta situación: en el formato de declaración binlog =, la estación maestra usa el índice a al ejecutar este SQL, y la estación esclava usa el índice create_time al ejecutar este SQL. Finalmente, la estación maestra. es inconsistente con los datos de la estación esclava.
Entonces, ¿cómo solucionamos este problema?
Puedes cambiar el formato binlog al formato de línea. El binlog con formato de fila registrará dos eventos en lugar de texto SQL sin formato: Table_map y Delete_rows.
El evento Table_map describe la tabla que se va a operar, mientras que el evento Delete_rows se utiliza para definir el comportamiento de eliminación y registrar el número exacto de filas eliminadas. El formato de fila binlog registra la información de ID de la clave principal que se eliminará, por lo que no habrá inconsistencia maestro-esclavo.
Sin embargo, si SQL elimina 100.000 filas de datos, el uso del formato de fila ocupará mucho espacio y hay 100.000 filas de datos en el binlog. Escribir el binlog consume mucho IO, pero el El formato de declaración binlog puede causar inconsistencia en los datos.
A las personas que diseñaron MySQL se les ocurrió un compromiso, el formato híbrido binlog, que en realidad es una mezcla de formato de fila y formato de declaración.
El formato de fila se utiliza cuando MySQL determina que los datos pueden ser inconsistentes; de lo contrario, se utiliza el formato de declaración.
A veces, cuando encontramos problemas extraños en los que no podemos obtener información de la base de datos, tendremos problemas para determinar si hay lógica en el código para eliminar lo que escribimos antes, pero luego lo descubrirás cuando Al consultar los datos, puede leer los datos después de un tiempo, eso es básicamente la latencia maestro-esclavo en acción.
El retraso maestro-esclavo es en realidad la diferencia entre el tiempo de finalización de la "reproducción del esclavo" y el tiempo de finalización de la "escritura del binlog maestro", lo que hace que los datos consultados por el esclavo sean inconsistentes con los datos del maestro. .
Cuando se habla del principio del retraso en la sincronización de la base de datos MySQL, se debe partir del principio de replicación maestro-esclavo de MySQL:
Resuma las principales razones del retraso maestro-esclavo: Maestro- El retraso del esclavo ocurre principalmente en "Después del paso "Reproducción de registro", el TPS de la estación maestra se está ejecutando simultáneamente en este momento.
Descripción general de las principales causas del retraso: el retraso maestro-esclavo ocurre principalmente en el paso "Reproducción del registro de retransmisión". Cuando la concurrencia de TPS del sitio maestro es alta, la cantidad de DDL generado excede un único SQL. Se producirán latencias en los subprocesos en el sitio esclavo y, por supuesto, puede haber esperas de bloqueo para declaraciones de consulta grandes en el esclavo.
Normalmente monitoreamos y alertamos sobre la latencia del esclavo como métrica clave de la base de datos. La latencia normal es de milisegundos, pero una vez que la latencia alcanza los segundos, debemos generar una alerta.
Además de acortar el retraso maestro-esclavo, existen otras formas de resolver este problema. El principio básico es intentar no consultar la base de datos esclava.
Las soluciones específicas son las siguientes:
En escenarios de aplicaciones reales, para algunos escenarios muy básicos, como inventario, órdenes de pago, etc., es necesario consultar la base de datos directamente. Mientras que en otros escenarios no principales, no consulta la base de datos principal.
Hay dos máquinas A y B. A es la base de datos maestra, responsable de leer y escribir, y B es la base de datos esclava, responsable de leer datos.
Si la biblioteca A falla, la biblioteca B se convierte en la biblioteca maestra, responsable de la lectura y escritura. Una vez reparada la falla, la biblioteca A se convierte en la biblioteca esclava y la biblioteca maestra B sincroniza los datos con la biblioteca esclava A.
Una biblioteca maestra tiene múltiples bibliotecas esclavas. A es la biblioteca maestra y es responsable de leer y escribir, B y D son bibliotecas esclavas y son responsables de la lectura.
Si el banco A falla, el banco B se convierte en el maestro responsable de las lecturas y escrituras, siendo C y D responsables de las lecturas. Una vez reparada la falla, A también se convertirá en la base de datos esclava y la base de datos maestra B sincronizará los datos con la base de datos esclava A.