跳到主要内容

ZFS 存储

Special 谢谢

我们感谢 Ed Rawlings(Spaceinvader One)提供的专业知识和指导,本 ZFS 存储文档正是在此基础上改编而来。他的教程和见解帮助了无数 Unraid 用户掌握高级存储技术。感谢他持续为 Unraid 社区作出贡献。

ZFS 为您的 Unraid 系统带来高级的数据完整性、灵活的存储配置和高性能。本指南解释 ZFS 的核心概念,并引导您通过 Unraid WebGUI 直接管理 ZFS 池。无论您是部署新的 ZFS 存储还是整合现有的池,您都可以在这里获取启动所需的步骤和背景。


为什么选择 ZFS?​

ZFS 是一种现代文件系统和卷管理器,旨在保护您的数据、防止损坏并简化存储管理。

使用 ZFS,您可以获得:

  • 自动数据完整性检查和自我修复
  • 内置 RAID 支持(镜像、RAIDZ)
  • Snapshots 和克隆功能,用于轻松备份和回滚
  • ZFS 发送/接收,高效复制
  • 即时压缩

Unraid supports ZFS for any storage pool. You can create a new ZFS pool, import one from another system, or use Unraid’s unique hybrid ZFS setup: add a ZFS-formatted disk directly to the Unraid array (not a pool) and combine ZFS features with Unraid’s parity protection.

:::info[Example]

您可以在单个磁盘上使用 ZFS snapshots 和复制作为备份目标,或将快速 SSD ZFS 池复制到由 Unraid parity 保护的 ZFS 磁盘中的 array,以获得双重优势。

:::

备注

混合 ZFS-in-array 方法对特定的备份或复制场景有帮助,但不能替代完整的 ZFS 池。在 array 中的 ZFS 磁盘是独立管理的,您无法获得真正的多磁盘 ZFS 池的性能、冗余或自修复功能。要实现完整的 ZFS 功能,请始终使用独立的 ZFS 池。

池、vdevs 和冗余​

一个 ZFS 池(称为“zpool”)由一个或多个 vdevs(虚拟设备)组成。在每个 vdev 内,多个物理盘通过某种冗余级别组合到一起。ZFS 在多个 vdev 上写入数据,但每个 vdev 负责自己的容错。

注意

冗余总是针对每个 vdev 的。如果任何一个 vdev 失败,整个池将失败,即使其他 vdev 是健康的。请仔细规划您的 vdev!


创建一个 ZFS 池​

要使用 WebGUI 创建 ZFS 池:

  1. 停止array。
  2. 点击添加池。

  1. 为您的存储池选择一个名称(例如,raptor)。
  2. 设置槽位数量以匹配您想要在主数据 vdev(s) 中的磁盘数量。
备注

此初始槽位数量仅用于数据 vdev。支持 vdev(例如日志或缓存驱动器)可以在创建池后单独添加。

  1. 将磁盘分配到池中(磁盘顺序无关紧要)。

  1. 点击池名称(例如 raptor)以打开其配置屏幕。
  2. 将文件系统类型设置为 zfs 或 zfs-encrypted(用于 LUKS 加密)。

  1. 选择您的分配配置文件 - 这会决定您的池的冗余和性能。
提示

在完成之前,请查看有关分配配置文件和拓扑的章节,以便作出合适选择。

  1. 如果需要,可以启用压缩(推荐用于大多数工作负载)。
  2. 点击完成,然后启动 array。

将 ZFS 磁盘添加到阵列(混合设置)​

您可以将独立的 ZFS 磁盘添加到您的 Unraid array(而不是 ZFS 池)中,以结合 ZFS 功能和 Unraid 的 parity 保护。

What this enables
  • 奇偶校验保护: ZFS 磁盘受 Unraid array parity 保护,可确保数据免受单个磁盘故障影响(如果配置了多个 parity drives,也可承受多个磁盘故障)。

  • 数据完整性: ZFS 提供块级完整性检查(校验和)。虽然单个磁盘无法自行修复位腐烂,ZFS 仍能检测损坏并提醒您,以便在静默数据丢失之前从备份恢复。

  • ZFS 功能: 您可以在此磁盘上使用 ZFS snapshots 和复制,使其成为备份目标、特定数据集,或需要将 ZFS 功能与传统 Unraid 存储结合的场景的理想选择。

