Database 如何将redis数据库从一台服务器移动到另一台服务器?
我目前有一个在云实例上运行的实时redis服务器,我想将此redis服务器迁移到一个新的云实例,并将该实例用作我的新redis服务器。如果是MySQL,我将从旧服务器导出DB并将其导入新服务器。我应该如何使用redisDatabase 如何将redis数据库从一台服务器移动到另一台服务器?,database,redis,data-migration,database-migration,Database,Redis,Data Migration,Database Migration,我目前有一个在云实例上运行的实时redis服务器,我想将此redis服务器迁移到一个新的云实例,并将该实例用作我的新redis服务器。如果是MySQL,我将从旧服务器导出DB并将其导入新服务器。我应该如何使用redis 注:我不想设置复制。我想将redis服务器完全迁移到新实例。通过运行或从命令行将数据库快照保存到dump.rdb中。这将在与redis服务器相同的文件夹中创建一个名为dump.rdb的文件。查看所有服务器的列表 将此dump.rdb复制到要迁移到的其他redis服务器。当redi
注:我不想设置复制。我想将redis服务器完全迁移到新实例。通过运行或从命令行将数据库快照保存到dump.rdb中。这将在与redis服务器相同的文件夹中创建一个名为dump.rdb的文件。查看所有服务器的列表
将此dump.rdb复制到要迁移到的其他redis服务器。当redis启动时,它会查找此文件以从中初始化数据库。如果服务器之间有连接,则最好设置复制(这与SQL不同,非常简单)将新实例作为从属节点—然后您可以使用单个命令将新节点切换到主节点,并在零停机时间内执行移动。您还可以使用
它可以转储和恢复正在运行的redis服务器,并允许筛选/匹配/重命名转储密钥现在,您还可以使用从2.6版开始提供的“迁移” 我不得不使用它,因为我只想移动一个数据库中的数据,而不是所有数据库中的数据。这两个Redis实例位于两台不同的机器上 如果无法从Redis-1直接连接到Redis-2,请使用ssh端口绑定:
ssh user@redis-2.foo.com -L 1234:127.0.0.1:6379
使用键循环所有键并迁移每个键的小脚本。这是Perl,但希望您能理解:
foreach ( $redis_from->keys('*') ) {
$redis_from->migrate(
$destination{host}, # localhost in my example
$destination{port}, # 1234
$_, # The key
$destination{db},
$destination{timeout}
);
}
有关更多信息,请参阅。首先,在服务器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
)<代码>转储。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,否则您可能会点击。也可以使用SLAVEOF命令迁移数据:
SLAVEOF old_instance_name old_instance_port
检查您是否已收到带有钥匙*
的钥匙。您也可以通过任何其他方式测试新实例,完成后只需打开以下复制:
SLAVEOF NO ONE
要在导入redis数据时检查dump.rdb必须放置的位置 启动客户端
$redis-cli
及
然后
这里/Users/Admin是从服务器读取的dump.rdb的位置,因此这是必须替换的文件 我还想做同样的事情:将数据库从一个独立的redis实例迁移到另一个redis实例(redis sentinel)
由于数据不是关键的(会话数据),我将尝试一下。我刚刚向npm和github发布了一个命令行界面实用程序,允许您将与给定模式(甚至*)匹配的键从一个Redis数据库复制到另一个数据库 您可以在此处找到该实用程序:
零停机迁移的关键要素是:
- 复制()
- 在应用程序切换期间写入从机的可能性(
)CONFIG SET slave read only no
min从机写入
min-slaves-max-lag
甚至他们用于迁移的交互式工具:最终也对我起了作用。其文档提供了一个如何转储Redis数据库并将数据插入另一个数据库的示例。我找到的导出/备份Redis数据(创建转储文件)的简单方法是通过带有slaveof标志的命令行启动服务器,并创建实时副本,如下所示(假设端口6379上的源Redis为1.2.3.4):
我确实有连通性。因此,我可以在新服务器中使用slaveof配置,并将其设置为旧服务器的IP地址。但我如何知道主设备和从设备之间的数据传输何时完成?在那之后,我如何将从机升级为主机?我想INFO命令会在准备好后告诉您。但是,这并不重要——因为这是复制而不是一次性复制,所以在关闭旧节点之前,您可以将两个节点保留在原地,保留多长时间就保留多长时间。SLAVEOF NONE是将新节点升级为主节点的命令。听起来是一个很好的解决方案-最好有一些命令示例!这让我猜测了两件事:SAVE命令将其转储放在哪里?Redis在哪里查找“dump.rdb”文件以加载启动?我的redis配置的dbfilename设置为/var/db/redis/redis_state.rdb。。。这是我用来代替“dump.rdb”的文件名吗?请注意,在服务器运行时不能进行此交换,因为在运行的服务器上调用SHUTDOWN会将其内存内容保存到转储文件中,从而覆盖刚才放置在那里的副本。首先关闭服务器。然后覆盖转储文件。然后再次启动服务器。如果使用AOF日志记录(在redis.conf中,
appendonly=yes
),请在启动redis服务器之前将其设置为no
,否则它将不会加载新的数据集。数据集加载到内存后,在内存(config set appendonly yes
)和配置文件中重新打开它。在Ubuntu上,Redis conf文件存储在redis 127.0.0.1:6379> CONFIG GET *
1) "dir"
2) "/Users/Admin"
/usr/bin/redis-server --port 6399 --dbfilename backup_of_master.rdb --slaveof 1.2.3.4 6379