Como mover um banco de dados redis de um servidor para outro?

179

Atualmente, tenho um servidor redis ativo em execução em uma instância de nuvem e quero migrar esse servidor redis para uma nova instância de nuvem e usá-la como meu novo servidor redis. Se fosse o MySQL, eu exportaria o banco de dados do servidor antigo e importaria para o novo servidor. Como devo fazer isso com redis?

PS: Não estou pensando em configurar a replicação. Quero migrar completamente o servidor redis para uma nova instância.

ErJab
fonte
5
Anos mais tarde ... Depois de lidar com várias coisas relacionadas a redis, sugiro seguir a abordagem de Tom Clarkson de configurar uma instância escrava, deixando sincronizar com o mestre e promovendo o escravo a dominar. Isso causará um tempo de inatividade muito menor em comparação com a resposta que eu aceitei, especialmente se você estiver lidando com vários GBs de dados redis. Se você pode inserir um redis sentinel nesse mix, poderá fazer uma migração de tempo de inatividade quase zero.
ErJab
Eu tenho um servidor remoto e Redis deseja copiar seus dados para o meu servidor Redis executado localmente ... usando dump.rdb pode ser complicado, porque eu teria que mover esses dados através da rede ..
Alexander Mills

Respostas:

110

Salve uma captura instantânea do banco de dados em um dump.rdb executando BGSAVEou SAVEna linha de comando. Isso criará um arquivo chamado dump.rdb na mesma pasta do seu servidor redis. Veja uma lista de todos os comandos do servidor .

Copie este dump.rdb para o outro servidor redis para o qual você deseja migrar. Quando o redis inicia, ele procura esse arquivo para inicializar o banco de dados.

Anurag
fonte
16
Isso me deixa pensando em algumas coisas: onde o comando SALVAR coloca seu despejo? Onde o Redis procura um arquivo "dump.rdb" para carregar uma inicialização? Minha configuração redis tem dbfilename definido como /var/db/redis/redis_state.rdb ... esse é o nome do arquivo que eu uso no lugar de "dump.rdb"?
23612 Mojo as
23
Lembre-se também de que não é possível fazer essa troca enquanto o servidor estiver em execução, pois chamar SHUTDOWN no ​​servidor em execução salvará o conteúdo da memória no arquivo de despejo, substituindo a cópia que você acabou de colocar nele. Primeiro desligue o servidor. Em seguida, substitua o arquivo de despejo. Em seguida, inicie o servidor novamente.
Houen
9
Se você usar o registro AOF (no redis.conf, appendonly = yes), defina-o como noantes de iniciar o servidor Redis - caso contrário, ele não carregará o novo conjunto de dados. Depois que o conjunto de dados for carregado na memória, ligue-o novamente na memória ( config set appendonly yes) e no arquivo de configuração.
Matthew Ratzloff
5
No Ubuntu, o arquivo conf Redis é armazenado em /etc/redis/redis.conf, e você pode procurar por ele para descobrir onde seus .rdbarquivos são: cat /etc/redis/redis.conf | grep "rdb". No meu caso, é/var/lib/redis
Herman Schaaf
5
redis-cli config get dirdaria a você o diretório em que .rdbestá armazenado.
Kishor Pawar 04/04
253

Primeiro, crie um despejo no servidor A.

A$ redis-cli
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/var/lib/redis/"
127.0.0.1:6379> SAVE
OK

Isso garante que dump.rdbestá completamente atualizado e nos mostra onde está armazenado ( /var/lib/redis/dump.rdbneste caso). dump.rdbtambém é gravado periodicamente no disco automaticamente.

Em seguida, copie-o para o servidor B:

A$ scp /var/lib/redis/dump.rdb myuser@B:/tmp/dump.rdb

Pare o servidor Redis em B, copie dump.rdb (garantindo que as permissões sejam as mesmas de antes) e inicie.

B$ sudo service redis-server stop
B$ sudo cp /tmp/dump.rdb /var/lib/redis/dump.rdb
B$ sudo chown redis: /var/lib/redis/dump.rdb
B$ sudo service redis-server start

A versão do Redis em B deve ser maior ou igual à de A, ou você pode encontrar problemas de compatibilidade .

Wilfred Hughes
fonte
32
Muito melhor do que a resposta aceita, tem todos os detalhes.
btk
1
Isso me salvou um monte de tempo, mostrando que importar para o Redis é feito soltando o despejo nos redis pasta
RonnyKnoxville
7
em um mac o backup Redis é armazenado em / usr / local / var / db / Redis /
Donovan Thomson
3
@DonovanThomson Thanks. (Eu usei homebrew para instalar Redis no Mac) ... A forma mais genérica para encontrar o seu caminho é usar o Redis comando CONFIG GET dir, que retornou"/usr/local/var/db/redis"
Julian Soro
E o que se faz com as gravações enviadas para A durante esse processo?
Mike Graf
34

Se você tiver a conectividade entre servidores, é melhor configurar a replicação (que é trivial, ao contrário do SQL) com a nova instância como um nó escravo - então você pode mudar o novo nó para dominar com um único comando e fazer o movimento com zero tempo de inatividade.

Tom Clarkson
fonte
1
Eu tenho conectividade. Para que eu possa usar a configuração slaveof no novo servidor e defini-la como o endereço IP do servidor antigo. Mas como sei quando a transferência de dados está completa entre o mestre e o escravo? E depois disso, como promovo o escravo a dominar?
#
Acho que o comando INFO informará quando estiver pronto. No entanto, isso não importa muito - já que é replicação e não uma cópia única, você pode deixar os dois nós no lugar o tempo que quiser antes de desligar o nó antigo. SLAVEOF NONE é o comando para promover o novo nó a ser dominado.
Tom Clarkson
9
Parece uma ótima solução - seria bom com alguns exemplos de comando!
knutole
16

Também é possível migrar dados usando o comando SLAVEOF:

SLAVEOF old_instance_name old_instance_port

Verifique se você recebeu as chaves com KEYS *. Você também pode testar a nova instância de qualquer outra maneira e, quando terminar, ative a replicação de:

SLAVEOF NO ONE
estani
fonte
Esta é a abordagem mais indolor!
noooooooob
13

Atualmente você também pode usar o MIGRATE, disponível desde o 2.6.

Eu tive que usar isso, pois só queria mover os dados em um banco de dados e não em todos eles. As duas instâncias do Redis vivem em duas máquinas diferentes.

Se você não conseguir se conectar diretamente ao Redis-2 a partir do Redis-1, use a ligação de porta ssh:

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

Um pequeno script para repetir todas as chaves usando KEYS e MIGRATE cada chave. Este é o Perl, mas espero que você entenda a ideia:

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

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

Veja http://redis.io/commands/migrate para mais informações.

Øyvind Skaar
fonte
qual é o redis remoto para o qual você deseja migrar possui PASSWORD?
noooooooob
4

Para verificar onde o dump.rdb deve ser colocado ao importar dados redis,

iniciar cliente

$redis-cli

e

então

redis 127.0.0.1:6379> CONFIG GET *
 1) "dir"
 2) "/Users/Admin"

Aqui / Users / Admin é o local do dump.rdb que é lido no servidor e, portanto, esse é o arquivo que deve ser substituído.

Vinay Vemula
fonte
2

você também pode usar rdd

ele pode despejar e restaurar um servidor redis em execução e permitir filtrar / corresponder / renomear chaves de despejos

r043v
fonte
2

Os principais elementos de uma migração de tempo de inatividade zero são:

  • replicação ( http://redis.io/commands/SLAVEOF )
  • possibilidade de gravar em um escravo durante a alternância de aplicativos ( CONFIG SET slave-read-only no)

Em resumo:

  1. configurar um redis de destino (vazio) como escravo de um redis de origem (com seus dados)
  2. aguarde o término da replicação
  3. permite gravar em um redis de destino (que atualmente é escravo)
  4. alterne seus aplicativos para um destino redis
  5. aguarde o término do fluxo de dados do mestre para o escravo
  6. transformar um alvo redis de mestre para escravo

Além disso, os redis possuem opções que permitem desativar um redis de origem para aceitar gravações logo após desanexar um destino:

  • min-slaves-to-write
  • min-slaves-max-lag

Este tópico coberto por

Muito boa explicação da equipe RedisLabs https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration

E até a ferramenta interativa para migração: https://github.com/RedisLabs/redis-migrate

x'ES
fonte
1

Também quero fazer o mesmo: migrar um banco de dados de uma instância redis independente para uma outra instância redis (redis sentinel).

Como os dados não são críticos (dados da sessão), tentarei https://github.com/yaauie/redis-copy .

tangxinfa
fonte
1

A maneira simples que encontrei para exportar / fazer backup de dados Redis (criar arquivo de despejo) é iniciar um servidor via linha de comando com o sinalizador slaveof e criar réplica ao vivo da seguinte forma (assumindo que o Redis de origem seja 1.2.3.4 na porta 6379):

/usr/bin/redis-server --port 6399 --dbfilename backup_of_master.rdb --slaveof 1.2.3.4 6379
Maoz Zadok
fonte
Eu tenho um redis rodando na máquina Linux que eu tenho acesso. Eu tenho um redis na minha máquina Windows. é possível copiar dados para essa combinação?
Kamran Shahid
1
Eu acredito que você pode se ambos estiverem com a mesma versão
Maoz Zadok
Sim, eu preciso verificar a versão também. Mas a versão de lançamento do Windows não é acima de 3,0 a última eu sei
Kamran Shahid
0

Acabei de publicar um utilitário de interface de linha de comando no npm e no github que permite copiar chaves que correspondem a um determinado padrão (par *) de um banco de dados Redis para outro.

Você pode encontrar o utilitário aqui:

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

Gabriel McAdams
fonte
-2

redis-dump finalmente funcionou para mim. Sua documentação fornece um exemplo de como despejar um banco de dados Redis e inserir os dados em outro.

JustAC0der
fonte