Principio preliminar de replicación maestro-esclavo de alta disponibilidad de Redis

Principio preliminar de replicación maestro-esclavo de alta disponibilidad de Redis

(1) ¿Qué es la replicación maestro-esclavo?

La replicación maestro-esclavo se refiere a copiar los datos de un servidor redis a otros servidores redis. El primero se llama maestro y el segundo esclavo. La replicación de datos es unidireccional, solo desde el nodo maestro al nodo esclavo. El nodo maestro es responsable de las operaciones de escritura y el nodo esclavo es responsable de las operaciones de lectura. La replicación maestro-esclavo implementa múltiples copias de datos en otros nodos, logrando así una alta disponibilidad de redis, logrando respaldo redundante de datos y asegurando una alta confiabilidad de datos y servicios.

Inserte la descripción de la imagen aquí

En pocas palabras, la función principal de la replicación maestro-esclavo es garantizar la confiabilidad de los datos. En el caso de tiempo de inactividad del servidor debido a un corte de energía o daño en el disco duro, la copia de seguridad de datos de múltiples nodos de la replicación maestro-esclavo puede ser muy conveniente y rápida para la recuperación de datos. Además de garantizar la confiabilidad, la replicación maestro-esclavo tiene otras funciones:

1. Redundancia de datos: la replicación maestro-esclavo realiza una copia de seguridad en caliente de los datos, que es un método de redundancia de datos además de la persistencia.
2. Recuperación de fallas: cuando el nodo maestro tiene un problema, el nodo esclavo puede proporcionar servicios para lograr una rápida recuperación de fallas.
3. Equilibrio de carga: sobre la base de la replicación maestro-esclavo, con la separación de lecturas y escrituras, el nodo maestro puede proporcionar servicios de escritura y los nodos esclavos brindan servicios de lectura para compartir la carga del servidor, especialmente en el escenario de menos escrituras y más lecturas. Un nodo esclavo comparte la carga de lectura, lo que puede aumentar considerablemente la simultaneidad del servidor Redis.
4. La piedra angular de la alta disponibilidad: la replicación maestro-esclavo es la base para la implementación de centinelas y clústeres, por lo que la replicación maestro-esclavo es la base para la alta disponibilidad de Redis.

(2) Tres etapas de replicación maestro-esclavo

El flujo de trabajo completo de la replicación maestro-esclavo se divide en las siguientes tres etapas, cada una de las cuales tiene su propio flujo de trabajo interno, luego estudiaremos estos tres procesos.

  1. El proceso de establecer una conexión: el proceso de conectar el esclavo al maestro
  2. Proceso de sincronización de datos: el proceso de sincronización de datos del maestro al esclavo.
  3. Proceso de propagación de comandos: el maestro sincroniza repetidamente los datos con el esclavo

Inserte la descripción de la imagen aquí

1. Establecimiento del proceso de conexión

Establecer una conexión es el primer paso en la replicación maestro-esclavo. Hable brevemente sobre el flujo de trabajo de la fase de establecimiento de la conexión:

  1. El esclavo establece la dirección y el puerto del maestro y guarda la información del maestro
  2. Establecer una conexión de socket
  3. Envíe comandos de ping continuamente
  4. Autenticación
  5. Enviar información del puerto esclavo al maestro

Obviamente, en el proceso de establecer una conexión, el nodo esclavo guarda la dirección y el puerto del maestro, y el nodo maestro maestro guarda el puerto del nodo esclavo. Aquí está el diagrama de flujo:

Inserte la descripción de la imagen aquí

2. Proceso de sincronización de datos

Cuando el nodo esclavo se conecta al nodo maestro por primera vez, primero realizará una copia completa. Esta copia completa es inevitable, aunque la copia completa consume muchos recursos. Después de que se ejecuta la copia completa, el nodo maestro enviará los datos en el búfer de copia al nodo esclavo, y luego el nodo esclavo ejecutará el comando bgrewriteaof para restaurar los datos, que también es una copia parcial. Aquí está el diagrama de flujo:

Inserte la descripción de la imagen aquí

3. Fase de propagación de comandos