将 ZFS 磁盘添加到 array:

  1. 在 WebGUI 中转到 主页面 标签。
  2. 停止array。
  3. 点击 Array Devices 下的空槽位。
  4. 选择您要添加的磁盘。

  1. 在 文件系统 下,选择 zfs 或 zfs-encrypted。

  1. 点击 应用。
  2. 启动 array,并在需要时让磁盘格式化。

选择分配配置文件​

当您设置 ZFS 池时,您的分配配置文件将决定您的数据如何受到保护、池的性能以及其可扩展性。以下是一些简单的比较帮助您决定哪个配置文件适合您的需求:

配置冗余性能扩展空间效率典型用例每个 vdev 的推荐硬盘数量
条带无快,但风险大增加更多磁盘100%临时/临时存储任意数量
镜像1:1(RAID 1 样式)对于随机 I/O 表现出色增加更多镜像50%高性能,易于扩展2 个硬盘(可以添加更多镜像)
RAIDZ1每个 vdev 1 个盘在处理大文件时速度快。不适合小文件或随机写入。增加新的 vdev高通用用途,1 盘容错3-6 个硬盘(最多 8 个)
RAIDZ2每个 vdev 2 个盘与 Z1 类似,但写入略慢(额外的奇偶校验)增加新的 vdev中等重要数据,2 盘容错6-12 个硬盘(最多 14 个)
RAIDZ3每个 vdev 3 个盘与 Z2 类似,写入更多负担(最大安全性)增加新的 vdev低任务关键型,3 盘容错10-16 个硬盘(最多 20 个)

