Do you really need ECC RAM with ZFS?

本文是Do you really need ECC RAM with ZFS?的翻译。

在使用ZFS文件系统时,你是否真正需要ECC内存?

2024.02.06 update

与其讨论诸如是否需要ECC内存和如何使用raid实现容灾等问题,增加数据副本和实施数据副本间同步才是真正重要的问题hhh。

tl;dr

简而言之,并非完全必要。然而,如果你选择使用,生活将更加美好。

需要记住的是,ZFS绝对不会向你提供它认为是错误的数据。如果它检测到错误,它会给出一个错误提示,而绝不会提供错误的数据。所以如果你手上的非ECC内存已经能够正常工作了,通过升级ECC内存你将不会获得任何好处。

为什么需要ECC内存 aka ECC内存能带来什么

问题在于,不存在完美的硬件。现代硬盘的设计标准允许10的15次方分之一左右的比特错误率。尽管这个故障率看起来很小,但需要强调的是现代硬盘的容量(按比特计)正在接近这个数字,也就是,当用户的数据装满了一个硬盘时,数据错误可能已经存在了。

大多数文件系统信任硬件提供的数据,并将这些数据直接传递给用户,数据中的问题会直接被暴露在用户眼前。当然,普通用户可能根本注意不带这些问题,毕竟现在大多数数据以高度压缩的视频、音频或图片等形式存在,微小的数据错误(如数据的某个比特上的数据翻转)对数据本身的影响微乎其微,用户对这种错误的宽容度很高。

让ZFS难以与非ECC内存一起使用的关键是,ZFS不属于上述大多数系统,ZFS不信任直接来自硬件的数据,ZFS在将数据传递给用户之前会首先对数据进行校验,当数据存在错误时ZFS拒绝继续向上传递(有问题的)数据,而是给出一个错误信息。假设用户在ZFS卷上有一个20GB的虚拟机镜像,并且它出现了一个无法纠正的位错误,整个镜像会被标记为“损坏”,ZFS将不会将其提供给用户。仅仅因为一个位的错误,而这个错误很可能本来也不重要。

当然,这里说的是无法纠正的错误。如果用户的数据完整地写入磁盘,且磁盘提供了相关机制保证数据正确性,那么这种错误几乎可以通过其他磁盘卷成员来纠正以保证提交给文件系统的数据的可靠性。

真正的麻烦是数据在被写入磁盘时就出错了,能够正常工作的非ECC内存对这种错误没有检查和纠正的能力,于是错误的数据被写入存储池的各个镜像,冗余的数据也是错误的,这种情况下ZFS不会向用户提供这些数据,用户只能寄希望于另一个备份。

结论

为了让ZFS运行得更快更好而使用ECC内存是不现实的,ECC内存的真正作用是减少数据因为用户未知的微小的错误(这种微小的可能完全不影响使用的错误会因ZFS的“铁面无私”被放大,直到用户完全拿不到数据)而完全无法访问的可能性。