Tutorial

Cómo migrar datos de Redis con replicación en Ubuntu 18.04

RedisUbuntu 18.04

Introducción

Redis es un sistema de almacenamiento de claves y valores en memoria conocido por su flexibilidad, rendimiento, soporte amplio en varios idiomas y funciones integradas como la replicación. La replicación es la práctica de copiar periódicamente datos de una base de datos a otra con el fin de contar con una réplica que sea siempre un duplicado exacto de la instancia principal. Un uso común de la replicación de Redis es la migración de un almacén de datos de Redis existente a un nuevo servidor, lo que se podría hacer al expandir la infraestructura para mejorar el rendimiento.

A través de este tutorial, se describe el proceso de uso de las funciones de replicación integradas de Redis para migrar los datos de un servidor de Ubuntu 18.04 (la “fuente”) a otro (el “destino”). Esto implica realizar algunos cambios de configuración en cada servidor, establecer el servidor de destino para que funcione como una replica de la fuente y luego promover la réplica de modo que vuelva a convertirse en la instancia principal una vez que la migración termine.

Requisitos previos

Para completar este tutorial, necesitará lo siguiente:

Paso 1: (Opcional) Cargar su instancia de Redis de fuente con datos de ejemplo

En este paso opcional, se incluye cargar su instancia de Redis de fuente con algunos datos de ejemplo para que pueda experimentar con la migración de datos a su instancia de destino. Si ya tiene datos que desea migrar a su destino, puede proceder con el paso 2 , en el que se explicará cómo hacer un respaldo.

Para comenzar, establezca conexión con el servidor de Ubuntu que usará como su instancia de Redis de fuente como su usuario no root:

  • ssh sammy@source_server_ip

Luego ejecute el siguiente comando para acceder a su servidor Redis:

  • redis-cli

Si configuró su servidor de Redis para solicitar la autenticación con contraseña, ejecute el comando auth seguido de su contraseña de Redis:

  • auth source_redis_password

A continuación, ejecute los siguientes comandos. Con esto se crearán varias claves que almacenarán algunas cadenas, un hash, una lista y un conjunto:

  • mset string1 "Redis" string2 "is" string3 "fun!"
  • hmset hash1 field1 "Redis" field2 "is" field3 "fast!"
  • rpush list1 "Redis" "is" "feature-rich!"
  • sadd set1 "Redis" "is" "free!"

Además, ejecute los siguientes comandos expire para que se proporcionen algunas de estas claves con un tiempo de espera. Esto los volverá volátiles, lo cual significa que en Redis se eliminarán después de un tiempo determinado (en este caso, 7500 segundos):

  • expire string2 7500
  • expire hash1 7500
  • expire set1 7500

Con eso, tendrá algunos datos de ejemplo que puede exportar a su instancia de destino de Redis. Mantenga la solicitud redis-cli abierta por ahora, ya que ejecutaremos algunos comandos más desde este en el siguiente paso para respaldar estos datos.

Paso 2: Respaldar su instancia de fuente Redis

Cada vez que planee mover datos de un servidor a otro, existirá el riesgo de que algo pueda salir mal y como resultado podría perder los datos. Aunque este riesgo es pequeño, usaremos el comando bgsave de Redis para crear una copia de respaldo de su base de datos de fuente de Redis en caso de que observe un error durante el proceso de replicación.

Comience abriendo la interfaz de línea de comandos de Redis si aún no está abierta:

  • redis-cli

También, si configuró su servidor Redis para que se solicite la autenticación con contraseña, ejecute el comando auth seguido de su contraseña de Redis:

  • auth password

A continuación, ejecute el comando bgsave. Con esto, se creará una instantánea de su conjunto de datos actuales y se exportará a un archivo de volcado almacenado en el directorio de trabajo de Redis:

  • bgsave

Nota: puede obtener una instantánea de su base de datos de Redis con los comandos save o bgsave. No obstante, la razón por la que aquí usamos el comando bgsave radica en que el comando save se ejecuta de forma sincrónica, lo cual significa que bloqueará a cualquier otro cliente conectado a la base de datos. Debido a esto, en la documentación de comandos save se indica que casi nunca se debe ejecutar en un entorno de producción.

En su lugar, se sugiere usar el comando bgsave que se ejecuta de forma asíncrona. Esto hará que en Redis se bifurque la base de datos en dos procesos: el proceso principal se seguirá proporcionando a los clientes mientras que el secundario guardará la base de datos antes de cerrarse:

Tenga en cuenta que si los clientes añaden o modifican datos mientras la operación bgsave está en ejecución, estos cambios no se capturarán en la instantánea.

Después de esto, puede cerrar la conexión con su instancia de Redis ejecutando el comando exit:

  • exit

Si se necesita en el futuro, puede encontrar el archivo de volcado de datos en el directorio de trabajo de su instancia de Redis. Recuerde que en el tutorial de instalación de Redis de los requisitos previos configuró su instancia de Redis para que use /var/lib/redis como directorio de trabajo.

