跳到主要内容

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,以获得双重优势。

:::

备注

The hybrid ZFS-in-array approach is helpful for specific backup or replication scenarios but is not a replacement for a full ZFS pool. ZFS disks in the array are managed individually; you do not get the combined performance, redundancy, or self-healing of a true multi-disk ZFS pool. For full ZFS functionality, always use dedicated ZFS pools.

池、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. 将文件系统类型设置为 zfszfs-encrypted(用于 LUKS 加密)。

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

在最终确定之前,检查关于分配配置文件和拓扑结构的章节以做出明智的选择。

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

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

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

What this enables
  • %%Parity Protection%%: ZFS 磁盘由 Unraid 的 array parity 保护,确保您的数据免受单个(或多个,取决于您的 parity drives)磁盘故障的影响。

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

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

ZFS 磁盘添加到 array:

  1. WebGUI 中转到 Main 标签。
  2. 停止array
  3. 点击阵列设备下的空槽。
  4. 选择您要添加的磁盘。

  1. 文件系统 下,选择 zfszfs-encrypted

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

选择分配配置文件

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

配置冗余性能扩展空间效率典型用例
条带快,但风险大增加更多磁盘100%临时/临时存储
镜像1:1(RAID 1 样式)对于随机 I/O 表现出色增加更多镜像50%高性能,易于扩展
RAIDZ1每个 vdev 1 个盘在处理大文件时速度快。不适合小文件或随机写入。增加新的 vdev通用用途,1 盘容错
RAIDZ2每个 vdev 2 个盘与 Z1 类似,但写入略慢(额外的奇偶校验)增加新的 vdev中等重要数据,2 盘容错
RAIDZ3每个 vdev 3 个盘与 Z2 类似,写入更多负担(最大安全性)增加新的 vdev任务关键型,3 盘容错
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 压缩。这是一种安全和高效的方式,并且对兼容性或稳定性几乎没有影响。

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池将无法导入或无法使用These vdevs store critical metadata or deduplication tables. Without them, ZFS cannot safely mount the pool.
日志(SLOG)vdev池导入,但同步写入性能下降。池仍然可访问,但你可能会注意到依赖同步写入的工作负载的性能变慢。
缓存(L2ARC)vdev池导入,但读取缓存丢失池正常工作,但您将失去 L2ARC 缓存带来的性能提升。没有数据丢失。
提示

Always assign every physical drive from your original ZFS pool, including all support vdevs, when importing into Unraid. This ensures smooth detection and integration. For new pools created in Unraid, support vdevs are optional and generally not needed for most users.


扩展存储

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

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

扩展池的方法包括:

  • 添加新 vdev: 通过添加新的 vdev(如新镜像或 RAIDZ 组)来扩展您的池。这增加了容量,但您必须以符合 vdev 配置的方式成组地增加磁盘。
  • 用更大的磁盘替换驱动: 一次替换每个 vdev 驱动为更大的磁盘。请参阅 驱动替换 以获取详尽步骤。在所有驱动替换并且池解析之后,vdev 的容量将增加。
  • 创建新池: 启动一个新的 ZFS 池可将不同的数据类型或工作负载组织并独立管理。
Planning ahead

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


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

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

使用场景描述详细信息/示例
用于 appdata 和 Docker 的快速 SSD/NVMe 池Store the appdata share for fast, responsive containers and databases. This supports snapshots for easy rollbacks and can also host VMs for high I/O.许多用户选择 2 驱动 ZFS 镜像。此方式扩展简单并提供强大的性能。
用于重要数据的ZFS使用 ZFS 镜像或 RAIDZ2 池来存储不可替代的文件,如照片、税务记录和 %%user-share|用户共享%% 数据。%%ZFS|zfs%% 检查腐败并通过冗余自愈。这种设置通过自动的完整性检查和自我修复功能保护关键数据。
每日备份或复制目标使用 ZFS 盘(即便是在 Unraid array 中)作为复制目标。您可以在本地或从另一个 Unraid 服务器复制其他池。利用 zfs send/receive 或诸如 Syncoid 之类的工具,以实现快速可靠的备份和还原。
Snapshot-based recovery poolKeep point-in-time snapshots of critical data or containers. snapshots can be auto-scheduled and are space-efficient.此功能可以从意外删除或配置错误中快速恢复。

避免常见的 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 布局以实现所需的强度。