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
| Palabra | Qué significa |
|---|---|
| Réplica | una copia de los datos en otro nodo |
| Primario | el nodo que recibe las escrituras |
| Registro de cambios | la lista ordenada de escrituras que las copias repiten |
| Retraso de replicación | los cambios que una réplica aún no ha aplicado |
| Conmutación por error | dar 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úmero | Cambio | Primario | Réplica A | Réplica B |
|---|---|---|---|---|
| 1 | mochila = 14 | aplicado | aplicado | aplicado |
| 2 | mochila = 13 | aplicado | aplicado | aplicado |
| 3 | gorra = 9 | aplicado | aplicado | pendiente |
| 4 | mochila = 12 | aplicado | pendiente | pendiente |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Fabricar un cliente pequeño llamado v
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
v SET stock:mochila 14Se 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
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
# 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
# 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
v CONFIG GET appendonlySe 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.