:::tip[Optimizing 硬盘数量

上表中的推荐硬盘数量适合大多数用户。若要获得更好的性能,可以在这些范围内选择数据盘数量(总盘数减去奇偶校验盘数)为 2 的幂(例如 2、4、8、16)的配置。这有助于正确对齐数据条带,避免空间浪费和不均衡的 I/O。

优化配置示例:

  • RAIDZ1: 3、5 或 9 个硬盘(数据盘 = 2、4 或 8)
  • RAIDZ2: 4、6 或 10 个硬盘(数据盘 = 2、4 或 8)
  • RAIDZ3: 5、9 或 17 个硬盘(数据盘 = 2、6 或 14)

请注意,这些优化是可选的 - 上述建议适用于大多数使用情况。

:::

How to choose
  • 选择 镜像 如果您想要最佳性能和易于、灵活的扩展,并且愿意使用更多磁盘空间来确保冗余。
  • 选择 RAIDZ1/2/3 如果您想最大化可用空间并存储大文件,但要记住扩展的灵活性较低,随机写性能较差。
  • 条带 只适用于非关键性、临时数据 - 如果任何磁盘故障,您将失去所有数据。

拓扑和扩展​

您如何将磁盘分组到 vdevs 中会影响数据安全性和速度。

  • 如果您将所有磁盘放入一个大型 RAIDZ2 vdev,您可以在不丢失数据的情况下丢失任意两个磁盘。然而,扩展意味着需要添加另一个完整的 vdev。
  • 如果将磁盘分割成多个较小的 RAIDZ1 vdev,您将获得更好的并行性能。请注意,如果同一 vdev 中有两个磁盘故障,您将失去整个池。
  • ZFS 将数据跨 vdev 条带化,而不是单个磁盘,因此更多的 vdev 能够提升处理很多小文件或随机 I/O 的工作负载性能。
  • 扩展一个 ZFS 容量池通常意味着添加一个新的相同布局的 vdev,而不仅仅是单个磁盘。
提示

规划池的布局以满足需求和未来的增长。与 Unraid array 不同,您不能通过 WebGUI 向现有 vdev 添加单个磁盘。


压缩和 RAM​

ZFS 提供高级功能,可显著提升 Unraid 的存储效率和性能。压缩和内存需求是两个常见关注点。

ZFS 压缩是透明的 - 它在后台运行,在数据到达磁盘之前缩小数据。

这提供了两个主要优点:

  • 减少磁盘使用量: 所需存储空间更少。
  • 提高性能: 写入和读取较少数据可以导致更快的操作,特别是在现代 CPU 上。

提示

建议为大多数 Unraid ZFS 池启用压缩。它安全、高效,并且很少影响兼容性或稳定性。

ZFS RAM 神话 - 点击展开/折叠

您可能听过过时的建议:“ZFS 要求每 TB 存储 1 GB RAM”。这对大多数用户来说不再适用。ZFS 使用 RAM 作为其自适应替换缓存(ARC),加速频繁访问的读取。

Unraid 自动限制 ZFS 使用系统内存的一部分(通常是总 RAM 的 1/8)。这使 ZFS 可以良好运作,而不会影响到 Docker 容器、VMs 或 Unraid 操作系统。

信息

ZFS 随可用内存进行良好扩展。更多的 RAM 可以增强缓存性能,但 ZFS 在较低配置的硬件上依然可靠。不要让旧的建议阻止您在 Unraid 上使用 ZFS 。


导入其他系统创建的 ZFS 池​

Unraid 可以轻松导入其他平台上创建的 ZFS 池。

如何导入 ZFS 池 - 点击展开/折叠
  1. 停止阵列: 确保您的 Unraid array 已停止。
  2. 添加新池: 点击 添加池。
  3. 分配所有驱动器:
    • 将 数据槽位数量 设置为您的 ZFS 池中磁盘(包括数据 vdevs 和支持 vdevs)总数。
    • 将每个驱动器分配到正确的插槽。
    • 示例: 对于具有 4 个驱动器镜像 vdev 和 2 个驱动器 L2ARC vdev 的池,设置 6 个插槽并分配所有六个驱动器。
  4. 设置文件系统为 "Auto": 点击池名称(例如,raptor)并将 文件系统 设置为 Auto。
  5. 完成并启动阵列: 点击 完成,然后启动 array。
自动检测

Unraid 将自动检测并导入 ZFS 池。支持 vdevs (如日志,缓存/L2ARC,特殊/去重) 会列在 WebGUI 中的 子池 下。在启动导入后不需要单独添加子池。Unraid 会在所有所需驱动器被分配后,与主数据磁盘一起自动导入。

导入后,强烈建议运行 scrub 以验证数据完整性。

  • 点击池名(例如 raptor)以打开其配置。
  • 在 池状态 下,检查状态并点击 Scrub。


支持 vdev(子池)​

Unraid 将 ZFS 支持 vdevs 称作子池。大多数用户不需要这些,但有经验的用户可能会使用:

支持的 vdev(子池)用途风险/备注
特殊 vdev存储元数据和小文件如果丢失,池将无法读取。
去重 vdev启用去重功能需要大量 RAM;对大多数用户都有风险。除非有专家级需求,否则请避免使用。
日志 vdev(SLOG)提升同步写入性能可选。只对特定工作负载有帮助。
缓存 vdev(L2ARC)提供基于 SSD 的读取缓存可选。可改善大型工作集的读取速度。
备用 vdevUnraid(截至 7.1.2 版)不支持
注意

大多数 Unraid 用户应避免支持 vdevs/子池,除非您有特定并且明确的需求。它们是针对专门工作负载设计的,滥用会带来复杂性或风险。


导入时未分配重要的支持 vdev 驱动器​

当将 ZFS 池导入到 Unraid 时,您需要指定原始池中的每个驱动器,包括用于支持 vdevs 的驱动器,确保将其分配到池槽中。Unraid 将在 array 启动后自动识别每个驱动器的角色(数据、日志、缓存、特殊或去重)。您不需要手动指定每个驱动器的用途。

如果在导入期间忘记包含一个支持 vdev 的驱动器,结果将取决于 vdev 的功能:

Vdev 类型导入时驱动器缺失情况结果
特殊 vdev 或去重 vdev池将无法导入或无法使用这些 vdev 存储关键元数据或去重表。没有它们,ZFS 无法安全挂载该池。
日志(SLOG)vdev池导入,但同步写入性能下降。池仍然可访问,但你可能会注意到依赖同步写入的工作负载的性能变慢。
缓存(L2ARC)vdev池导入,但读取缓存丢失池正常工作,但您将失去 L2ARC 缓存带来的性能提升。没有数据丢失。
提示

导入到 Unraid 时,请始终分配原始 ZFS 池中的每个物理驱动器,包括所有支持 vdev。这可确保检测和集成顺利完成。对于在 Unraid 中新建的池,支持 vdev 是可选的,大多数用户通常不需要。


扩展存储​

ZFS 功能强大,但重要的是要了解其存储扩展是如何工作的—尤其是在规划未来增长时。

以往,ZFS 的 vdev 宽度是固定的。您无法通过增加磁盘来增加现有 RAIDZ vdev 的大小。

扩展池的方法包括:

  • 添加新 vdev: 通过添加新的 vdev(如新镜像或 RAIDZ 组)来扩展您的池。这增加了容量,但您必须以符合 vdev 配置的方式成组地增加磁盘。
  • 用更大的硬盘替换: 将 vdev 中的每个硬盘逐一更换为更大的磁盘。有关详细程序,请参阅 硬盘更换。当所有硬盘更换完毕并且存储池恢复后,vdev 的容量会增加。
  • 创建新池: 启动一个新的 ZFS 池可将不同的数据类型或工作负载组织并独立管理。
Planning ahead

在建立池之前,考虑您需要多少存储空间 - 不仅是今天,还包括未来的需要。ZFS 在良好规划时会带来回报,特别是当您想要避免以后繁琐的升级时。


在现有 Unraid 服务器上使用 ZFS 池​

如果你运行传统 Unraid array 并希望添加 ZFS 池,以下是一些有效的集成方法:

使用场景描述详细信息/示例
用于 appdata 和 Docker 的快速 SSD/NVMe 池存储 appdata 共享以快速响应的容器和数据库。这支持 snapshots 以便于回滚,还可托管 VMs 以实现高 I/O。许多用户选择 2 驱动 ZFS 镜像。此方式扩展简单并提供强大的性能。
用于重要数据的ZFS池使用 ZFS 镜像或 RAIDZ2 池来存储不可替代的文件,如照片、税务记录和 %%user-share|用户共享%% 数据。%%ZFS|zfs%% 检查腐败并通过冗余自愈。这种设置通过自动的完整性检查和自我修复功能保护关键数据。
每日备份或复制目标使用 ZFS 盘(即便是在 Unraid array 中)作为复制目标。您可以在本地或从另一个 Unraid 服务器复制其他池。利用 zfs send/receive 或诸如 Syncoid 之类的工具,以实现快速可靠的备份和还原。
Snapshot-based recovery pool保持关键数据或容器的时间点 snapshots。snapshots 可以自动安排且节省空间。此功能可以从意外删除或配置错误中快速恢复。

避免常见的 ZFS 错误​

ZFS 是一个强大的文件系统,但有几个常见的陷阱可能削弱其优势。在配置您的池之前,要牢记以下几点以获取更流畅的体验:

  • RAIDZ 内磁盘大小不匹配: ZFS 视 RAIDZ vdev 中所有磁盘为最小磁盘的大小。为了确保最高效,请使用每个 vdev 中大小相同的驱动器。

  • 通过 WebGUI 扩展 RAIDZ vdev: 虽然 Unraid 7.1.x 及更新版本支持通过命令行扩展 RAIDZ,但此功能尚未在 WebGUI 中可用。目前,请通过 CLI 展开或通过 GUI 添加新 vdev。

  • ZFS disk vs. full zpool: A single ZFS-formatted disk in the Unraid array does not offer the redundancy or features of a dedicated ZFS pool. To leverage advanced functionality, use standalone pools.

  • 未满足 RAM 的去重功能: 去重需要大量内存,禁用去重会对性能产生重大影响。只有在完全了解需求的情况下启用去重功能。

  • Vdev 冗余是局部的: ZFS 中的冗余是局部的,不是在整个池上共享。请确保规划 vdev 布局以实现所需的强度。