如果在aof中使用fdatasync()时发生崩溃,数据会发生什么?

时间:2017-08-10 03:51:24

标签: redis

我最近一直在阅读redis源代码,我发现在flushAppendOnlyFile()中,编写器使用fdatasync将数据更新到磁盘。 我们知道,fdatasync()不会写元数据信息,flushAppendOnlyFile()会改变文件大小。因此,如果在系统更新元数据之前发生崩溃,最新的aof数据是否会丢失? 作者在http://oldblog.antirez.com/post/fsync-different-thread-useless.html

中写道
  

我可以避免同步元数据没有问题,但如果我理解正确,在仅附加文件上下文,不同步大小似乎相当于泄漏数据如果发生崩溃我猜...所以这是不可能在我的上下文。

我不明白为什么在redis环境中它不可能。 有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

这不是他所说的。 fdatasync 更新文件的元数据,如果大小已更改,请参阅评论者" kosaki" Salvatore正在回应,并且如手册所述

  

fdatasync()类似于fsync(),但它不会刷新已修改的元数据,除非需要元数据以便正确处理后续数据检索

(强调我的)。因此,使用fdatasync同步AOF时不会丢失数据。

kosaki所建议的是一种不同的同步方法,它确实永远不会同步元数据,而Salvatore指出会在发生崩溃时丢失数据。什么是"不可能"正在使用fdatasync的替代而不是