Cuando se modifica la base de datos maestra y los datos de los servidores maestro y esclavo son inconsistentes, los datos maestro y esclavo se sincronizarán para que sean consistentes en este momento.Este proceso se denomina propagación de comandos. El maestro enviará el comando de cambio de datos recibido al esclavo, y el esclavo ejecutará el comando después de recibir el comando para hacer que los datos maestro-esclavo sean consistentes.

(3) Copia completa y copia parcial

Hablemos de la copia completa y la copia parcial en detalle a continuación:

Inserte la descripción de la imagen aquí

  1. El nodo esclavo envía el comando psync? 1 psync runid offset para encontrar el nodo del runid correspondiente para solicitar datos, pero hay un problema aquí. Cuando el nodo esclavo se conecta por primera vez, el runid y el desplazamiento del nodo maestro no se conocen en absoluto. Entonces, ¿el primer comando enviado es psync? 1. Significa que todos los datos del nodo maestro deben estar sincronizados.
  2. El nodo maestro comienza a ejecutar bgsave para generar un archivo RDB y registra el desplazamiento de compensación de copia actual.
  3. El nodo maestro envía su runid y offset al nodo esclavo a través del comando + FULLRESYNC runid offset, y luego envía el archivo RDB a través del socket al nodo esclavo. En esta etapa, el nodo maestro puede recibir instrucciones del cliente y el desplazamiento ha cambiado.
  4. El nodo esclavo recibe el runid y el desplazamiento del nodo maestro y los guarda, luego borra todos los datos actuales en la base de datos, recibe el archivo RDB a través del socket y comienza a restaurar los datos RDB (copia completa).
  5. Después de la replicación completa, el nodo esclavo ha obtenido el runid y el desplazamiento del nodo maestro y comienza a enviar el comando psync runid offset.
  6. El nodo maestro recibe el comando, juzga si el runid coincide y juzga si el desplazamiento está en el búfer de copia.
  7. El nodo maestro juzga el runid y el desplazamiento, y si uno no está satisfecho, volverá al paso 2 para continuar realizando la replicación completa. El motivo del desajuste de runid aquí puede ser un reinicio inesperado del nodo esclavo, y el desajuste de compensación (compensación) es causado por el desbordamiento del búfer de copia. Si se pasa la verificación de runid o offset, si el offset del nodo esclavo es el mismo que el offset del nodo maestro, será ignorado. Si el offset del nodo esclavo no es el mismo que el offset del nodo maestro, el nodo maestro enviará + CONTINUE offset (este offset del nodo maestro ) Comando para enviar las operaciones desde el desplazamiento del nodo al desplazamiento del nodo maestro en el búfer de copia a través del socket (de hecho, el nodo esclavo realiza menos operaciones que el nodo maestro).
  8. Una vez que el nodo esclavo recibe el desplazamiento enviado por el nodo maestro y recibe la información a través del socket, ejecuta bgrewriteaof para restaurar los datos.

Obviamente, descubrimos que la copia parcial es mucho más complicada que la copia completa, así que echemos un vistazo a algunos detalles de la copia parcial:

1. Runid

Este runid se menciona muchas veces anteriormente. De hecho, el runid es un id aleatorio que redis generará automáticamente cuando se inicie (debe tenerse en cuenta aquí que el id será diferente cada vez que se inicie), que se compone de 40 hexadecimales aleatorios Está compuesto por una cadena de sistema para identificar de forma única un nodo redis.

Cuando se inicia la replicación maestro-esclavo por primera vez, el maestro enviará su runid al esclavo y el esclavo guardará la identificación del maestro. Cuando el esclavo se desconecta y se vuelve a conectar, el esclavo envía esta identificación al maestro. Si el runid guardado por el esclavo es el mismo que el runid actual del maestro, el maestro intentará usar la replicación parcial (el otro factor para la replicación exitosa es compensado, como se mencionó anteriormente) . Si el runid guardado por el esclavo es diferente del runid actual del maestro, la copia completa se realizará directamente.

2. Copiar búfer

El búfer de copia es una cola de primero en entrar, primero en salir que se utiliza para almacenar los registros de comando del maestro para recopilar datos. El espacio de almacenamiento predeterminado del búfer de copia es 1M. Puede modificar el repl-backlog-size 1mb en el archivo de configuración para controlar el tamaño del búfer.

