youtube

介绍

ZFS是一个拥有逻辑卷管理功能的文件系统,最早源自于Oracle为Solaris操作系统开发的文件系统。ZFS具有可扩展性,并且包括大量保护措施防止数据损坏,支持高存储容量、高效数据压缩、集成文件系统、卷管理、快照和写时复制、连续完整性检查与自动修复、RAID-Z、原生NFSv4 ACL等功能,并且能被精确配置。ZFS有两个主要实现,分别来自Oracle和OpenZFS,它们之间极度相似,这使得ZFS在类Unix系统中广泛可用。

功能

  • 写时复制
  • 存储池
  • 快照
  • 数据完整性验证和自动修复
  • RAID-Z
  • 最大单个文件大小为 16 EB(1 EB = 1024 PB)
  • 最大 256 千万亿(256*1015 )的 ZB(1 ZB = 1024 EB)的存储

写时复制技术

与传统文件系统不同,当在ZFS上覆盖数据时,新数据将被写入不同的块,而不是原地覆盖,仅在完成写入后,才更新元数据以指向新位置,如果发生大体量写入发送断电或系统崩溃,文件的整个原始内容仍然可用,并且不完整的写入将被丢弃,这也意味这意外关闭后,ZFS不需要运行fsck来检查和修复文件系统。

存储池

zfs示意图.png

ZFS的储存创建在一个名为zpool的储存池之上,zpool是有若干个虚拟设备(virtual devices,缩写:vdevs)组成,vdevs是可以由原始磁盘组成,也可以由RAID1镜像设备组成。

创建的储存池不能直接使用,需要创建数据集(dataset,可以理解成文件夹),数据集里还可以创建子数据集(子文件夹)。除了数据集ZFS里还有另一种储存方式:zvol(zfs volume,zfs卷),zvol一般是给虚拟机作用虚拟磁盘,或者iscsi共享。

阵列

条带:与RAID0类似,不过可以不同大小的硬盘组(假设2块盘容量不一样,写入数据大小超过较小硬盘容量的两倍以后就没有只有大的硬盘的读写速度了)

镜像:与RAID1类似,磁盘镜像,至少需要两个磁盘。

RAIDZ1:与RAID5类似,一重奇偶校验,至少需要三块磁盘;可以坏一块硬盘不丢数据。容量和速度为N-1(N为硬盘数量)

RAIDZ2:与RAID6类似,双重奇偶校验,至少需要四个磁盘;可以坏2块硬盘不丢数据。容量和速度为N-2(N为硬盘数量)

RAIDZ3:ZFS特有的,三重奇偶校验,至少需要5个磁盘;可以坏3块盘不丢数据。容量和速度为N-3(N为硬盘数量)

当有盘坏了需要替换时,替换盘不能比原盘小

快照

ZFS的快照只有快照的数据内容有改变才会产生大小,而且快照是只读的,不用担心感染病毒。

扩容

zfs扩容目前有两种方式

  • 成组扩容:假设你原本数据集是3盘RaidZ组的vdevs,扩容也只能直接加3个盘组成另一个vdevs,vdevs之间的链接的模式是条带
  • 替换扩容:假设原本数据集是3盘8T组RaidZ的vdevs,利用RaidZ可以坏一个盘的原理,拿出一个盘,放入比8T更大的盘,等待阵列恢复后以此类推,把3个盘都替换掉,完成扩容。

读写缓存

ZFS里面其实是没有真正意义的写缓存,ZFS的缓存有2种

  • ARC:把内存作为缓存
  • L2ARC:SSD可以作为二级读缓存
  • ZIL:写日志缓存,默认是用内存,可以用SSD作为ZIL,但是SSD坏了可能会数据丢失

官方文档中对于ZIL缓存的解释:

ZFS provides a write cache in RAM as well as a ZFS Intent Log (ZIL). The ZIL is a storage area that temporarily holds synchronous writes until they are written to the ZFS pool

