[英]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 上的版本,否则您可能会遇到兼容性问题。
如果您有服务器之间的连接,最好设置复制(这很简单,与 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 。
零停机迁移的关键要素是:
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 的位置,因此这是必须替换的文件。
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 数据库复制到另一个数据库。
您可以在此处找到该实用程序:
redis-dump终于为我工作了。 其文档提供了如何转储 Redis 数据库并将数据插入另一个数据库的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.