Inserte la descripción de la imagen aquí

De hecho, el búfer de copia son los datos persistentes AOF almacenados (entre los registros persistentes el comando emitido por el cliente), y está separado por bytes, y cada byte tiene su propio desplazamiento, este desplazamiento La cantidad es la compensación de la copia que mencionamos anteriormente (compensación).

Como mencionamos anteriormente, si el espacio del búfer de copia es insuficiente, puede llevar a una copia completa. En la fase de propagación de comandos, el nodo maestro almacenará los comandos recopilados en el búfer de copia y luego los enviará al nodo esclavo. Aquí es donde surge el problema. Cuando el número de comandos recibidos por el nodo maestro desde el cliente es extremadamente grande en un instante, y se excede la memoria del búfer de copia, se exprimirán algunos datos, lo que resultará en comandos del nodo maestro y del nodo esclavo. Inconsistente, copia tan completa. Si el tamaño del búfer se establece de manera irrazonable, es muy probable que cause un bucle infinito, y el nodo esclavo siempre copiará por completo, vaciará los datos y copiará por completo.

3. Copie el desplazamiento

El desplazamiento de copia del nodo maestro es enviar un registro una vez al nodo esclavo, y el nodo esclavo recibe un registro una vez. Se utiliza para sincronizar información, comparar la diferencia entre el nodo maestro y el nodo esclavo y restaurar el uso de datos cuando el esclavo está desconectado. Este valor también proviene del desplazamiento en el área de trabajo pendiente del búfer de copia.

Inserte la descripción de la imagen aquí

(4) Mecanismo de latido del corazón

Podemos pensar en un problema. En el proceso de replicación maestro-esclavo, debemos saber si el nodo maestro y el esclavo están en línea y funcionando normalmente. Si un determinado nodo tiene una latencia alta o no responde, se deben tomar las medidas correspondientes, como Detenga la replicación maestro-esclavo, etc., entonces, ¿cómo sabe cada nodo si otros nodos están en línea?

En la fase de propagación de comandos, el nodo maestro y el nodo esclavo siempre necesitan intercambiar información.Este intercambio de información utiliza un mecanismo de latido de mantenimiento para darse cuenta de la conexión entre el nodo maestro y el nodo esclavo. Echemos un vistazo al papel del latido del nodo maestro y el latido del nodo esclavo:

1. latido del corazón maestro

Instrucción: El ping se
realiza cada 10 segundos de forma predeterminada. Está determinado por el parámetro repl-ping-slave-period. Es el
principal responsable de juzgar si el nodo esclavo está en línea.
Puede usar la replicación de información para ver el intervalo de un tiempo de conexión después de que se alquila el nodo esclavo. Si el retraso es 0 o 1, es estado normal.

2. latido del corazón del esclavo

Instrucción: replconf ack {offset}
se ejecuta una vez por segundo. Lo
principal a hacer es enviar su propio offset de replicación al nodo maestro, obtener el último comando de cambio de datos del nodo maestro y determinar si el nodo maestro está en línea.

Nota: Para garantizar la estabilidad de los datos, el nodo maestro se negará a sincronizar toda la información cuando el número de nodos esclavos que cuelguen exceda un valor establecido o el retraso sea demasiado alto. Hay dos parámetros que se pueden configurar y ajustar:

  • min-esclavos-para-escribir 2
  • min-esclavos-max-lag 8

Estos dos parámetros indican que solo quedan 2 nodos esclavos, o cuando el retraso del nodo esclavo es superior a 8 segundos, el nodo maestro cerrará a la fuerza la función de maestro y detendrá la sincronización de datos. Entonces, ¿cómo sabe el nodo maestro la cantidad de nodos esclavos y el tiempo de retardo? Como se mencionó anteriormente, en el mecanismo de latido, el esclavo envía el comando perlconf ack cada segundo. Este comando puede llevar el desplazamiento, el tiempo de retardo del nodo esclavo y el número de nodos esclavos.

15 de septiembre de 2020

Supongo que te gusta

Origin blog.csdn.net/weixin_43907422/article/details/105835347
Recomendado
Clasificación