¿Cómo muevo una base de datos redis de un servidor a otro?

179

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 del 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.

ErJab
fuente
55
Años más tarde ... Después de lidiar con varias cosas relacionadas con redis, sugeriría seguir con el enfoque de Tom Clarkson de configurar una instancia de esclavo, dejar que se sincronice con el maestro y luego promover el esclavo para el maestro. Esto provocará un tiempo de inactividad mucho más corto en comparación con la respuesta que acepté, especialmente si se trata de varios GB de datos de redis. Si puede agregar un redis sentinel a esta mezcla, puede hacer una migración de tiempo de inactividad casi cero.
ErJab
Tengo un servidor Redis remoto y quiero copiar sus datos a mi servidor Redis que se ejecuta localmente ... usar dump.rdb podría ser complicado porque tendría que mover esos datos a través de la red ...
Alexander Mills

Respuestas:

110

Guarde una instantánea de la base de datos en un dump.rdb ejecutando BGSAVEo SAVEdesde la línea de comandos. Esto creará un archivo llamado dump.rdb en la misma carpeta que su servidor redis. Vea una lista de todos los comandos del servidor .

Copie este dump.rdb en el otro servidor redis al que desea migrar. Cuando se inicia redis, busca este archivo para inicializar la base de datos.

Anurag
fuente
16
Esto me deja adivinando un par de cosas: ¿dónde deja el comando SAVE? ¿Dónde busca Redis un archivo "dump.rdb" para cargar un inicio? Mi configuración de redis tiene dbfilename establecido en /var/db/redis/redis_state.rdb ... ¿es este el nombre de archivo que uso en lugar de "dump.rdb"?
Mojo
23
También tenga en cuenta que no puede hacer este intercambio mientras su servidor está en ejecución, ya que llamar a SHUTDOWN en el servidor en ejecución guardará el contenido de su memoria en su archivo de volcado, sobrescribiendo así la copia que acaba de colocar allí. Primero apague el servidor. Luego sobrescriba el archivo de volcado. Luego inicie el servidor nuevamente.
Houen
9
Si usa el registro AOF (en redis.conf, appendonly = yes), configúrelo noantes de iniciar el servidor Redis; de lo contrario, no cargará el nuevo conjunto de datos. Una vez que el conjunto de datos se carga en la memoria, vuelva a encenderlo, tanto en la memoria ( config set appendonly yes) como en el archivo de configuración.
Matthew Ratzloff
55
En Ubuntu, el archivo de configuración se almacena en Redis /etc/redis/redis.conf, y se puede buscar a través de ella para encontrar dónde están sus .rdbarchivos son: cat /etc/redis/redis.conf | grep "rdb". En mi caso es/var/lib/redis
Herman Schaaf
55
redis-cli config get dirle daría el directorio en el que .rdbestá almacenado.
Kishor Pawar
253

Primero, cree 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.rdbesté completamente actualizado y nos muestra dónde está almacenado ( /var/lib/redis/dump.rdben este caso). dump.rdbTambién se escribe periódicamente en el disco automáticamente.

Luego, cópielo en el 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 sean los mismos que antes), luego comience.

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 .

Wilfred Hughes
fuente
32
Mucho mejor que la respuesta aceptada, tiene todos los detalles.
btk
1
Esto me ahorró mucho tiempo al mostrar que la importación en redis se realiza al colocar el volcado en la carpeta de
redis
77
en una Mac, la copia de seguridad de redis se almacena en / usr / local / var / db / redis /
Donovan Thomson
3
@DonovanThomson Gracias. (Utilicé homebrew para instalar redis en mac) ... Una forma más genérica de encontrar su camino es usar el comando redis CONFIG GET dir, que regresó"/usr/local/var/db/redis"
Julian Soro
¿Y qué se hace con las escrituras que se enviaron a A durante este proceso?
Mike Graf
34

Si tiene la conectividad entre servidores, es mejor configurar la replicación (que es trivial, a diferencia de SQL) con la nueva instancia como nodo esclavo; entonces puede cambiar el nuevo nodo a maestro con un solo comando y hacer el movimiento con cero tiempo de inactividad.

