Redis serie-maestro-esclavo sincronización

Para resolver el problema de seguridad de datos causado por un solo punto de falla y mejorar la alta concurrencia de las operaciones de lectura de datos, Redis implementa un mecanismo de sincronización maestro-esclavo maestro-esclavo, es decir, desplegar un nodo maestro para ser responsable de las operaciones de lectura y escritura y sincronizar datos con nodos esclavos Implemente múltiples nodos esclavos para que sean responsables de leer las operaciones y recibir los comandos de operación de sincronización del nodo maestro.

Configuración de sincronización maestro-esclavo:

La configuración del mecanismo de sincronización maestro-esclavo es relativamente simple: configure la opción esclavo del masterport masterip en el archivo de configuración redis.conf del nodo esclavo o use directamente el comando slaveof masterip masterport (después de la versión Redis 5.0, use el comando replicaof), también podemos configurar el esclavo La naturaleza de solo lectura del nodo: esclavo de solo lectura sí.

Cabe señalar que en el modo de sincronización maestro-esclavo, incluso si el nodo maestro está inactivo, el nodo esclavo no se convertirá en el nodo maestro para las operaciones de escritura. Debe cooperar con el mecanismo centinela o el modo de clúster para lograr una alta disponibilidad . La sincronización maestro-esclavo solo está altamente disponible. Fundación

Ventajas de la sincronización maestro-esclavo:

  • Logre una copia de seguridad en caliente de los datos de manera redundante de múltiples copias de datos.
  • Evite problemas de seguridad de datos con puntos únicos de falla.
  • Separación de lectura y escritura, equilibrio de carga, mejora del rendimiento y concurrencia.
  • El nodo esclavo pertenece a un solo nodo maestro y los datos fluyen en una dirección.

Estrategia de sincronización maestro-esclavo:

1. Sincronización completa: también llamada sincronización de instantáneas, que generalmente ocurre durante la fase de inicialización del nodo esclavo, o el nodo esclavo se desconecta del nodo maestro. Después de reconectarse, puede ser necesario copiar todos los datos del nodo maestro.

  • El esclavo envía un comando de sincronización al maestro.
  • El maestro ejecuta el comando bgsave para generar el archivo RDB y escribe los comandos posteriores en el área de caché.
  • Después de ejecutar bgsave, el maestro envía el archivo rdb al esclavo, y el esclavo carga el archivo rdb.
  • El maestro envía los comandos en el búfer al esclavo para su ejecución.

Podemos ver que la sobrecarga de la sincronización completa es muy grande. Master genera archivos RDB, envía archivos RDB a los esclavos, y Slave carga los archivos RDB que consumen muchos recursos. Por lo tanto, no ejecute el comando de sincronización a menos que sea necesario o necesario.

2. Propagación de comandos: después de que se completa la sincronización completa, el estado del nodo esclavo y el nodo maestro son consistentes, pero cuando el nodo maestro recibe el comando de escritura, el estado se vuelve inconsistente y el nodo maestro necesita enviar el comando que causa la inconsistencia al nodo esclavo Ir a ejecutar y restaurar el estado a la coherencia.

3. Sincronización incremental: antes de la versión 2.8, después de que el nodo esclavo y el nodo maestro fueron desconectados y reconectados, se requería una sincronización completa. Este enfoque es muy ineficiente. Para resolver este problema, la versión Redis 2.8 implementa el comando psync, psync El comando tiene dos modos:

  • Sincronización incremental completa (resincronización completa): el proceso es básicamente el mismo que la sincronización completa, que se utiliza principalmente para completar la sincronización de datos inicial del nodo esclavo.
  • Resincronización parcial (resincronización parcial): se utiliza principalmente cuando el esclavo y el maestro se desconectan y vuelven a conectar, el maestro envía el comando de escritura durante la desconexión al nodo esclavo para su ejecución, manteniendo el estado constante.

(1) Componentes:

  • Desplazamiento de desplazamiento de copia: se mantiene un desplazamiento de copia en el maestro y el esclavo, y los estados maestro y esclavo se pueden conocer comparando los desplazamientos.
  • Copia de búfer: una cola FIFO de longitud fija mantenida por el maestro para almacenar comandos de escritura. Debido a que la longitud es fija, solo se pueden almacenar los comandos más recientes.
  • ID de instancia: tanto el maestro como el esclavo tienen una ID en ejecución.

(2) Detalles de implementación:

  • Cuando el maestro propaga el comando, además de enviar el comando de escritura al esclavo, también coloca el comando de escritura en el búfer de copia.
  • Cada vez que el maestro ejecuta un comando de escritura, establece su propio desplazamiento + N, N es el número de bytes ocupados por el comando de escritura, y el búfer de copia registrará el desplazamiento correspondiente para cada byte en la cola.
  • Cada vez que un esclavo recibe un comando de escritura, también establece su propio desplazamiento + N, donde N es el número de bytes en el comando de escritura. Si las compensaciones en maestro y esclavo son las mismas, significa que los dos estados son consistentes, de lo contrario, son inconsistentes.
  • Cuando el esclavo se desconecta y se vuelve a conectar, envíe el comando psync para informar su desplazamiento actual al maestro. El maestro determina si el desplazamiento informado todavía está en el búfer de copia. Si lo hace, inicia una sincronización incremental parcial y envía el comando de escritura después del desplazamiento. Sin embargo, si no es así, significa que se pierde el comando y se inicia una sincronización incremental completa.
  • El ID de la instancia se genera cuando se inicia el nodo y está compuesto por 40 hexadecimales aleatorios. Cuando el esclavo copia por primera vez los datos del maestro, el maestro envía su ID al esclavo, que el esclavo mantiene. Cuando el esclavo se desconecta y se vuelve a conectar, se La ID guardada por usted mismo se envía al maestro reconectado. El maestro juzga si la ID es consistente con su propia ID. Si coinciden, significa que el maestro no ha cambiado. Intente la sincronización incremental parcial.

(3) El tamaño del búfer de copia:

  • El tamaño del búfer de copia es de 1M de forma predeterminada. Cuando el maestro ejecuta una gran cantidad de comandos de escritura o el esclavo se desconecta por un tiempo prolongado, la cola se desbordará, resultando en una sincronización incremental inválida. Por lo tanto, es necesario predecir y configurar el tamaño del búfer de copia para aumentar La cantidad está sincronizada.

 

La sincronización maestro-esclavo es la base para que Redis logre una alta disponibilidad. Comprender los principios y métodos de sincronización maestro-esclavo será de gran ayuda para aprender la alta disponibilidad de Redis.

PD: Si tiene alguna pregunta o pregunta, por favor déjeme un mensaje.


Amigos a quienes les gusta este artículo, presten atención al número público y reciban el contenido actualizado lo antes posible.

Publicado 7 artículos originales · ganó 2 · vistas 306

Supongo que te gusta

Origin blog.csdn.net/weixin_45784328/article/details/105635997
Recomendado
Clasificación