繁体   English   中英

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

[英]How do I move a redis database from one server to another?

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

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

首先,在服务器 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

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

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

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

停止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

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

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

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

如果您有服务器之间的连接,最好设置复制(这很简单,与 SQL 不同),将新实例作为从节点 - 然后您可以使用单个命令将新节点切换到主节点,然后使用零停机时间。

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

SLAVEOF old_instance_name old_instance_port

检查您是否收到了带有KEYS *的密钥。 您也可以通过任何其他方式测试新实例,完成后只需复制:

SLAVEOF NO ONE

由于建议 Redis 5.0 使用REPLICAOF因为SLAVEOF已被弃用 -请参阅手册

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

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

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

现在您还可以使用 MIGRATE,它从 2.6 开始可用。

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

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

 ssh user@redis-2.foo.com -L 1234:127.0.0.1:6379

一个使用 KEYS 循环所有键并迁移每个键的小脚本。 这是 Perl,但希望你能明白:

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

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

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

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

简而言之:

  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

要在导入redis数据时检查dump.rdb必须放在哪里,

启动客户端

$redis-cli

然后

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

这里 /Users/Admin 是从服务器读取的 dump.rdb 的位置,因此这是必须替换的文件。

source_host=xxx
source_port=6379
source_db=10
source_auth=xxx

target_host=yyyyy
target_port=6379
target_db=12
target_auth=yyyyy


redis-cli -a $source_auth -h $source_host -p $source_port -n $source_db keys \* | while read key; do
    echo "redis-cli -h $source_host -p $source_port -a $source_auth -n $source_db MIGRATE $target_host $target_port "" $target_db 5000 COPY AUTH $target_auth KEYS $key"
    redis-cli -h $source_host -p $source_port -a $source_auth -n $source_db MIGRATE $target_host $target_port "" $target_db 5000 COPY AUTH $target_auth KEYS $key 
done

我的情况很好,测试过。

你也可以使用rdd

它可以转储和恢复正在运行的 redis 服务器并允许过滤/匹配/重命名转储键

我也想做同样的事情:将一个数据库从一个独立的 redis 实例迁移到另一个 redis 实例(redis sentinel)。

因为数据不是关键(会话数据),我会尝试一下https://github.com/yaauie/redis-copy

我发现导出/备份 Redis 数据(创建转储文件)的简单方法是通过带有 slaveof 标志的命令行启动服务器,并按如下方式创建实时副本(假设源 Redis 在端口 6379 上为 1.2.3.4):

/usr/bin/redis-server --port 6399 --dbfilename backup_of_master.rdb --slaveof 1.2.3.4 6379

我刚刚向 npm 和 github 发布了一个命令行界面实用程序,它允许您将匹配给定模式(甚至 *)的键从一个 Redis 数据库复制到另一个数据库。

您可以在此处找到该实用程序:

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

redis-dump终于为我工作了。 其文档提供了如何转储 Redis 数据库并将数据插入另一个数据库的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM