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

发布于 2022-09-11 18:15:05 字数 551 浏览 46 评论 0

我对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快照联系在一起的说法。。

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

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

稍尽春風 2022-09-18 18:15:05

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文