Tutorial

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

RedisUbuntu 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:

Passo 1 — (Opcional) Carregando sua instância da origem Redis com dados de amostra

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:

  • redis-cli

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:

  • redis-cli

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:

  • auth password

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:

  • bgsave

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:

  • 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:

  • sudo ls /var/lib/redis

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:

  • sudo ufw allow 6379

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:

  • redis-cli

Execute o comando auth para autenticar a conexão:

  • auth password

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:

  • scan 0

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:

  • ttl hash1

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:

  • replicaof no one

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.

Creative Commons License