关于ZFS与ECC内存的一些记录及分析
网络存储(NAS)在个人和家庭应用场景中已经去见惯不怪,在搭建nas系统的过程中,是否使用ecc内存是经常被提及和争论的一个问题。本文尝试以truenas的zfs文件系统为例,对ecc内存需求的由来及必要性进行分析。
1. ECC内存
作为ECC内存最大的好处就是可以在随机比特翻转的时候通过校验纠错,从而还原内存中正确的数据。
2. ZFS文件系统
ZFS的开发者曾经说过,理论上ZFS文件系统本身不会比其他任何文件系统对ECC功能的依赖程度更高,当然如果内存里的数据因为比特随机翻转(各种因素影响,譬如宇宙射线等等),从内存记录到文件系统的数据确实会出错,但其他文件系统其实也面临同样的风险概率。 所以,在同样没有ECC内存的条件下对文件进行读写,ZFS文件系统出现错误与其他文件系统相比在概率上是完全一样的,而且ZFS在记录文件时还会在硬盘上保留文件校验信息和文件校验信息的校验信息,可以提供更好的数据安全性。
3. 基于ZFS文件系统的应用
作为一个强大的文件系统,ZFS除了最基本的功能之外,还提供了很多其他文件系统所不具有的高级功能,譬如:压缩、去重等等,正是这些应用几何数量级地提升了对内存数据完整性的要求,例如压缩时用到的字典,如果字典本身出问题,损害的就不是一个文件,而是文件所在的整个数据集(dataset)甚至是整个pool的安全,这也就是很多人强调在ZFS系统下用ECC内存的根本原因。
4. 无ECC内存下的TrueNAS注意事项
如果对与数据的完整性要求很高,为了以防万一,可以考虑不使用ZFS的某些高级功能,如去重、压缩(需要注意压缩在默认情况下是打开的),从而规避无ECC内存带来的风险。
5. 关于数据的Scrub
定期进行scrub能有效防止磁记录的退化,通过“数据读出”–>“原位写入”来刷新硬盘用于记录数据的剩磁效应,这似乎会带来一个可能,就是当读取数据到内存时,随机发生了比特翻转,这当然会触发校验,而在校验时特定的比特又发生了一次翻转,形成哈希碰撞,使得错误的数据通过了校验,而这个错误的数据立刻又被写入到硬盘中,从而导致原有数据的损坏。 但是,很多没有采用ECC的民用或者半工业级的NAS,譬如群晖、威联通都有定期进行scrub的功能,似乎还没有听到过因为scrub数据损坏的事情发生,这是因为同上发生上面两次比特翻转导致错误的概率大约是1/2^256,基本上属于人类世界中不可能发生的事件(人一生中被闪电击中的概率大约是1/2^20)。而且,这种损坏只是某个文件的损坏,不会波及到整个文件系统。
https://jrs-s.net/2015/02/03/will-zfs-and-non-ecc-ram-kill-your-data/
6. 结论
相信绝大多数人都不会用到dedup这种功能,因为它太耗内存,降低读写速度,以及不可逆。至于压缩,由于压缩率很低,关掉其实也无伤大雅。因此如果在使用ZFS文件系统时避免使用上面说涉及到的一些高级功能,那么我们实际上可以完全不考虑非ECC内存带来的数据完整性风险。
当然,这个原则不仅仅对于truenas适用,对于unraid、synology、qnap、飞牛os等所有的nas系统中无论是zfs、brtfs还是ext4文件系统,也都是适用的。