Crash Consistency

文件系统如果遇到 crash(断电,重启),文件系统就很容易出现一致性(consistency)问题。

不过为什么只有文件系统会遇到更多的 Crash Consistency 问题。这是因为其实人们对于像 cache 或者内存这样的存储元件,他们具有易失的特性,所以当 Crash 发生的时候,它们并不需要保证一致性(它们直接啥也没有了)。

一致性在文件系统中很普遍,是因为伴随着对于文件的编辑,数据块本身和数据块的组织(也就是元数据)都会被修改,而一旦在修改过程中发生 crash ,就会导致出现一致性问题。如果数据块没有被写入,那么就会发生文件数据的丢失;如果元数据没有被写入,可能会导致整个磁盘受损(“假占用”,也就是有些块已经被标记为“占用”,但是并没有用)。

Journal

为了解决一致性问题,我们从 DBMS 中借鉴了 journal (日志)的方案。我们会先将编辑的内容写入到日志中,等到全部写完后再开始往真正的数据区写。

这样如果是在写日志的时候发生 crash ,那么并不会破坏原本的数据。而如果在写入数据时发生 crash ,可能数据区有一半新的数据,一半旧的数据(彻底被写毁了),那么在日志中写好的数据也可以用于恢复数据区。

Ordered

Journal 的缺点在于它将每个编辑都“做了两遍”,导致性能有很大的下降。我们可以考虑不采用全日志(Full Journaling)的方法,而是采用元数据日志(Metadata Journaling)的方法,只对元数据做日志,这样虽然 crash 的时候有可能造成文件的损坏,但起码不会损坏磁盘。