¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Replicación de datos: primario y réplicas

Después de esta lección: Puedo explicar cómo se mantienen las copias de unos datos y qué hace un fallo con ellas.

Lección de 55 min4 comandosLaboratorio de Valkey: aprende un almacén clave-valor compatible con Redis, con expiración y listas

Una copia que salva el servicio

La replicación consiste en guardar los mismos datos en varias máquinas. Si una falla, otra tiene la información y el servicio sigue.

Una tienda en línea la usa para no perder el stock cuando se estropea un disco, y para repartir las lecturas entre varias copias. Esta lección explica cómo se mantienen las copias y qué pasa cuando una máquina cae.

Al final de esta lección

Nota

Puedo explicar cómo se mantienen las copias de unos datos y qué hace un fallo con ellas.

Palabras clave

PalabraQué significa
Réplicauna copia de los datos en otro nodo
Primarioel nodo que recibe las escrituras
Registro de cambiosla lista ordenada de escrituras que las copias repiten
Retraso de replicaciónlos cambios que una réplica aún no ha aplicado
Conmutación por errordar el papel de primario a una réplica (failover en inglés)

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

El primario escribe y las réplicas repiten

En el esquema más común hay un primario, el único que acepta escrituras. Cada escritura se anota en un registro de cambios, con un número de orden.

Las réplicas leen ese registro y repiten los cambios, en el mismo orden. Así acaban con los mismos datos. Las lecturas se pueden repartir entre todas las copias.

Ejemplo: tres copias y un registro

NúmeroCambioPrimarioRéplica ARéplica B
1mochila = 14aplicadoaplicadoaplicado
2mochila = 13aplicadoaplicadoaplicado
3gorra = 9aplicadoaplicadopendiente
4mochila = 12aplicadopendientependiente

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Fabricar un cliente pequeño llamado v

Comando
v() ( printf '%s\r\n' "$*" | nc -w 1 valkey 6379 )

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribir el stock en el primario

Comando
v SET stock:mochila 14

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Preguntar qué papel tiene este nodo

Comando
v INFO replication | grep -E "^(role|connected_slaves)"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una réplica puede ir por detrás

Copiar un cambio por la red lleva tiempo. Durante ese tiempo la réplica aún no lo tiene: su retraso de replicación es el número de cambios pendientes.

Si lees de una réplica atrasada, ves datos viejos. Puede ser pocos milisegundos o mucho más si la red va mal.

Cuántos cambios le faltan a cada copia

Código: python
# El registro de cambios del primario y hasta dónde ha llegado cada copia.
registro = ["mochila=14", "mochila=13", "gorra=9", "mochila=12"]
aplicados = {"primario": 4, "replica_a": 4, "replica_b": 2}
for nombre in aplicados:
    faltan = len(registro) - aplicados[nombre]
    print(nombre, "ha aplicado", aplicados[nombre], "cambios y le faltan", faltan)
# Pon 3 en replica_b y vuelve a ejecutar.

Un error muy común

Advertencia

Mucha gente cree que una réplica siempre tiene los mismos datos que el primario. Solo los tendrá cuando haya aplicado todo el registro. Hasta entonces puede mostrar el stock de hace un momento. Cuenta siempre con un pequeño retraso.

Una réplica toma el sitio del primario

Cuando el primario se estropea, el sistema da su papel a una réplica. Es la conmutación por error.

Se elige la réplica que haya aplicado más cambios. Aun así, lo que el primario escribió y no llegó a copiar se pierde. Cuanto menor es el retraso, menos se pierde.

Elegir la réplica más al día

Código: python
# El primario cae tras el cambio 4. ¿Qué réplica toma su sitio?
aplicados = {"replica_a": 3, "replica_b": 2}
ultimo = 4
mejor = "replica_a"
if aplicados["replica_b"] > aplicados[mejor]:
    mejor = "replica_b"
perdidos = ultimo - aplicados[mejor]
print("Se elige", mejor, "y se pierden", perdidos, "cambios")
# Pon 4 en replica_b: ¿cuántos cambios se pierden ahora?

Ver si el nodo guarda un registro

Comando
v CONFIG GET appendonly

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Para ir más lejos: esperar a la réplica

Un primario puede responder «hecho» al instante, o esperar a que una réplica confirme que ha copiado el cambio.

Esperar pierde menos datos si el primario cae, pero cada escritura tarda más. Escribe en dos líneas cuál elegirías para el saldo de una cuenta y cuál para un contador de visitas.

Sobre este laboratorio y su código: Laboratorio de Valkey: aprende un almacén clave-valor compatible con Redis, con expiración y listas

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.