redis aof_buf缓冲区写入aof文件和同步aof文件有什么区别?

把缓存数据写入aof不就已经实现了同步了吗,即使在写入的过程中又有新的数据进来,那为什么说always策略最多只丢失一次事件循环的数据,everysecond策略最多只丢失一秒数据?
clipboard.png

阅读 9.7k
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策略最多只丢失一秒的数据?
是每隔一秒钟同步一次,所以最多也就丢失一秒的数据。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