Leo的技术日志

ZFS 误区

误解:ZFS只是一种soft RAID 或者 ZFS只是一种文件系统

传统的RAID和文件系统是分层的,而ZFS的文件系统和提供的RAID功能则是一体的。无论是硬件RAID卡还是mdadm都是无法感知文件系统到底使用了哪些块的,但ZFS却可以。

mdadmin创建soft RAID的时候,阵列需要经过漫长的resyncing状态,而ZFS创建raidz的时候几乎是瞬间就完成了。

在阵列重建的时候,传统RAID不管上面实际存储的数据有多少,都是固定的、漫长的重建时间。而ZFS阵列的重建是和实际存储的数据量相关的。

误解:ZFS 需要 ECC 内存,不用就会损坏数据

虽然强烈推荐使用ECC内存,但ZFS不强制要求ECC内存,在没有ECC的系统上仍能正常工作。

如果你的业务很重要你本来就应该考虑使用ECC内存。ZFS遇到内存错误和你其他业务系统遇到内存错误的场景是一样的。

使用ECC内存可以减少遇到silent memory corruption的概率。

误解:ZFS 的ARC很吃内存,没有大量内存就不能用ZFS

ZFSARC(自适应替换缓存)会动态使用空闲内存;系统需要内存的时候ARC会归还。正常情况下不推荐你修改ARC大小的配置。

8GB内存就可以使用ZFS。但如果你只有8GB内存,你还需要用它来部署虚拟机,那就不推荐你使用ZFS了。

误解:ZFS 很慢

很慢可能来自于你使用传统的磁盘IO测试工具去测试ZFS系统。你用传统的IO测试工具测试不一定能反应出ZFS的真实性能,因为ZFS和传统的RAID或文件系统不太一样。

很慢还可能是因为RAID-Z上的写放大原因,这和传统没有cache的RAID面临的问题一样。

在使用硬件RAID卡的时候可以选择带cache的阵列卡,而在ZFS上我们可以使用SLOG实现写cache。

此外还有其他的各种原因:如配置了sync=always,选择了不合适的压缩算法, CPU性能太弱, ARC设置得太小, 对齐问题……

误解:ZFS 不适合虚拟机 / 数据库

我们要优先使用vdev而不是qcow2格式的磁盘文件作为虚拟机的磁盘。使用qcow2就是增加了一层,ZFS感知的是这个虚拟机文件的读写情况而不是真实虚拟机磁盘的读写。

两种都能提供快照功能。

配置recordsize=16K

可以开启lz4的压缩。

使用SSD作为SLOG

误解:使用硬件 RAID搭配ZFS

看起来是强强联合,实际上违背了一个ZFS的原则(让ZFS直接和真实的硬盘通信)。如果使用硬件阵列卡应该配置为IT模式。

同样的情况也适用于SLOG的SSD磁盘,为了提供SLOG的可靠性,让ZFSmirror的形式使用2个SSD, 而不是把2个SSD组成RAID后再给ZFS使用。

误解:ZFS 不需要备份,因为它有快照

快照 ≠ 备份,只是同池副本。这个原则适用于所有有快照功能的存储系统(如NTFS)。有冗余的RAID也不等于备份。

使用ZFS send/recv进行备份。

误解:ZFS一定要配置L2ARC

ZFSL2ARC(第二级自适应替换缓存)不是必须配置的,而是可选的性能优化组件。

如果条件允许(内存足够大)应该首先确保ARC,因为内存的速度远大于SSD的速度。如果ARC足够使用,完全不需要配置L2ARC

在读密集场景,ARC不足时,L2ARC才有作用。

在大多数虚拟化场景下,L2ARC并非必要,甚至可能有害。

误解:ZFS能自动修复所有数据损坏

ZFS能检测并修复数据损坏,但前提是你使用了冗余配置(如Mirror或RAIDZ)。单盘配置下,ZFS只能检测到损坏但无法修复。

这其实和无RAID的其他文件系统一样。

误解:所有的ZFS都是兼容

NAS厂家的NAS系统里面带的ZFS系统可能是厂家魔改过的,所以它们不一定都兼容。

误解:ZFS去重是必开的“黑科技”,能节省大量空间

实时去重会带来巨大的性能开销和内存消耗。除非你了解它的细节和有足够的资源,否则就不要去用它。