我目前有一个在云实例上运行的实时Redis服务器,我想将此Redis服务器迁移到新的云实例并将该实例用作我的新Redis服务器。如果是MySQL,则可以从旧服务器导出数据库,然后将其导入新服务器。我应该如何使用redis?
PS:我不是要设置复制。我想将Redis服务器完全迁移到新实例。
我目前有一个在云实例上运行的实时Redis服务器,我想将此Redis服务器迁移到新的云实例并将该实例用作我的新Redis服务器。如果是MySQL,则可以从旧服务器导出数据库,然后将其导入新服务器。我应该如何使用redis?
PS:我不是要设置复制。我想将Redis服务器完全迁移到新实例。
Answers:
通过运行BGSAVE
或SAVE
从命令行将数据库快照保存到dump.rdb中。这将在与Redis服务器相同的文件夹中创建一个名为dump.rdb的文件。请参阅所有服务器命令的列表。
将此dump.rdb复制到要迁移到的其他Redis服务器。当redis启动时,它会寻找该文件来初始化数据库。
appendonly = yes
),请no
在启动Redis服务器之前将其设置为,否则它将不会加载新的数据集。数据集加载到内存后,请在内存(config set appendonly yes
)和配置文件中将其重新打开。
/etc/redis/redis.conf
,您可以搜索它来查找.rdb
文件的位置:cat /etc/redis/redis.conf | grep "rdb"
。在我的情况是/var/lib/redis
redis-cli config get dir
会给您.rdb
存储目录。
首先,在服务器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的版本,否则您可能会遇到兼容性问题。
CONFIG GET dir
,该命令返回"/usr/local/var/db/redis"
如果服务器之间具有连接性,则最好将新实例设置为从节点,以设置复制(这很简单,与SQL不同),然后可以使用单个命令将新节点切换为主节点,并使用零停机时间。
信不信由你,我为此写了一篇文章:
http://redis4you.com/articles.php?id=005&name=Seamless+migration+from+one+Redis+server+to+another
但是我怎么知道主机和从机之间何时完成数据传输?您可以使用INFO命令。
Warning: Redis::connect(): connect() failed: Connection refused in /www/sites/redis4you.com/include/config.php on line 16 Server error, try again later
也可以使用SLAVEOF命令迁移数据:
SLAVEOF old_instance_name old_instance_port
使用确认您已收到密钥KEYS *
。您也可以通过其他任何方式测试新实例,完成后,只需复制以下内容即可:
SLAVEOF NO ONE
如今,您还可以使用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。
要检查导入redis数据时必须将dump.rdb放在哪里,
开始客户
$redis-cli
和
然后
redis 127.0.0.1:6379> CONFIG GET *
1) "dir"
2) "/Users/Admin"
/ Users / Admin是从服务器读取的dump.rdb的位置,因此这是必须替换的文件。
零停机迁移的关键要素是:
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
甚至是他们用于迁移的交互式工具:https : //github.com/RedisLabs/redis-migrate
我也想做同样的事情:将数据库从独立的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数据库并将数据插入另一个数据库。