Redis no-appendfsync-on-rewrite=yes,在重写时会导致重写期间数据的意外丢失吗?
我对aof重写的理解:
no-appendfsync-on-rewrite=yes,会让redis在进行aof重写时,不阻塞主进程对客户端的请求。
某时刻T1触发了重写,redis fork出一条子进程,将数据以写操作命令的形式写到新的tmp.aof文件,期间T2时刻,客户端发送了一条写操作请求SET1,此时主进程应该是
- 把SET1加入到原来的aof文件
- 把SET1写到重写缓存
时刻T3结束重写,然后主进程将重写缓存中的写操作SET1加到新的tmp.aof文件中,最后替换掉原aof文件。
假如T1-T3时间段内redis意外宕机,即使重写缓存里的SET1没有添加到tmp.aof文件中,重启的时候,也是通过原有aof文件(包括SET1操作)来恢复数据,不会导致意料之外的数据丢失。
我对aof重写的理解有问题吗?
为什么看网上的说法,为什么说no-appendfsync-on-rewrite=yes,会导致重写操作时间段内数据的意外丢失呢?还有把和rdb快照联系在一起的说法。。
有点晕,有没有大佬来说明一下?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
博主,你好,我认为你这里将yes和no说反了,你觉得呢?
aof 和 rdb 是两个机制, 没有什么关系
如果 no-appendfsync-on-rewrite=yes, 这个时候主线程的 set 操作会被阻塞掉, 由于没有新的值写入 redis, 所有就没有这个时候数据丢失的可能. 一旦 tmp.aof 重写成功, 就不会有数据丢失.
如果 no-appendfsync-on-rewrite=no, 这个时候主线程的 set 操作不会阻塞, 就会有新值写入 redis, 但是这部分记录不会同步到硬盘上, 就会有数据丢失的问题可能. 一旦 tmp.aof 重写成功就发生故障, 就会产生数据丢失.