Enumere los contenidos de su directorio de trabajo de Redis para confirmar que contiene el archivo de volcado de datos:

  • sudo ls /var/lib/redis

Si el archivo de volcado se exportó correctamente, lo verá en el resultado de este comando. Por defecto, este archivo se llama dump.rdb:

Output
dump.rdb

Después de confirmar que sus datos se hayan respaldado correctamente, estará listo para configurar su servidor de Redis de fuente para aceptar las conexiones externas y permitir la replicación.

Paso 3: Configurar su instancia Redis de fuente

Por defecto, Redis no está configurado para escuchar las conexiones externas, lo cual significa que cualquier réplica que configure no se podrá sincronizar con su instancia de fuente a menos que actualice su configuración. En este caso, actualizaremos el archivo de configuración de la instancia de fuente para permitir las conexiones externas y también estableceremos una contraseña que se usará en la instancia de destino para la autenticación una vez que se inicie la replicación. Después de esto, añadiremos una regla de firewall para permitir las conexiones al puerto en el que se ejecuta Redis.

Abra el archivo de configuración de su instancia de Redis de fuente con su editor de texto preferido. En este caso, utilizaremos nano:

  • sudo nano /etc/redis/redis.conf

Diríjase a la línea que comienza con la directiva bind. Por defecto se parecerá a lo siguiente:

/etc/redis/redis.conf
. . .
bind 127.0.0.1
. . .

Con esta directiva, se une Redis a 127.0.0.1, una dirección IPv4 de bucle invertido que representa localhost. Esto significa que esta instancia de Redis está configurada para escuchar solo las conexiones que se originan en el mismo servidor en el que se instala. Para permitir que su instancia de fuente acepte cualquier conexión establecida con su dirección IP pública, como las que se realizan desde su instancia de destino, añada la dirección IP de su servidor de fuente de Redis después de 127.0.0.1. Tenga en cuenta que no debe incluir ninguna coma después de 127.0.0.0.1:

/etc/redis/redis.conf
. . .
bind 127.0.0.1 source_server_IP
. . .

A continuación, si aún no lo ha hecho, utilice la directiva requirepass para configurar una contraseña que los usuarios deben ingresar para poder interactuar con los datos de la instancia de fuente. Hágalo eliminando los comentarios de la directiva y configurando una contraseña o frase de contraseña compleja:

/etc/redis/redis.conf
. . .
requirepass source_redis_password
. . .

Asegúrese de anotar la contraseña que estableció aquí, ya que la necesitará cuando configure el servidor destino.

Después de ese cambio, puede guardar y cerrar el archivo de configuración de Redis. Si lo editó con nano, podrá hacerlo presionando CTRL+X, Y y luego INTRO.

Luego, reinicie el servicio Redis para implementar estos cambios:

  • sudo systemctl restart redis

Eso es todo lo que necesita hacer para configurar Redis, pero si configuró un firewall en su servidor, seguirá bloqueando cualquier intento de establecer conexión con la fuente por parte de su servidor de destino. Suponiendo que configuró su firewall con ufw, podrá actualizarlo para permitir las conexiones con el puerto en el que se ejecuta Redis con el comando siguiente. Tenga en cuenta que Redis está configurado para usar el puerto 6379 por defecto:

  • sudo ufw allow 6379

Después de realizar ese último cambio, habrá completado la configuración de su servidor de Redis de fuente. Proceda con la configuración de su instancia de Redis de destino para que funcione como una réplica de la fuente.

Paso 4: Configurar su instancia de Redis de destino

En este punto, tendrá configurada su instancia de Redis de fuente para que acepte las conexiones externas. Sin embargo, debido a que bloqueó el acceso a la fuente eliminando los comentarios de la directiva requirepass, su instancia de destino no podrá replicar los datos almacenados en la fuente. En este caso, configurará su instancia de Redis de destino para poder autenticar su conexión con la fuente y permitir, así, la replicación.

Comience conectando su servidor de Redis de destino como usuario no root:

  • ssh sammy@target_server_ip

A continuación, abra el archivo de configuración de Redis de su servidor de destino:

  • sudo nano /etc/redis/redis.conf

Si aún no lo ha hecho, debería configurar una contraseña para su instancia de Redis de destino con la directiva requirepass:

/etc/redis/redis.conf
. . .
requirepass target_redis_password
. . .

A continuación, elimine el comentario de la directiva masterauth y configúrela con la contraseña de autenticación de su instancia de Redis de fuente. Realizando esto, su servidor de destino podrá autenticarse en la instancia de fuente una vez que usted habilite la replicación:

/etc/redis/redis.conf
. . .
masterauth source_redis_password
. . .

Por último, si hay clientes que escriben información en su instancia de fuente, querrá configurarlos para que también escriban datos en su instancia de destino. De esta manera, si un cliente escribe datos después de que usted vuelve a convertir la instancia de destino en una principal, estos no se perderán.

