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
Nosql Redis—是否无法从禁用AOF的环境迁移到启用AOF的环境?_Nosql_Redis - Fatal编程技术网

Nosql Redis—是否无法从禁用AOF的环境迁移到启用AOF的环境?

Nosql Redis—是否无法从禁用AOF的环境迁移到启用AOF的环境?,nosql,redis,Nosql,Redis,基本上,我的情况如下: 1) 我最初在没有AOF的情况下启动了Redis,并让它运行了数周 2) 我决定使用AOF,所以我重新启动Redis并在n+1周后打开AOF 3) 我决定搬到一个新的服务器上。所以我安全地关闭了当前的Redis进程,并将RDB文件和AOF文件复制到我的新服务器上 4) 当我在启用AOF的新服务器中启动Redis时,Redis的默认行为是仅从AOF加载数据这意味着前n周的数据丢失。 当然,有一个显而易见的解决方案,就是在没有AOF的情况下启动Redis,以便从RDB加载数据

基本上,我的情况如下:

1) 我最初在没有AOF的情况下启动了Redis,并让它运行了数周

2) 我决定使用AOF,所以我重新启动Redis并在n+1周后打开AOF

3) 我决定搬到一个新的服务器上。所以我安全地关闭了当前的Redis进程,并将RDB文件和AOF文件复制到我的新服务器上

4) 当我在启用AOF的新服务器中启动Redis时,Redis的默认行为是仅从AOF加载数据这意味着前n周的数据丢失。

当然,有一个显而易见的解决方案,就是在没有AOF的情况下启动Redis,以便从RDB加载数据,然后在运行时打开AOF

但这几乎意味着,如果您的AOF被关闭了一段时间,就无法使用AOF,并且只有在您从第一天开始就一直在使用AOF时,才能使用AOF。

这种理解正确吗?如果是这样的话,对于任何想要迁移到支持AOF的环境的人来说,这听起来都是毫无用处的。一个没有迁移手段的系统听起来很蹩脚

我是不是遗漏了什么?有没有办法将您过去的数据包含到AOF文件中


我希望能得到一些帮助,因为这会影响我决定是否在我的环境中需要AOF。(这意味着我无法体验AOF的巨大好处…

我想你误解了AOF的工作原理

AOF实际上是两种机制:

  • 将所有写操作附加到AOF文件的重做日志机制
  • 一种后台重写操作,可根据内存内容生成AOF文件
Redis会定期触发后台重写操作,但您也可以使用该命令手动启动

现在,当通过“config set appendonly yes”命令动态打开AOF时,会自动触发重写操作,因此您可以确保所有现有数据都是生成的AOF文件的一部分

您可以在aof.c文件中看到以下代码:


在您描述的情况下,您应该在AOF文件中获取所有数据。

在任何情况下,redis的最佳实践是从不停止服务器并将文件复制到另一台服务器。最佳做法是在新服务器上作为当前服务器的从属服务器启动redis,并让redis执行所有同步

您可以将从属服务器配置为接受写操作,但到目前为止,您的所有客户端仍然只指向旧的主服务器

然后,当所有内容都同步时,您将所有客户机指向从机。从机将具有与主机相同的数据,并且由于它接受写入,因此您的客户端可以根据需要设置新密钥

在这个阶段,旧服务器没有收到任何请求,所以现在可以动态地更改从属服务器,并说它是无从属服务器。这样,它将停止与主机进行同步通信。如果您动态地更改它,请不要忘记将配置文件持久保存到磁盘

经过这一步,你的老主人完全孤立了。没有客户端与它对话,也没有从机正在同步。你可以停下来

看到了吗?您没有停机时间,也没有手动处理文件:)


无论如何,你应该阅读迪迪埃的评论。关于AOF,他说得对

非常感谢!正如你所说,我一直误解了后台重写操作。在重写操作被触发后,我的数据集都安全地在我的AOF中,并且我只能用一个AOF文件启动我的服务器。我以为
BGREWRITEAOF
只是现有AOF文件的一种压缩机制,但我错了。这一页也解释了这一点。我非常感谢你的解释:)为什么说为了解决日益增长的AOF问题,我们可以使用BGREWRITEAOF,它将通过删除冗余命令将AOF重写为尽可能短的。?似乎重写是基于原始AOF文件的。这是个错误吗?谢谢你的评论!我提出迁移示例是为了澄清我对AOF文件的理解,因此服务器迁移不是我主要关心的问题。但是你的迁移技巧听起来很有前途,也很简单;下次我必须移动服务器时,我肯定会使用它!谢谢!