我目前有一个在云实例上运行的实时 redis 服务器,我想将此 redis 服务器迁移到新的云实例并将该实例用作我的新 redis 服务器。如果是 MySQL,我会从旧服务器导出数据库并将其导入新服务器。我应该如何用redis做到这一点?
PS:我不打算设置复制。我想将 redis 服务器完全迁移到一个新实例。
我目前有一个在云实例上运行的实时 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 的版本,否则可能会遇到兼容性问题。
如果您在服务器之间具有连接性,最好设置复制(这与 SQL 不同,这很简单),将新实例作为从节点 - 然后您可以使用单个命令将新节点切换为主节点并使用零停机时间。
也可以使用 SLAVEOF 命令迁移数据:
SLAVEOF old_instance_name old_instance_port
检查您是否收到带有 的密钥KEYS *
。您也可以通过任何其他方式测试新实例,完成后只需将复制:
SLAVEOF NO ONE
REPLICAOF
由于不推荐使用 Redis 5.0 SLAVEOF
-请参阅手册
现在你也可以使用 MIGRATE,它从 2.6 开始可用。
我不得不使用它,因为我只想将数据移动到一个数据库中,而不是全部。两个 Redis 实例位于两台不同的机器上。
如果无法从 Redis-1 直接连接到 Redis-2,请使用 ssh 端口绑定:
ssh user@redis-2.foo.com -L 1234:127.0.0.1:6379
一个小脚本,使用 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}
);
}
有关详细信息,请参阅http://redis.io/commands/migrate。
零停机迁移的关键要素是:
CONFIG SET slave-read-only no
)简而言之:
此外,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 的位置,因此这是必须替换的文件。
你也可以使用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 数据库复制到另一个。
您可以在此处找到该实用程序:
redis-dump终于为我工作了。它的文档提供了一个如何转储 Redis 数据库并将数据插入另一个数据库的示例。