如何将redis数据库从一台服务器移动到另一台服务器?

ErJ*_*Jab 174 database data-migration database-migration redis

我目前有一个在云实例上运行的实时redis服务器,我想将这个redis服务器迁移到新的云实例,并将该实例用作我的新redis服务器.如果是MySQL,我会从旧服务器导出数据库并将其导入新服务器.我应该如何用redis做到这一点?

PS:我不打算设置复制.我想将redis服务器完全迁移到新实例.

Wil*_*hes 233

首先,在服务器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
Run Code Online (Sandbox Code Playgroud)

这确保了它dump.rdb是完全最新的,并向我们显示它的存储位置(/var/lib/redis/dump.rdb在本例中).dump.rdb也会定期自动写入磁盘.

接下来,将其复制到服务器B:

A$ scp /var/lib/redis/dump.rdb myuser@B:/tmp/dump.rdb
Run Code Online (Sandbox Code Playgroud)

停止B上的Redis服务器,复制dump.rdb(确保权限与以前相同),然后启动.

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
Run Code Online (Sandbox Code Playgroud)

B上的Redis版本必须大于或等于A的版本,否则可能会遇到兼容性问题.

  • 比接受的答案更好的方式,有所有的细节. (31认同)
  • 在mac上,redis备份存储在/ usr/local/var/db/redis / (5认同)
  • @DonovanThomson谢谢.(我用自制软件在mac上安装redis)...找到你的路径的一种更通用的方法是使用redis命令`CONFIG GET dir`,它返回`"/ usr/local/var/db/redis"` (3认同)

Anu*_*rag 106

通过运行BGSAVESAVE从命令行将数据库的快照保存到dump.rdb中.这将在与redis服务器相同的文件夹中创建名为dump.rdb的文件.查看所有服务器命令的列表.

将此dump.rdb复制到要迁移到的其他redis服务器.当redis启动时,它会查找此文件以初始化数据库.

  • 还要注意,在服务器运行时不能进行此交换,因为在正在运行的服务器上调用SHUTDOWN会将其内存内容保存到其转储文件中,从而覆盖刚刚放置在那里的副本.首先关闭服务器.然后覆盖转储文件.然后再次启动服务器. (22认同)
  • 这让我猜测了几件事:SAVE命令放在哪里?Redis在哪里查找"dump.rdb"文件来加载启动?我的redis配置将dbfilename设置为/var/db/redis/redis_state.rdb ...这是我使用的文件名代替"dump.rdb"吗? (15认同)
  • 如果您使用AOF日志记录(在redis.conf中,`appendonly = yes`),请在启动Redis服务器之前将其设置为"no" - 否则它将不会加载新数据集.将数据集加载到内存后,将其重新打开,在内存中(`config set appendonly yes`)和配置文件中. (9认同)
  • 在Ubuntu上,Redis conf文件存储在`/ etc/redis/redis.conf`中,您可以搜索它以查找`.rdb`文件的位置:`cat /etc/redis/redis.conf | grep"rdb"`.在我的情况下,它是`/ var/lib/redis` (5认同)
  • `redis-cli config get dir`会给你存储`.rdb`的目录. (5认同)

Tom*_*son 33

如果你有服务器之间的连接,最好设置复制(这与微软不同,与SQL不同),新实例作为从属节点 - 然后你可以用一个命令将新节点切换到主节点并执行移动零停机时间.

  • 听起来像一个很好的解决方案 - 对于一些命令示例会很好! (6认同)

小智 17

不管你相信与否,我只是为它做了一篇文章:

http://redis4you.com/articles.php?id=005&name=Seamless+migration+from+one+Redis+server+to+another

但是,如何知道主站和从站之间的数据传输何时完成?您可以使用INFO命令.


est*_*ani 14

也可以使用SLAVEOF命令迁移数据:

SLAVEOF old_instance_name old_instance_port
Run Code Online (Sandbox Code Playgroud)

检查您是否收到了钥匙KEYS *.您也可以通过任何其他方式测试新实例,并在完成后转动复制:

SLAVEOF NO ONE
Run Code Online (Sandbox Code Playgroud)

  • 从 Redis 5.0 开始,SLAVEOF 命令被 REPLICAOF 取代 (3认同)

Øyv*_*aar 13

现在你也可以使用MIGRATE,从2.6开始提供.

我不得不使用它,因为我只想将数据移动到一个数据库而不是所有数据库中.两个Redis实例位于两台不同的机器上.

如果无法从Redis-1直接连接到Redis-2,请使用ssh端口绑定:

 ssh user@redis-2.foo.com -L 1234:127.0.0.1:6379
Run Code Online (Sandbox Code Playgroud)

一个小脚本,使用KEYS和MIGRATE每个键循环所有键.这是Perl,但希望你明白这个想法:

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

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

有关详细信息,请参阅http://redis.io/commands/migrate.


x'E*_*'ES 5

零停机迁移的关键要素是:

简而言之:

  1. 将目标 redis(空)设置为源 redis(使用您的数据)的从属
  2. 等待复制完成
  3. 允许写入目标 redis(当前是从属的)
  4. 将您的应用程序切换到目标 redis
  5. 等待完成从主到从的数据流
  6. 将目标 redis 从 master 变为 slave

此外,redis 还具有允许在分离目标后立即禁用源 redis 以接受写入的选项:

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

本主题涵盖

RedisLabs 团队非常好的解释https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration(使用 web.archive.org)

甚至他们用于迁移的交互式工具:https : //github.com/RedisLabs/redis-migrate