ZIL是针对同步写入的场景,把同步写入转换为异步写入,使得系统不必卡住等待写入完成,而从而提升系统整体的写入性能。因此只有当你的存储存在大量同步写入的场景时,通过低延迟的SSD等设备来缓存写入场景才能让ZIL明显的提升性能,官方建议在NFS over ESXi以及数据库应用等这类高同步写入场景中来使用ZIL。
在SMB、NFS和iSCSI这类我们常用的家庭NAS共享协议场景下,同步写入的场景是非常非常少的,因此使用ZIL并不能明显提升性能,因此,在家用场景下,官方并不建议我们使用专门的设备来启用ZIL。

官方文档中对于L2ARC缓存的解释:

ZFS provides a read cache in RAM, known as the ARC, which reduces read latency. If an SSD is dedicated as a cache device, it is known as an L2ARC. Additional read data is cached here, which can increase random read performance.

L2ARC does not reduce the need for sufficient RAM. In fact, L2ARC needs RAM to function. If there is not enough RAM for a adequately-sized ARC, adding an L2ARC will not increase performance. Performance actually decreases in most cases, potentially causing system instability. RAM is always faster than disks, so always add as much RAM as possible before considering whether the system can benefit from an L2ARC device.

二级缓存需要依赖更大的内存来发挥作用,根据官方建议,针对小于32G的内存场景下,不推荐开启L2ARC缓存,并且L2ARC的缓存大小一般不能超过内存的10倍。

所以综上所述,能加内存和硬盘才是王道,SSD缓存(家用情况)不用加。

元数据

用于创建融合池,可以加速元数据和小块IO(SSD+HDD)

未来

来自ixsystem介绍

即将推出的 OpenZFS 3.0 发布路线图连同其激动人心的候选功能一起推出,包括 RAIDZ 扩展、S3 对象存储上的 OpenZFS,以及增强的 macOS 和 Windows 支持。这些功能为 2023 年及以后的未来 TrueNAS 版本提供了一些极好的机会。

DirectIO for ZFS通过绕过自适应读取缓存 (ARC) 为基于闪存的高性能系统提供无缓冲写入路径。写入性能提高了 3 倍,主要写入工作负载的性能报告了不大量利用 ARC 的情况。DirectIO 行为由“直接”数据集属性控制,选项为标准、始终和禁用,灵感来自“同步”属性。

与持久内存延迟保持同步的新 ZIL描述了另一个优化 ZFS 意图日志的建议,以用于持久内存 NVDIMM 设备,例如 TrueNAS M 系列中使用的设备。新的 ZIL 或 DirectIO 可以提高所有 TrueNAS 版本的写入性能。

对象存储上的ZFS是一种新的 vdev 类型和代理,可映射到云支持的 OpenZFS 的 S3-API 存储。还有一个关于ZettaCache 的演讲:快速访问慢速存储,一种旨在与对象存储上的 ZFS 配合使用的缓存机制。这些功能可以极大地增强 TrueNAS 混合云选项。

VDEV 属性为VDEV提供类似于数据集可用的详细报告和配置属性。这些工具对于具有多代存储设备的大型 TrueNAS 系统非常有用。

改进 ZFS 发送/接收集中在使用受控预取以获得更高的发送/接收性能。随着数据集的不断增长,TrueNAS 用户一直在寻求提高复制性能。

Windows 上的 ZFS 性能描述了 Windows 项目上的 OpenZFS 中最近的性能改进,该项目正在接收可用性改进,例如与 Windows 性能监视器的集成。这项工作使 Windows 更接近成为一流的 OpenZFS 平台。有了这个,Windows 服务器将能够直接使用 TrueNAS 本地复制数据,并通过 TrueNAS CORE 和 SCALE 使 OpenZFS 成为跨越传统操作系统边界的更通用的文件系统。

如果你觉得本教程对你有帮助,请随意打赏,谢谢。

最后修改:2021 年 12 月 22 日
感谢您的支持