如何将Redis数据库从一台服务器移动到另一台服务器?
我目前有一个运行在云实例上的live redis服务器,我想将这个redis服务器迁移到一个新的云实例,并将该实例用作我的新redis服务器。 如果是MySQL,我会从旧服务器导出数据库并将其导入新服务器。 我应该如何使用redis来做到这一点?
PS:我不打算设置复制。 我想完全迁移redis服务器到一个新的实例。
通过从命令行运行BGSAVE
或SAVE
将数据库的一个spanshot保存到dump.rdb中。 这将在与redis服务器相同的文件夹中创build一个名为dump.rdb的文件。 查看所有服务器命令的列表。
将此dump.rdb复制到您要迁移到的其他redis服务器。 当redis启动时,它会查找这个文件来初始化数据库。
首先,在服务器A上创build一个转储
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,否则您可能遇到兼容性问题 。
如果你有服务器之间的连接,最好是build立与新的实例作为从属节点的复制(这是微不足道的,这是微不足道的) – 那么你可以用一个命令切换新的节点为主,零停机。
不pipe信不信,我只是为它写了一篇文章:
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和MIGRATE每个键循环所有键的小脚本。 这是Perl,但希望你有这个想法:
foreach ( $redis_from->keys('*') ) { $redis_from->migrate( $destination{host}, # localhost in my example $destination{port}, # 1234 $_, # The key $destination{db}, $destination{timeout} ); }
也可以使用SLAVEOF命令来迁移数据:
SLAVEOF old_instance_name old_instance_port
检查你是否收到钥匙KEYS *
。 你也可以用其他的方式来testing新的实例,当你完成之后,只需要复制:
SLAVEOF NO ONE
要在导入redis数据时检查dump.rdb的放置位置,
启动客户端
$redis-cli
和
然后
redis 127.0.0.1:6379> CONFIG GET * 1) "dir" 2) "/Users/Admin"
这里/ Users / Admin是从服务器读取的dump.rdb的位置,因此这是必须被replace的文件。
你也可以使用rdd
它可以转储和恢复正在运行的redis服务器,并允许筛选器/匹配/重命名转储键
我也想做同样的事情:将数据库从独立的redis实例迁移到另一个redis实例(redis sentinel)。
由于数据并不重要(会话数据),我会尝试https://github.com/yaauie/redis-copy 。
我刚刚向npm和github发布了一个命令行界面实用程序,允许您将匹配给定模式(甚至*)的密钥从一个Redis数据库复制到另一个。
你可以在这里find这个工具:
零停机迁移的关键要素是:
- 复制( http://redis.io/commands/SLAVEOF )
- 在应用程序切换期间写入从站的可能性(
CONFIG SET slave-read-only no
)
简而言之:
- 设置一个目标redis(空)作为一个源redis的奴隶(与您的数据)
- 等待复制完成
- 允许写入目标redis(目前是从属)
- 切换您的应用程序到一个目标redis
- 等待从主机到从机完成数据stream
- 把一个目标redis从主人转到奴隶
此外,redis有一些选项可以禁止源redis在分离目标后立即接受写入:
-
min-slaves-to-write
-
min-slaves-max-lag
这个主题覆盖
来自RedisLabs团队的非常好的解释https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration
甚至他们的互动工具迁移: https : //github.com/RedisLabs/redis-migrate
redis-dump终于为我工作了。 它的文档提供了一个示例如何转储Redis数据库并将数据插入到另一个数据库中。