redis aof_buf缓冲区写入aof文件和同步aof文件有什么区别?
把缓存数据写入aof不就已经实现了同步了吗,即使在写入的过程中又有新的数据进来,那为什么说always策略最多只丢失一次事件循环的数据,everysecond策略最多只丢失一秒数据?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
把缓存数据写入aof不就已经实现了同步了吗,即使在写入的过程中又有新的数据进来,那为什么说always策略最多只丢失一次事件循环的数据,everysecond策略最多只丢失一秒数据?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
在AOF持久化的过程中,其实上是分成两个部分:
WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件。
SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。
具体可以参见:http://redisbook.readthedocs....
但具体为何要分成两个部分,原因相当于“把缓存数据写入aof不就已经实现了同步了吗”,具体如下:
对于write函数而言,其只会更新内存页缓存,而脏页的更新取决于os的统一调度;由于write函数并不会一直阻塞直到IO完成才返回,因此期间若时发生故障就会造成数据丢失问题(尽管时间窗很小);对事务及数据一致性要求高的服务来说(比如备份服务),需要通过同步IO原语来提供os级别的保证,比如AOF中使用的fsync,其目的就是保证文件所有已修改的内容内容已经争取同步到磁盘(因为其会阻塞直到IO完成);简单来说write不是同步的,fsync是同步且有明确结果的
顺便多说一句,对于已被打开的文件执行写操作来说,应先调用fflush函数将修改同步到内核缓冲区,然后再调用fsync函数执行同步调用,这样的同步实现最安全,这也是AOF的源码实现方式
1.写入和同步的区别
举个简单的例子,就是你打开一个文件准备编辑一点东西,那么这个编辑的过程就是写入操作; 那什么是同步呢? 同步就是将数据保存起来,保存到磁盘的过程,就好比ctrl+v 操作。
2.always策略最多只丢失一次事件循环的数据?
说下我的理解吧:redis服务器每结束一个事件循环之前(可以理解为一个命令执行完后准备返回给户端的时候),它都会调用flushAppendOnlyFile函数,考虑是否需要将aof_buf缓冲区中的内容写入和保存到aof文件,如果这个时候appendfsync参数的值是always,那么每次都会同步到磁盘,如果这个时候redis挂掉了,那最多也只丢失了一次事件循环的数据。
3 everysec策略最多只丢失一秒的数据?
是每隔一秒钟同步一次,所以最多也就丢失一秒的数据。