Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何将redis数据库从一台服务器移动到另一台服务器?_Database_Redis_Data Migration_Database Migration - Fatal编程技术网

Database 如何将redis数据库从一台服务器移动到另一台服务器?

Database 如何将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服务器,我想将此redis服务器迁移到一个新的云实例,并将该实例用作我的新redis服务器。如果是MySQL,我将从旧服务器导出DB并将其导入新服务器。我应该如何使用redis


注:我不想设置复制。我想将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
简言之:

  • 将目标redis(空)设置为源redis的从属(带数据)
  • 等待复制完成
  • 允许写入目标redis(当前为从属)
  • 将应用程序切换到目标redis
  • 等待完成从主服务器到从服务器的数据流
  • 将目标redis从主redis转为从redis
  • 此外,redis还具有一些选项,允许在分离目标后立即禁用源redis以接受写操作:

    • min从机写入
    • min-slaves-max-lag
    本主题由

    RedisLabs团队非常好的解释(使用web.archive.org)


    甚至他们用于迁移的交互式工具:

    最终也对我起了作用。其文档提供了一个如何转储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