我最近一直在阅读redis源代码,我发现在flushAppendOnlyFile()中,编写器使用fdatasync将数据更新到磁盘。 我们知道,fdatasync()不会写元数据信息,flushAppendOnlyFile()会改变文件大小。因此,如果在系统更新元数据之前发生崩溃,最新的aof数据是否会丢失? 作者在http://oldblog.antirez.com/post/fsync-different-thread-useless.html
中写道我可以避免同步元数据没有问题,但如果我理解正确,在仅附加文件上下文,不同步大小似乎相当于泄漏数据如果发生崩溃我猜...所以这是不可能在我的上下文。
我不明白为什么在redis环境中它不可能。 有人可以帮帮我吗?
答案 0 :(得分:0)
这不是他所说的。 fdatasync
会更新文件的元数据,如果大小已更改,请参阅评论者" kosaki" Salvatore正在回应,并且如手册所述
fdatasync()类似于fsync(),但它不会刷新已修改的元数据,除非需要元数据以便正确处理后续数据检索
(强调我的)。因此,使用fdatasync
同步AOF时不会丢失数据。
kosaki所建议的是一种不同的同步方法,它确实永远不会同步元数据,而Salvatore指出会在发生崩溃时丢失数据。什么是"不可能"正在使用fdatasync
的替代而不是。