Tom Clarkson
fuente
1
Tengo conectividad. Entonces puedo usar la configuración de esclavo en el nuevo servidor y configurarla en la dirección IP del servidor anterior. Pero, ¿cómo sé cuándo se completa la transferencia de datos entre el maestro y el esclavo? Y después de eso, ¿cómo promuevo al esclavo a dominar?
ErJab
Creo que el comando INFO te dirá cuando esté listo. Sin embargo, eso no importa demasiado, ya que es una replicación en lugar de una copia única, puede dejar ambos nodos en su lugar durante el tiempo que desee antes de apagar el nodo anterior. SLAVEOF NONE es el comando para promover el nuevo nodo a maestro.
Tom Clarkson
9
Parece una gran solución, ¡sería bueno con algunos ejemplos de comandos!
knutole
16

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 cualquier otra manera, y cuando haya terminado, simplemente active la replicación de:

SLAVEOF NO ONE
estani
fuente
¡Este es el enfoque más indoloro!
noooooooob
13

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 en 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 de puerto ssh:

 ssh [email protected] -L 1234:127.0.0.1:6379

Un pequeño script para recorrer todas las teclas usando KEYS y MIGRAR cada tecla. Este es Perl, pero espero que tengas la idea:

 foreach ( $redis_from->keys('*') ) {

    $redis_from->migrate(
        $destination{host},    # localhost in my example
        $destination{port},    # 1234
        $_,                    # The key
        $destination{db},
        $destination{timeout} 
    );
 }

Ver http://redis.io/commands/migrate para más información.

Øyvind Skaar
fuente
¿Cuál es el redis remoto al que desea migrar tiene CONTRASEÑA?
noooooooob
4

Para verificar dónde se debe colocar dump.rdb al importar datos redis,

cliente inicial

$redis-cli

y

luego

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.

Vinay Vemula
fuente
2

también puedes usar rdd

puede volcar y restaurar un servidor redis en ejecución y permitir filtrar / igualar / renombrar claves de volcado

r043v
fuente
2

Los elementos clave de una migración de tiempo de inactividad cero son:

En breve:

  1. configurar un destino redis (vacío) como esclavo de una fuente redis (con sus datos)
  2. esperar a que termine la replicación
  3. permiso escribe en un destino redis (que actualmente es esclavo)
  4. cambia tus aplicaciones a un redis objetivo
  5. espere a que termine el flujo de datos del maestro al esclavo
  6. convertir un objetivo redis de maestro a esclavo

Además, redis tiene opciones que permiten deshabilitar una fuente redis 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

x'ES
fuente
1

También quiero hacer lo mismo: migrar un db de una instancia de redis independiente a otras instancias de redis (redis sentinel).

Debido a que los datos no son críticos (datos de sesión), intentaré https://github.com/yaauie/redis-copy .

tangxinfa
fuente
1

La manera simple que encontré para exportar / hacer copias de seguridad de los datos de Redis (crear un archivo de volcado) es iniciar un servidor a través de la línea de comandos con el indicador slaveof y crear una réplica en vivo de la siguiente manera (suponiendo que la fuente 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 6379
Maoz Zadok
fuente
Tengo un redis ejecutándose en una máquina Linux a la que tengo acceso. Tengo un redis en mi máquina de Windows. ¿Es posible copiar datos para tal combinación?
Kamran Shahid
1
Creo que puedes si ambos están con la misma versión
Maoz Zadok
Sí, necesito verificar la versión también. Pero la versión de lanzamiento de Windows no está por encima de 3.0 como lo sé por última vez
Kamran Shahid
0

Acabo de publicar una utilidad de interfaz de línea de comando para npm y github que le permite copiar claves que coinciden con un patrón determinado (incluso *) de una base de datos Redis a otra.

Puedes encontrar la utilidad aquí:

https://www.npmjs.com/package/redis-utils-cli

Gabriel McAdams
fuente
-2

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.

JustAC0der
fuente