database - ¿Cómo muevo una base de datos redis de un servidor a otro?
data-migration database-migration (13)
Actualmente tengo un servidor redis en vivo que se ejecuta en una instancia en la nube y quiero migrar este servidor redis a una nueva instancia en la nube y usar esa instancia como mi nuevo servidor redis. Si fuera MySQL, exportaría la base de datos desde el servidor anterior y la importaría al nuevo servidor. ¿Cómo debo hacer esto con Redis?
PD: No estoy buscando configurar la replicación. Quiero migrar completamente el servidor redis a una nueva instancia.
Acabo de publicar una utilidad de interfaz de línea de comandos para npm y github que le permite copiar claves que coinciden con un patrón dado (incluso *) de una base de datos Redis a otra.
Puede encontrar la utilidad aquí:
Hoy en día también puedes usar MIGRATE, disponible desde 2.6.
Tuve que usar esto ya que solo quería mover los datos en una base de datos y no todos. Las dos instancias de Redis viven en dos máquinas diferentes.
Si no puede conectarse directamente a Redis-2 desde Redis-1, use el enlace del puerto ssh:
ssh [email protected] -L 1234:127.0.0.1:6379
Un pequeño script para recorrer todas las teclas usando KEY y MIGRATE cada clave. Este es Perl, pero espero que entiendas la idea:
foreach ( $redis_from->keys(''*'') ) {
$redis_from->migrate(
$destination{host}, # localhost in my example
$destination{port}, # 1234
$_, # The key
$destination{db},
$destination{timeout}
);
}
Vea http://redis.io/commands/migrate para más información.
La manera simple que encontré para exportar / Copia de seguridad de datos Redis (crear archivo volcado) es iniciar un servidor a través de la línea de comando con el indicador slaveof y crear una réplica activa de la siguiente manera (suponiendo que el origen Redis es 1.2.3.4 en el puerto 6379):
/usr/bin/redis-server --port 6399 --dbfilename backup_of_master.rdb --slaveof 1.2.3.4 6397
Los elementos clave de una migración de tiempo de inactividad cero son:
- replicación ( http://redis.io/commands/SLAVEOF )
- posibilidad de escribir en un esclavo durante la conmutación de la aplicación (
CONFIG SET slave-read-only no
)
En breve:
- configurar un objetivo redis (vacío) como esclavo de una fuente redis (con sus datos)
- esperar el final de replicación
- permiso escribe a un objetivo redis (que actualmente es esclavo)
- cambia tus aplicaciones a un redis objetivo
- espere a que termine el flujo de datos del maestro al esclavo
- convertir un objetivo redis de maestro a esclavo
Además redis tiene opciones que permiten deshabilitar un redis de origen para aceptar escrituras justo después de separar un objetivo:
-
min-slaves-to-write
-
min-slaves-max-lag
Este tema cubierto por
Muy buena explicación del equipo de RedisLabs https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration
E incluso su herramienta interactiva para migrar: https://github.com/RedisLabs/redis-migrate
Para verificar dónde se debe colocar dump.rdb al importar datos redis,
iniciar cliente
$redis-cli
y
entonces
redis 127.0.0.1:6379> CONFIG GET *
1) "dir"
2) "/Users/Admin"
Aquí / Users / Admin es la ubicación de dump.rdb que se lee del servidor y, por lo tanto, este es el archivo que debe reemplazarse.
Primero, crea un volcado en el servidor A.
A$ redis-cli
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/var/lib/redis/"
127.0.0.1:6379> SAVE
OK
Esto garantiza que dump.rdb
está completamente actualizado y nos muestra dónde está almacenado ( /var/lib/redis/dump.rdb
en este caso). dump.rdb
también se escribe periódicamente en el disco automáticamente.
Luego, cópielo al servidor B:
A$ scp /var/lib/redis/dump.rdb myuser@B:/tmp/dump.rdb
Detenga el servidor Redis en B, copie dump.rdb (asegurándose de que los permisos son los mismos que antes), luego inicie.
B$ sudo service redis-server stop
B$ sudo cp /tmp/dump.rdb /var/lib/redis/dump.rdb
B$ sudo chown redis: /var/lib/redis/dump.rdb
B$ sudo service redis-server start
La versión de Redis en B debe ser mayor o igual que la de A, o puede tener problemas de compatibilidad .
Si tiene la conectividad entre servidores, es mejor configurar la replicación (que es trivial, a diferencia de SQL) con la nueva instancia como un nodo esclavo - entonces puede cambiar el nuevo nodo a maestro con un solo comando y hacer el movimiento con cero tiempo de inactividad.
También es posible migrar datos usando el comando SLAVEOF:
SLAVEOF old_instance_name old_instance_port
Verifique que haya recibido las llaves con KEYS *
. También puede probar la nueva instancia de otra forma, y cuando termine simplemente active la replicación de:
SLAVEOF NO ONE
También quiero hacer lo mismo: migrar un db de una instancia de redis independiente a otra instancia de redis (redis sentinel).
Debido a que los datos no son críticos (datos de sesión), intentaré https://github.com/yaauie/redis-copy .
creer o no, acabo de hacer un artículo para ello:
http://redis4you.com/articles.php?id=005&name=Seamless+migration+from+one+Redis+server+to+another
¿Pero cómo sé cuándo se completa la transferencia de datos entre el maestro y el esclavo? Puede usar el comando INFO.
también puedes usar rdd
puede volcar y restaurar un servidor redis en ejecución y permitir las claves de filtro / coincidencia / renombrar volcados
redis-dump finalmente funcionó para mí. Su documentación proporciona un ejemplo de cómo volcar una base de datos Redis e insertar los datos en otra.
Guarde un spanshot de la base de datos en un dump.rdb ejecutando BGSAVE
o SAVE
desde la línea de comando. Esto creará un archivo llamado dump.rdb en la misma carpeta que su servidor redis. Vea una lista de todos los commands servidor.
Copie este dump.rdb al otro servidor redis al que desea migrar. Cuando redis se inicia, busca este archivo para inicializar la base de datos.