Sin embargo, para realizarlo deberá ajustar la directiva replica-read-only. Esto se fija en el valor yes por defecto, lo cual significa que está configurado para convertirse en una réplica de “solo lectura” en la que los clientes no podrán hacer tareas de escritura. Fije el valor de la directiva en no para permitir que los clientes hagan tareas de escritura en ella:

/etc/redis/redis.conf
. . .
replica-read-only no
. . .

Esos son todos los cambios que debe hacer en el archivo de configuración de la instancia de destino para poder guardarlo y cerrarlo.

Luego, reinicie el servicio de Redis para implementar estos cambios:

  • sudo systemctl restart redis

Una vez reiniciado el servicio de Redis, el servidor de destino estará listo para convertirse en una réplica de la instancia de fuente. Lo único que deberá hacer para que esto suceda es ejecutar un solo comando, procedimiento que pronto haremos.

Nota: Si tiene clientes que escriben datos en su instancia de Redis de fuente, este sería un buen momento para configurarlos para que también escriban datos en su destino.

Paso 5: Iniciar y verificar la replicación

En este punto, tendrá configuradas su instancia de Redis de fuente, para que acepte las conexiones de su servidor de destino, y su instancia de Redis de destino, para que pueda autenticarse en la fuente como una réplica. Una vez implementados estos elementos, estará listo para convertir su instancia de destino en una réplica de la fuente.

Comience abriendo la interfaz de línea de comandos de Redis en su servidor de Redis de destino:

  • redis-cli

Ejecute el comando auth para autenticar la conexión:

  • auth password

A continuación, convierta la instancia de destino en una réplica de la fuente con el comando replicaof. Asegúrese de sustituir source_server_ip por la dirección IP pública de su instancia de fuente y source_port por el puerto usado por Redis en su instancia de fuente:

  • replicaof source_server_ip source_port

Desde la solicitud, ejecute el siguiente comando scan. Con esto, se mostrarán todas las claves que actualmente se almacenan en la réplica:

  • scan 0

Si la replicación funciona como se espera, verá todas las claves de su instancia de fuente almacenadas en la réplica. Si cargó su fuente con los datos de ejemplo en el paso 1, el resultado del comando scan será el siguiente:

Output
1) "0" 2) 1) "string3" 2) "string1" 3) "set1" 4) "string2" 5) "hash1" 6) "list1"

Nota: Tenga en cuenta que con este comando se pueden mostrar las claves en un orden diferente del de este ejemplo.

Sin embargo, si con este comando no se muestran las mismas claves que se almacenan en su instancia de Redis de fuente, es posible que en uno de los archivos de configuración de sus servidores se haya producido un error que impida que la base de datos de destino establezca conexión con la fuente. En este caso, cierre la conexión con su instancia de Redis de destino y compruebe que haya editado correctamente los archivos de configuración en los servidores de Redis de fuente y destino.

Mientras la conexión esté abierta, también puede confirmar que las claves que configuró para caducar sigan siendo volátiles. Hágalo ejecutando el comando ttl con una de estas claves como un argumento:

  • ttl hash1

Con esto, se mostrará el número de segundos que transcurrirán antes de que se elimine esta clave:

Output
5430

Una vez que confirme que los datos de su instancia de fuente se hayan sincronizados correctamente con su destino, puede promover la instancia de destino de modo que vuelva a convertirse en una instancia principal ejecutando una vez más el comando replicaof. Sin embargo, esta vez en lugar de seguir replicaof con una dirección IP y un puerto, sígalo con no one. Esto hará que en la instancia de destino se detenga la sincronización con la fuente de inmediato:

  • replicaof no one

Para confirmar que los datos replicados desde la fuente persisten en el destino, vuelva a ejecutar el comando scan que ingresó previamente:

scan 0

En el resultado de este comando debería ver las mismas claves que vio al ejecutar el comando scan, cuando el destino seguía replicando la fuente:

Output
1) "0" 2) 1) "string3" 2) "string1" 3) "set1" 4) "string2" 5) "hash1" 6) "list1"

Con esto, habrá migrado correctamente todos los datos de su instancia de Redis de fuente a su destino. Si tiene clientes que aún estén escribiendo datos en la instancia de fuente, este sería un buen momento para configurarlos de modo que solo realicen tareas de escritura en el destino.

Conclusión

Además de replicación, existen varios métodos que puede usar para migrar datos de una instancia de Redis a otra. Sin embargo, la replicación tiene las ventajas de exigir pocos cambios de configuración para el funcionamiento y solo un comando para el inicio o la detención.

Si desea aprender más sobre cómo trabajar con Redis, le sugerimos consultar nuestra serie de tutoriales Cómo administrar una base de datos de Redis. Además, si desea mover sus datos de Redis a una instancia de Redis administrada por DigitalOcean, siga nuestra guía para hacerlo.

0 Comments

Creative Commons License