0

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

2018-02-01 提问

1 个回答

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的源码实现方式

推广链接