Redis - 无法从禁用AOF的环境迁移到启用AOF的环境?

时间:2014-01-21 06:24:27

标签: nosql redis

基本上我的情况如下:

1)我最初没有使用AOF就启动了Redis,并让它运行 n 周。

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

2)我决定转移到新服务器。所以我保存关闭当前的Redis进程,并将RDB文件和AOF文件复制到我的新服务器上。

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

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

但是这几乎意味着如果你的AOF被关闭了一段时间就没有办法使用AOF,如果你从第1天开始连续使用它就只能使用AOF。

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

我在这里遗漏了什么吗?有没有办法将过去的数据包含在您的AOF文件中?

我会很感激一些帮助,因为这会影响我在我的环境中是否需要AOF的决定。 (这意味着我无法体验AOF的巨大好处......)

2 个答案:

答案 0 :(得分:2)

我认为你误解了AOF是如何运作的。

AOF实际上是两种机制:

  • 重做日志记录机制,将所有写入操作附加到AOF文件
  • 后台重写操作,可以从内存内容生成AOF文件

Redis会定期触发后台重写操作,但您也可以使用BGREWRITEAOF命令手动启动它。

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

您可以在aof.c文件中看到此代码: https://github.com/antirez/redis/blob/unstable/src/aof.c#L192

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

答案 1 :(得分:2)

在任何情况下,使用redis的最佳做法是永远不会停止服务器并将文件复制到另一台服务器。最好的做法是在新服务器上启动redis作为当前服务器的slave,然后让redis完成所有同步。

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

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

在这个阶段,旧服务器没有收到任何请求,所以你现在可以做的是动态地改变奴隶并说它是奴隶的无。这样它就会停止与主设备通信以进行同步。如果您动态更改此设置,请不要忘记将配置文件保留到磁盘。

在这一步之后,你的老主人完全孤立了。没有客户正在与它交谈,没有奴隶正在同步。你可以阻止它。

请参阅?你没有停机时间,也没有手动弄乱文件:)

无论如何,你应该阅读迪迪埃评论。他对AOF的看法是正确的