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.
Para completar este tutorial, necesitará lo siguiente:
ufw
. Para configurar este entorno en ambos servidores, siga nuestra Guía de configuración inicial de servidores para Ubuntu 18.04.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.
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
:
Outputdump.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.
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:
. . .
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
:
. . .
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:
. . .
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.
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
:
. . .
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:
. . .
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:
. . .
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.
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:
Output1) "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:
Output5430
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:
Output1) "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.
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.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!