One place for hosting & domains

      Migrar

      Cómo migrar datos de Redis con replicación en Ubuntu 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:

      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:

      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:

      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:

      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:

      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:

      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:

      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:

      Ejecute el comando auth para autenticar la conexión:

      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:

      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:

      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:

      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.



      Source link

      Como migrar dados do Redis com a replicação no Ubuntu 18.04


      Introdução

      O Redis é um armazenamento de dados de valor-chave carregado na memória conhecido pela sua flexibilidade, desempenho, suporte de idioma amplo e com recursos integrados, como a replicação. A replicação é a prática de copiar regularmente os dados de um banco de dados para outro, para se ter uma réplica que sempre permaneça como uma duplicata exata da instância primária. Um uso comum da replicação do Redis é o de migrar um armazenamento de dados existente do Redis para um novo servidor, como pode ser feito ao ampliar sua infraestrutura para se ter um melhor desempenho.

      Este tutorial descreve o processo de utilização das características de replicação integradas do Redis para migrar dados de um servidor Ubuntu 18.04 (a “origem”) para outro (o “destino”). Isso envolve a realização de algumas alterações de configuração em cada servidor, definindo o servidor de destino para funcionar como uma réplica da origem e, em seguida, promovendo a réplica de volta para um primário após a migração ser concluída.

      Pré-requisitos

      Para completar este tutorial, você precisará de:

      Este passo opcional envolve o carregamento da instância da origem do Redis com alguns dados de amostra para que você possa testar a migração de dados para sua instância de destino. Se já tiver os dados que deseja migrar para o seu destino, siga para o Passo 2, que abordará como fazer o backup dele.

      Para começar, conecte-se ao servidor Ubuntu que você usará como sua instância Redis de origem como seu usuário não raiz:

      • ssh sammy@source_server_ip

      Então, execute o seguinte comando para acessar seu servidor do Redis:

      Se configurou seu servidor Redis para exigir autenticação por senha, execute o comando auth seguido pela sua senha do Redis:

      • auth source_redis_password

      Em seguida, execute os seguintes comandos. Os comandos criarão uma série de chaves que reterão algumas strings, um hash, uma lista e um 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!"

      Além disso, execute os comandos expire seguintes para fornecer algumas dessas chaves com um tempo limite. Isso os tornará voláteis, o que significa que o Redis os excluirá após uma quantidade de tempo especificada (7500 segundos, neste caso):

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

      Com isso, você tem alguns dados de exemplo que pode exportar para sua instância de destino do Redis. Mantenha o prompt redis-cli aberto por enquanto, uma vez que executaremos mais alguns comandos a partir dele no próximo passo para fazer backup destes dados.

      Passo 2 — Fazendo o backup da sua instância Redis de origem

      Sempre que quiser mover os dados de um servidor para outro, há um risco de que algo dê errado e você perca dados como resultado deste erro. Embora esse risco seja pequeno, usaremos o comando bgsave do Redis para criar um backup do banco de dados Redis de origem, caso encontre um erro durante o processo da replicação.

      Se ainda não o tiver aberto, abra a interface de linha de comando do Redis:

      Além disso, caso tenha configurado seu servidor Redis para exigir autenticação por senha, execute o comando auth seguido pela sua senha do Redis:

      Em seguida, execute o comando bgsave. Isso criará um snapshot do seu conjunto de dados atual e o exportará para um arquivo de despejo mantido no diretório de trabalho do Redis:

      Nota: você pode tirar um snapshot do seu banco de dados do Redis com os comandos save ou bgsave. No entanto, a razão pela qual usamos o comando bgsave aqui, é que o comando save é executado de maneira sincronizada, o que significa que ele bloqueará qualquer outro cliente conectado ao banco de dados. Por esse motivo, a documentação do comando save recomenda que você quase nunca deve executá-lo em um ambiente de produção.

      Em vez disso, ela sugere que utilize o comando bgsave, que é executado de maneira assíncrona. Isso fará com que o Redis envie o banco de dados em dois processos: o processo pai continuará a atender clientes, enquanto o filho salva o banco de dados antes de sair:

      Note que se os clientes adicionam ou modificam dados enquanto a operação do bgsave estiver em execução, essas alterações não serão capturadas no snapshot.

      Em seguida, feche a conexão à instância do Redis, executando o comando exit:

      Caso precise do arquivo de despejo de dados no futuro, ele estará no diretório de trabalho da instância do Redis. Lembre-se de como definiu sua instância para usar o /var/lib/redis como seu diretório de trabalho no tutorial do pré-requisitos de instalação do Redis.

      Liste o conteúdo do seu diretório de trabalho do Redis para confirmar que ele está retendo o arquivo de despejo de dados:

      Se o arquivo de despejo foi exportado corretamente, você o verá no resultado deste comando. Por padrão, este arquivo é chamado de dump.rdb:

      Output

      dump.rdb

      Após confirmar que o backup de seus dados foi feito corretamente, você está pronto para configurar seu servidor Redis de origem para aceitar conexões externas e permitir a replicação.

      Passo 3 — Configurando sua instância Redis de origem

      Por padrão, o Redis não está configurado para escutar conexões externas, o que significa que quaisquer réplicas que você configurar não poderão sincronizar com sua instância de origem, a menos que você atualize configuração dela. Aqui, atualizaremos o arquivo de configuração da instância de origem para permitir conexões externas e também definir uma senha que a instância de destino usará para autenticar assim que a replicação começar. Depois disso, vamos adicionar uma regra de firewall para permitir as conexões na porta na qual o Redis está em execução.

      Abra o arquivo de configuração da instância Redis de origem com seu editor de texto preferido. Aqui, usaremos o nano:

      • sudo nano /etc/redis/redis.conf

      Navegue até a linha que começa com a diretriz bind. Ela se parecerá como isto por padrão:

      /etc/redis/redis.conf

      . . .
      bind 127.0.0.1
      . . .
      

      Essa diretriz associa o Redis ao 127.0.0.1, um endereço de loopback que representa o localhost. Isso significa que essa instância Redis está configurada para escutar apenas as conexões originadas a partir do mesmo servidor em que ela está instalada. Para permitir que sua instância de origem aceite qualquer conexão feita ao seu endereço IP público, como as conexões feitas a partir da instância de destino, adicione o endereço IP do seu servidor Redis de origem após o 127.0.0.1. Note que você não deve incluir nenhuma vírgula após o 127.0.0.1:

      /etc/redis/redis.conf

      . . .
      bind 127.0.0.1 source_server_IP
      . . .
      

      Em seguida, se ainda não tiver feito isso, utilize a diretriz requirepass para configurar uma senha que os usuários devem digitar antes de interagir com os dados da instância de origem. Faça isso removendo o comentário da diretriz e definindo-a para uma senha complexa:

      /etc/redis/redis.conf

      . . .
      requirepass source_redis_password
      . . .
      

      Certifique-se de anotar a senha que definiu aqui, já que precisará dela quando for configurar o servidor de destino.

      Em seguida, você pode salvar e fechar o arquivo de configuração do Redis. Se editou ele com o nano, salve e feche o arquivo pressionando as teclas CTRL+X, Y e depois ENTER.

      Então, reinicie o serviço Redis para colocar essas alterações em vigor:

      • sudo systemctl restart redis

      Isso é tudo o que precisa fazer em termos de configuração do Redis, mas se tiver configurado um firewall no seu servidor, ele continuará a bloquear quaisquer tentativas do seu servidor de destino para se conectar à origem. Supondo que tenha configurado seu firewall com o ufw, você pode atualizá-lo para permitir as conexões para a porta na qual o Redis é executado com o seguinte comando. Note que o Redis está configurado para usar a porta 6379 por padrão:

      Após fazer essa alteração final, você acabou de configurar seu servidor Redis de origem. Continue para configurar sua instância Redis de destino para funcionar como uma réplica da origem.

      Passo 4 — Configurando sua instância Redis de destino

      Neste ponto, você configurou sua instância Redis de origem para aceitar conexões externas. No entanto, como você trancou o acesso à origem removendo o comentário da diretriz requirepass, sua instância de destino não conseguirá replicar os dados mantidos na origem. Aqui, você configurará sua instância Redis de destino para conseguir autenticar sua conexão à origem, permitindo assim a replicação.

      Comece se conectando ao seu servidor Redis de destino como seu usuário não raiz:

      • ssh sammy@target_server_ip

      Em seguida, abra seu arquivo de configuração Redis do servidor de destino:

      • sudo nano /etc/redis/redis.conf

      Se ainda não tiver feito isso, configure uma senha para sua instância Redis de destino com a diretriz requirepass:

      /etc/redis/redis.conf

      . . .
      requirepass target_redis_password
      . . .
      

      Em seguida, remova o comentário da diretriz masterauth e a defina para a senha de autenticação da instância Redis de origem. Ao fazer isso, seu servidor de destino poderá autenticar-se para a instância de origem após habilitar a replicação:

      /etc/redis/redis.conf

      . . .
      masterauth source_redis_password
      . . .
      

      Por último, se tiver clientes gravando informações para sua instância de origem, configure-os para gravar os dados para sua instância de destino também. Desta maneira, se um cliente gravar quaisquer dados após você promover a instância de destino de volta a uma instância primária, esses dados não se perderão.

      Para fazer isso, porém, será necessário ajustar a diretriz replica-read-only. Ela é configurada como yes por padrão, o que significa que ela está configurada para se tornar uma réplica de “somente leitura” na qual os clientes não podem gravar. Defina esta diretriz para no para permitir que os clientes gravem nela:

      /etc/redis/redis.conf

      . . .
      replica-read-only no
      . . .
      

      Essas são todas as alterações que você precisa fazer no arquivo de configuração de destino, então salve e feche o arquivo.

      Então, reinicie o serviço Redis para colocar essas alterações em vigor:

      • sudo systemctl restart redis

      Após reiniciar o serviço Redis, seu servidor de destino estará pronto para se tornar uma réplica da origem. Tudo o que precisará fazer para transformá-lo em uma réplica é executar um único comando, que vamos fazer em seguida.

      Nota: se tiver algum cliente gravando dados para sua instância Redis de origem, agora seria um bom momento para configurá-los também a gravar os dados para seu destino.

      Passo 5 — Inicializando e verificando a replicação

      Neste ponto, você configurou sua instância Redis de origem para aceitar as conexões do seu servidor de destino e configurou sua instância Redis de destino para conseguir autenticar-se para a origem como uma réplica. Com essas peças em funcionamento, você está pronto para transformar sua instância de destino em uma réplica da origem.

      Comece abrindo a interface de linha de comando Redis no seu servidor Redis de destino:

      Execute o comando auth para autenticar a conexão:

      Em seguida, transforme a instância de destino em uma réplica da origem com o comando replicaof. Certifique-se de substituir o source_server_ip pelo endereço IP público da instância de origem e o source_port pela porta usada pelo Redis em sua instância de origem:

      • replicaof source_server_ip source_port

      A partir do prompt, execute o seguinte comando scan. Isso retornará todas as chaves que estão mantidas pela réplica:

      Se a replicação estiver funcionando como esperado, você verá todas as chaves de sua instância de origem mantidas na réplica. Se você tiver carregado sua origem com os dados da amostra no Passo 1, o resultado do comando scan se parecerá com este:

      Output

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

      Nota: tenha consciência de que este comando pode retornar as chaves em uma ordem diferente da mostrada neste exemplo.

      No entanto, se este comando não retornar as mesmas chaves mantidas em sua instância Redis de origem, pode ser que haja um erro em um dos arquivos de configuração dos seus servidores, impedindo que o banco de dados de destino se conecte ao banco de dados de origem. Neste caso, feche a conexão com sua instância Redis de destino e verifique se você editou corretamente os arquivos de configuração em seus servidores Redis de origem e de destino.

      Enquanto a conexão estiver aberta, você também poderá confirmar que as chaves definidas para expirar ainda são voláteis. Faça isso executando o comando ttl com uma dessas chaves como um argumento:

      Isso retornará o número de segundos antes da chave ser apagada:

      Output

      5430

      Assim que tiver confirmado que os dados da instância de origem foram sincronizados corretamente para seu destino, promova a instância de volta para uma instância primária, executando novamente o comando replicaof. Porém, dessa vez, em vez de enviar um replicaof seguido de um endereço IP e uma porta, envie-o seguido de no one. Isso fará a instância de destino parar de sincronizar com a origem imediatamente:

      Para confirmar que os dados replicados da origem persistiram no destino, execute novamente o comando scan digitado anteriormente:

      scan 0
      

      Você deve ver as mesmas chaves no resultado deste comando, uma vez que você executou o comando scan quando o destino ainda estava replicando a origem:

      Output

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

      Com isso, você migrou todos os dados da instância Redis de origem para seu destino. Se você tiver quaisquer clientes que ainda estão gravando dados para a instância de origem, agora seria um bom momento para configurá-los para gravar apenas para o destino.

      Conclusão

      Existem muitos métodos além da replicação que você pode usar para migrar dados de uma instância Redis para outra, mas a replicação tem as vantagens de exigir poucas alterações de configuração para funcionar e um único comando para iniciar ou parar.

      Se quiser aprender mais sobre como trabalhar com o Redis, recomendamos que confira nossa série tutorial sobre Como gerenciar um banco de dados Redis. Além disso, se quiser mover seus dados Redis para uma instância Redis gerenciada pela DigitalOcean, siga nosso guia sobre como fazer isso.



      Source link

      Como Migrar Dados do Redis para um Banco de Dados Gerenciado na DigitalOcean


      Introdução

      Existem vários métodos que você pode usar para migrar dados de uma instância Redis para outra, tais como a replicação ou o snapshotting. No entanto, as migrações podem ficar mais complicadas quando você está movendo dados para uma instância Redis gerenciada por um provedor de nuvem, uma vez que os bancos de dados gerenciados muitas vezes limitam o controle que você tem sobre a configuração dos mesmos.

      Este tutorial descreve um método que você pode usar para migrar dados para uma instância do Redis gerenciada pela DigitalOcean. O método usa o comando interno migrate do Redis para transmitir dados com segurança por um túnel TLS configurado com o stunnel. Este guia também abordará algumas outras estratégias de migração comumente usadas, e por que elas são problemáticas ao migrar para um Banco de dados gerenciado na DigitalOcean.

      Pré-requisitos

      Para concluir este tutorial, você precisará de:

      Nota: Para ajudar a manter as coisas claras, este guia fará referência à instância Redis hospedada no seu servidor Ubuntu como a “origem”. Da mesma forma, ele se referirá à instância gerenciada pela DigitalOcean como o “destino” ou o “Banco de Dados Gerenciado”.

      Coisas a Considerar ao Migrar Dados do Redis para um Banco de Dados Gerenciado

      Existem vários métodos que você pode empregar para migrar dados de uma instância Redis para outra. No entanto, algumas dessas abordagens apresentam problemas ao migrar dados para uma instância Redis gerenciada pela DigitalOcean.

      Por exemplo, você pode usar a replicação para transformar sua instância Redis de destino em uma cópia exata da origem. Para fazer isso, você se conectaria ao servidor Redis de destino e executaria o comando replicaof com a seguinte sintaxe:

      • replicaof ip_ou_hostname_da_origem porta_da_origem

      Isso fará com que a instância de destino replique todos os dados mantidos na origem sem destruir nenhum dado que estava armazenado anteriormente nela. Depois disso, você promoveria a réplica de volta a ser uma instância primária com o seguinte comando:

      No entanto, as instâncias Redis gerenciadas pela DigitalOcean são configuradas para se tornarem somente réplicas de leitura. Se você tiver clientes gravando dados no banco de dados de origem, você não poderá configurá-los para gravar na instância gerenciada, pois ela está replicando dados. Isso significa que você perderia todos os dados enviados pelos clientes após promover a instância gerenciada como uma réplica e antes de configurá-los para começar a gravar dados nela, tornando a replicação uma solução de migração ineficiente.

      Outro método para migrar dados do Redis é tirar um snapshot ou instantâneo dos dados mantidos em sua instância de origem com um dos comandos save ou bgsave do Redis. Ambos os comandos exportam o snapshot para um arquivo que termina em .rdb, que você então transfere para o servidor de destino. Depois disso, você reiniciaria o serviço Redis para que ele possa carregar os dados.

      No entanto, muitos provedores de bancos de dados gerenciados — incluindo a DigitalOcean — não permitem acessar o sistema de arquivos subjacente do servidor de banco de dados gerenciado. Isso significa que não há como fazer upload do arquivo de snapshot ou fazer as alterações necessárias no arquivo de configuração do banco de dados de destino para permitir que os Redis importe os dados.

      Como a configuração dos bancos de dados gerenciados da DigitalOcean limita a eficácia tanto da replicação e quanto do snapshotting como meio de migração de dados, este tutorial utilizará o comando migrate do Redis para mover dados da origem para o destino. O comando migrate é projetado para mover apenas uma chave de cada vez, mas vamos usar alguns truques de linha de comando para mover um banco de dados Redis inteiro com um único comando.

      Este passo opcional envolve o carregamento da instância Redis de origem com alguns dados de amostra para que você possa experimentar a migração de dados para o banco de dados Redis gerenciado. Se você já possui dados que deseja migrar para sua instância de destino, você pode avançar para o Passo 2.

      Para começar, execute o seguinte comando para acessar o seu servidor Redis:

      Se você configurou seu servidor Redis para exigir autenticação por senha, execute o comando auth seguido da sua senha Redis:

      Em seguida, execute os seguintes comandos. Isso criará um número de chaves contendo algumas strings, um hash, uma lista e um set:

      • 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!"

      Além disso, execute os seguintes comandos expire para fornecer um tempo limite para algumas dessas chaves. Isso as tornará voláteis, o que significa que o Redis as excluirá após o período especificado, 7500 segundos:

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

      Com isso, você tem alguns dados de exemplo que podem ser exportados para sua instância Redis de destino. Você pode manter o prompt do redis-cli aberto por enquanto, pois executaremos mais alguns comandos a partir dele no próximo passo para fazer backup desses dados.

      Passo 2 — Fazendo Backup dos Seus Dados

      Anteriormente, discutimos o uso do comando bgsave do Redis para tirar uma snapshot de um banco de dados Redis e migrá-lo para outra instância. Embora não utilizemos o bgsave como meio de migrar os dados do Redis, vamos usá-lo aqui para fazer backup dos dados, caso encontremos um erro durante o processo de migração.

      Se você ainda não o tiver aberto, comece abrindo a interface de linha de comandos do Redis:

      Além disso, se você configurou o seu servidor Redis para exigir autenticação por senha, execute o comando auth seguido da sua senha Redis:

      Em seguida, execute o comando bgsave. Isso criará um snapshot do seu data set atual e o exportará para um arquivo de dump cujo nome termina em .rdb:

      Nota: Conforme mencionado na seção anterior Coisas a Considerar, você pode tirar um snapshot do seu banco de dados Redis com os comandos save ou bgsave. A razão pela qual usamos o comando bgsave aqui é que o comando save é executado de forma síncrona, o que significa que ele bloqueará quaisquer outros clientes conectados ao banco de dados. Por isto, a documentação do comando save recomenda que esse comando quase nunca seja executado em um ambiente de produção.

      Em vez disso, ela sugere o uso do comando bgsave, que executa de forma assíncrona. Isso fará com que o Redis faça um fork do banco de dados em dois processos: o processo pai continuará a servir os clientes enquanto o filho salva o banco de dados antes de sair:

      Observe que se os clientes adicionarem ou modificarem dados enquanto a operação bgsave estiver em execução ou após a conclusão, essas alterações não serão capturadas no snapshot.

      Depois disso, você pode fechar a conexão com sua instância Redis executando o comando exit:

      Se você precisar no futuro, você poderá encontrar este arquivo de dump no seu diretório de trabalho da instalação do Redis. Se você não tiver certeza de qual diretório é esse, pode verificar abrindo seu arquivo de configuração Redis com o seu editor de texto preferido. Aqui, usaremos o nano:

      • sudo nano /etc/redis/redis.conf

      Navegue até a linha que começa com dbfilename. Por padrão, ele se apresentará assim:

      /etc/redis/redis.conf

      . . .
      # The filename where to dump the DB
      dbfilename dump.rdb
      . . .
      

      Esta diretiva define o arquivo para o qual o Redis exportará snapshots. A próxima linha (após qualquer comentário) ficará assim:

      /etc/redis/redis.conf

      . . .
      dir /var/lib/redis
      . . .
      

      A diretiva dir define o diretório de trabalho do Redis onde os snapshots são armazenados. Por padrão, isso é definido como /var/lib/redis, como mostrado neste exemplo.

      Feche o arquivo redis.conf. Supondo que você não tenha alterado o arquivo, você pode fazer isso pressionando CTRL+X.

      Em seguida, liste o conteúdo do seu diretório de trabalho Redis para confirmar que ele está mantendo o arquivo de dump de dados exportado:

      Se o arquivo de dump foi exportado corretamente, você o verá na saída deste comando:

      Output

      dump.rdb

      Depois de confirmar que você fez backup dos seus dados com êxito, você pode iniciar o processo de migração para o seu Banco de Dados Gerenciado.

      Passo 3 — Migrando os Dados

      Lembre-se de que este guia usa o comando interno migrate do Redis para mover as chaves uma a uma do banco de dados de origem para o destino. No entanto, ao contrário dos passos anteriores deste tutorial, não executaremos este comando no prompt redis-cli. Em vez disso, vamos executá-lo diretamente no prompt bash do servidor. Isso nos permitirá usar alguns truques do bash para migrar todas as chaves no banco de dados de origem com um comando.

      Nota: Se você tiver clientes gravando dados na sua instância Redis de origem, agora seria um bom momento para configurá-los para também gravar dados no seu Banco de Dados Gerenciado. Dessa forma, você pode migrar os dados existentes da origem para o seu destino sem perder nenhuma gravação que ocorra após a migração.

      Além disso, esteja ciente de que este comando de migração não substituirá nenhuma chave existente no banco de dados de destino, a menos que uma das chaves existentes tenha o mesmo nome da chave que você está migrando.

      A migração ocorrerá após a execução do seguinte comando. Antes de executá-lo, porém, vamos dividi-lo parte por parte:

      • redis-cli -n banco_de_dados_de_origem -a senha_da_origem scan 0 | while read key; do redis-cli -n banco_de_dados_de_origem -a senha_da_origem MIGRATE localhost 8000 "$key" banco_de_dados_de_destino 1000 COPY AUTH senha_do_redis_gerenciado; done

      Vamos analisar cada parte deste comando separadamente:

      • redis-cli -n banco_de_dados_de_origem -a senha_da_origem scan 0 . . .

      A primeira parte do comando, redis-cli, abre uma conexão com o servidor Redis local. A flag -n especifica a qual dos bancos de dados lógicos do Redis se conectar. O Redis possui 16 bancos de dados prontos para uso (com o primeiro sendo numerado como 0, o segundo numerado como 1 e assim por diante), portanto, banco_de_dados_de_origem pode ser qualquer número entre 0 e 15. Se sua instância de origem mantém apenas dados no banco de dados padrão (numerado como 0), você não precisará incluir a flag -n ou especificar um número de banco de dados.

      A seguir, vem a flag -a e a senha da instância de origem, que juntos autenticam a conexão. Se sua instância de origem não exigir autenticação por senha, você não precisará incluir a flag -a.

      Em seguida, ele executa o comando scan do Redis, que itera sobre as chaves mantidas no data set e as retorna como uma lista. O scan requer ser seguido de um cursor — a iteração começa quando o cursor está definido como 0, e termina quando o servidor retorna um cursor 0. Portanto, seguimos o scan com um cursor 0 para iterar sobre todas as chaves do conjunto.

      • . . . | while read key; do . . .

      A próxima parte do comando começa com uma barra vertical (|). Nos sistemas tipo Unix, as barras verticais são conhecidas como pipes e são usadas para direcionar a saída de um processo para a entrada de outro.

      A seguir, é iniciado o loop while. No bash, assim como na maioria das linguagens de programação, um loop while é uma declaração de fluxo de controle que permite repetir um determinado processo, código ou comando, enquanto uma certa condição permanecer verdadeira.

      A condição neste caso é o subcomando read key, que lê a entrada que foi canalizada e a atribui à variável key. O ponto-e-vírgula (;) significa o final da declaração condicional do loop while, e o do a seguir precede a ação que será repetida enquanto a expressão while permanecer verdadeira. Toda vez que a instrução do for concluída, a instrução condicional lerá a próxima linha canalizada a partir do comando scan e atribuirá essa entrada à variável key.

      Essencialmente, esta seção diz “enquanto houver saída do comando scan para ser lida, execute a seguinte ação”.

      • . . . redis-cli -n banco_de_dados_de_origem -a senha_da_origem migrate localhost 8000 "$key" . . .

      Esta seção do comando é a que executa a migração real. Após outra chamada do redis-cli, ela especifica mais uma vez o número do banco de dados de origem com a flag -n e autentica com a flag -a. Você precisa incluí-las novamente, porque essa chamada redis-cli é distinta daquela no início do comando. Mais uma vez, porém, você não precisa incluir a flag -n ou o número do banco de dados se a instância Redis de origem mantém apenas dados no banco de dados padrão 0, e você não precisa incluir a flag -a se ela não requer autenticação por senha.

      A seguir, está o comando migrate. Sempre que você usar o comando migrate, deverá segui-lo com o nome do host ou endereço IP do banco de dados de destino e o número da porta. Aqui, seguimos a convenção estabelecida no tutorial de pré-requisito do stunnel e apontamos o comando migrate para localhost na porta 8000.

      $key é a variável definida na primeira parte do loop while e representa as chaves de cada linha da saída do comando scan.

      • . . . banco_de_dados_de_destino 1000 copy auth senha_do_redis_gerenciado; done

      Esta seção é uma continuação do comando migrate. Ela começa com banco_de_dados_de_destino, que representa o banco de dados lógico na instância de destino em que você deseja armazenar os dados. Novamente, este pode ser qualquer número entre 0 e 15.

      Em seguida está um número que representa um tempo limite. Esse tempo limite é a quantidade máxima de tempo de comunicação inativa entre as duas máquinas. Observe que este não é um limite de tempo para a operação, apenas que a operação deve sempre fazer algum nível de progresso dentro do tempo limite definido. Tanto o número do banco de dados quanto os argumentos de tempo limite são necessários para cada comando migrate.

      Após o tempo limite está a flag opcional copy. Por padrão, o migrate excluirá cada chave do banco de dados de origem depois de transferi-la para o destino; Ao incluir esta opção, você está instruindo o comando migrate a meramente copiar as chaves para que elas persistam na origem.

      Após o copy, aparece a flag auth, seguido da senha do seu Banco de Dados Redis Gerenciado. Isso não é necessário se você estiver migrando dados para uma instância que não requer autenticação, mas é necessário quando você estiver migrando dados para um banco gerenciado pela DigitalOcean.

      A seguir, outro ponto-e-vírgula, indicando o final da ação a ser executada enquanto a condição while for verdadeira. Finalmente, o comando fecha com done, indicando o fim do loop. O comando verifica a condição na instrução while e repete a ação na instrução do até que ela não seja mais verdadeira.

      Em conjunto, este comando executa os seguintes passos:

      • Examina um banco de dados na instância Redis de origem e retorna todas as chaves nela contidas
      • Passa cada linha da saída do comando scan para um loop while
      • Lê a primeira linha e atribui seu conteúdo à variável key
      • Migra qualquer chave no banco de dados de origem que corresponda à variável key para um banco de dados na instância Redis na outra extremidade do túnel TLS mantida em localhost na porta 8000
      • Volta e lê a próxima linha, e repete o processo até que não haja mais chaves para ler

      Agora que examinamos cada parte do comando de migração, você pode prosseguir e executá-lo.

      Se sua instância de origem tiver apenas dados no banco de dados 0 padrão, você não precisa incluir quaisquer das flags -n ou seus argumentos. Se, no entanto, você estiver migrando dados de qualquer banco de dados que não seja o 0 na sua instância de origem, você deve incluir as flags -n e alterar as duas ocorrências de banco_de_dados_de_origem para alinhar com o banco de dados que você deseja migrar.

      Se o seu banco de dados de origem exigir autenticação por senha, certifique-se de alterar senha_da_origem para a senha real da instância do Redis. Caso contrário, certifique-se de remover ambas as ocorrências de -a senha_da_origem do comando. Além disso, altere senha_do_redis_gerenciado para a senha do seu Banco de Dados Gerenciado e certifique-se de alterar banco_de_dados_de_destino para o número do banco de dados lógico na sua instância de destino em que você deseja gravar os dados:

      Nota: Se você não tiver a senha do seu banco de dados Redis gerenciado em mãos, poderá encontrá-la navegando primeiramente para o Painel de controle da DigitalOcean. A partir daí, clique em Databases no menu da barra lateral esquerda e depois clique no nome da instância Redis para a qual você deseja migrar os dados. Role para baixo até a seção Connection Details, onde você encontrará um campo chamado password. Clique no botão show para revelar a senha e copie e cole-a no comando de migração — substituindo senha_do_redis_gerenciado – para autenticar.

      • redis-cli -n banco_de_dados_de_origem -a senha_da_origem scan 0 | while read key; do redis-cli -n banco_de_dados_de_origem -a senha_da_origem MIGRATE localhost 8000 "$key" banco_de_dados_de_destino 1000 COPY AUTH senha_do_redis_gerenciado; done

      Você verá uma saída semelhante à seguinte:

      Output

      NOKEY OK OK OK OK OK OK

      Nota: Observe a primeira linha da saída do comando que lê NOKEY. Para entender o que isso significa, execute a primeira parte do comando de migração sozinho:

      • redis-cli -n banco_de_dados_de_origem -a senha_da_origem scan 0

      Se você migrou os dados de amostra adicionados no Passo 2, a saída deste comando será parecida com esta:

      Output

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

      O valor "0" mantido na primeira linha não é uma chave mantida no seu banco de dados Redis de origem, mas um cursor retornado pelo comando scan. Como não há chaves no servidor denominadas “0”, não há nada lá para o comando migrate enviar à sua instância de destino e ele retorna NOKEY.

      No entanto, o comando não falha e sai. Em vez disso, ele continua lendo e migrando as chaves encontradas nas próximas linhas da saída do comando scan.

      Para testar se a migração foi bem-sucedida, conecte-se ao seu Banco de Dados Redis Gerenciado:

      • redis-cli -h localhost -p 8000 -a senha_do_redis_gerenciado

      Se você migrou dados para qualquer banco de dados lógico que não o padrão, conecte-se a esse banco de dados com o comando select:

      • select banco_de_dados_de_destino

      Execute um comando scan para ver quais chaves são mantidas lá:

      Se você concluiu o Passo 2 deste tutorial e adicionou os dados de exemplo ao seu banco de dados de origem, você verá resultados como este:

      Output

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

      Por fim, execute um comando ttl em qualquer chave que você configurou para expirar para confirmar que ela ainda é volátil:

      Output

      (integer) 3944

      Esta saída mostra que, embora você tenha migrado a chave para o seu Banco de Dados Gerenciado, ela ainda está configurada para expirar com base no comando expireat que você executou anteriormente.

      Depois de confirmar que todas as chaves do seu banco de dados Redis de origem foram exportadas para o destino com êxito, você pode fechar sua conexão com o Banco de Dados Gerenciado. Se você tiver clientes gravando dados na instância Redis de origem e já os configurou para enviar suas gravações para o destino, nesse momento você pode configurá-los para parar de enviar dados para a origem.

      Conclusão

      Ao concluir este tutorial, você transferiu os dados do seu repositório de dados Redis autogerenciado para uma instância Redis gerenciada pela DigitalOcean. O processo descrito neste guia pode não ser o ideal em todos os casos. Por exemplo, você teria que executar o comando de migração várias vezes (uma vez para cada banco de dados lógico que contém dados) se sua instância de origem estiver usando bancos de dados diferentes do padrão. No entanto, quando comparado a outros métodos, como replicação ou snapshotting, este é um processo bastante direto que funciona bem com a configuração de um Banco de Dados Gerenciado pela DigitalOcean.

      Agora que você está usando um Banco de Dados Redis Gerenciado pela DigitalOcean para armazenar seus dados, você pode medir seu desempenho executando alguns testes de benchmarking. Além disso, se você é novo no trabalho com o Redis, você pode conferir nossa série Como Gerenciar um Banco de Dados Redis.



      Source link