Redis no-appendfsync-on-rewrite=yes,在重写时会导致重写期间数据的意外丢失吗?

我对aof重写的理解:
no-appendfsync-on-rewrite=yes,会让redis在进行aof重写时,不阻塞主进程对客户端的请求。
某时刻T1触发了重写,redis fork出一条子进程,将数据以写操作命令的形式写到新的tmp.aof文件,期间T2时刻,客户端发送了一条写操作请求SET1,此时主进程应该是

  1. 把SET1加入到原来的aof文件
  2. 把SET1写到重写缓存

时刻T3结束重写,然后主进程将重写缓存中的写操作SET1加到新的tmp.aof文件中,最后替换掉原aof文件。

假如T1-T3时间段内redis意外宕机,即使重写缓存里的SET1没有添加到tmp.aof文件中,重启的时候,也是通过原有aof文件(包括SET1操作)来恢复数据,不会导致意料之外的数据丢失。

我对aof重写的理解有问题吗?
为什么看网上的说法,为什么说no-appendfsync-on-rewrite=yes,会导致重写操作时间段内数据的意外丢失呢?还有把和rdb快照联系在一起的说法。。

有点晕,有没有大佬来说明一下?

阅读 1.1k
评论 更新于 2019-03-08
    2 个回答
    who
    • 250

    aof 和 rdb 是两个机制, 没有什么关系
    如果 no-appendfsync-on-rewrite=yes, 这个时候主线程的 set 操作会被阻塞掉, 由于没有新的值写入 redis, 所有就没有这个时候数据丢失的可能. 一旦 tmp.aof 重写成功, 就不会有数据丢失.
    如果 no-appendfsync-on-rewrite=no, 这个时候主线程的 set 操作不会阻塞, 就会有新值写入 redis, 但是这部分记录不会同步到硬盘上, 就会有数据丢失的问题可能. 一旦 tmp.aof 重写成功就发生故障, 就会产生数据丢失.

    评论 赞赏 2019-03-08
      godfather
      • 1
      • 新人请关照

      博主,你好,我认为你这里将yes和no说反了,你觉得呢?

      评论 赞赏 2019-06-25
        撰写回答

        登录后参与交流、获取后续更新提醒