Lazy loaded image
🚏新手教程:阵列与池
字数 4335阅读时长 11 分钟
2023-7-28
2025-3-26
type
status
date
slug
summary
tags
category
icon
password
如需技术支持,请点击 👉 联系方式
在数据存储与管理的世界中,Unraid 系统以其灵活性和独特的架构设计脱颖而出。不同于传统 RAID 技术的局限性,Unraid 通过阵列(Array)池(用户自定义池 User-defined pool)两大核心组件,构建了一个既能保障数据安全、又能提升操作效率的混合存储体系。
在本文,博主将为读者介绍什么是阵列、什么是缓存池以及这两者之间的区别,让大家对 Unraid 管理和使用物理存储有一个清晰的认识。

1、什么是阵列(Array)

阵列(Array)是指由多个物理硬盘组成的存储池,它将多个硬盘合并成一个逻辑存储池,并可以提供数据冗余能力。在初始化 Unraid 的时候,你可以看到如下图的阵列配置(磁盘阵列设备列表):
notion image
在阵列中,用户可以随意添加不同品牌、不同容量和不同类型的存储设备,进而灵活地使用和伸缩存储池大小。这也是 Unraid 与常规 RAID 阵列最大的不同,RAID 存储池如果需要伸缩存储空间,那么往往需要重建 RAID 阵列(摧毁现有数据并重组)。
Unraid 组建阵列十分简单:如下图所示(虚拟化演示环境),在添加了两块 50G 的硬盘到阵列,格式化并启动阵列之后,就可以得到一个总大小为 100G 的阵列存储池:
notion image
notion image
notion image
组建好阵列之后,用户就可以通过创建 用户共享 来使用存储池了:
notion image
需要说明的是,在 6.X 版本中,用户必须创建并启动阵列之后,才可以去使用诸如 Docker 和虚拟化等核心功能。换句话说,Unraid 上的核心功能依赖于阵列,没有阵列就无法进一步使用 Unraid 。但从 2025 年开始,7.X 版本中,阵列不再是必选项,用户无需创建阵列的情况下也可以正常使用其他的功能。而关于 7.X 版本的内容将会在其他的文章中进行介绍。
总的来说,Unraid 的阵列具有以下特点:
  1. 容错性:通过在阵列中使用校验盘(Parity)存储冗余校验信息,即使其中一个硬盘出现故障,也可以恢复数据。当硬盘失败时,系统可以使用校验盘和其他硬盘上的数据来重建丢失的数据。关于校验盘的详细作用,请参《新手教程:什么是校验盘,校验盘有什么作用 》
  1. 扩展性:Unraid 允许在阵列中添加或移除硬盘,以扩展或缩小存储容量。你可以根据需要随时增加或减少硬盘的数量,而无需重新构建整个阵列。
  1. 异构性:阵列可以由不同容量和型号的硬盘组成,这使得 Unraid 在硬件升级或扩展时更加灵活。你可以根据实际需求混合使用不同的硬盘,这一点对 RAID 阵列来说往往是不允许/不建议的。
  1. 文件系统独立:阵列中的每一块存储盘都可以拥有自己独立的文件系统,这也意味着如果某一个数据盘出现了故障,那么不会影响到其他的数据盘。同时,这也意味着你可以把其他 linux 系统上面的数据盘直接丢到 Unraid 的阵列中直接使用,只要这些文件系统受到 Unraid 的支持(例如 xfsvfatbtrfszfs 甚至 NTFS 等等常见的文件系统)。

2、什么是池(用户自定义池 User-defined pool

Unraid 的阵列是一种创新性的功能,虽具备了多种优点,但是与此同时它也存在较为明显的缺点——写入速度慢。
Unraid 的写入速度较慢的主要原因是因为它的数据存储方式与传统的 RAID 不同。Unraid 的数据不是条带化(striped)进行存储,而是每个文件单独存储在一个磁盘上。并且,当存在校验盘的情况下,当你写入数据到阵列时,Unraid 不仅要将数据写入目标磁盘,还需要同时更新奇偶校验(parity)信息到校验盘中。这意味着每次写入操作都需要同时修改两个设备(数据盘和奇偶校验盘),从而导致写入速度比读取速度慢很多,通常只有读取速度的 30% 到 40% 。
关于 Unraid 阵列存储池写入速度较慢的问题还有另一个原因 —— SHFS overhead,各位读者有兴趣的,可以通过这篇文章了解:《为什么unRAID下载/拷贝文件时CPU占用高:详解FUSE-SHFS、I/O问题和解决办法》
为了缓解这个问题,Unraid 引入了缓存池(Cache),“池”作为阵列之外的第二个存储功能正式被引入。和其他的 NAS 系统相类似,缓存池的作用相当于文件的“中转站”——文件通常先存储到缓存池中,然后再依据一定的条件转移到其他的存储设备,起到“中转”的作用。这样可以提高写入速度,尤其是在网络传输速度较快的情况下。
“缓存”的功能在各大 NAS 系统中都有体现,例如群晖也有组建缓存池的功能,但与 Unraid 的缓存池功能存在较大的差别。
在实现方式和使用场景上,两者存在一定的区别:

1. 设计理念和用途

  • 群晖的缓存池
    • 群晖的缓存池主要用于加速特定存储池的读写性能,尤其是在频繁访问的场景下(如虚拟机、数据库、多人协作等)。
    • 缓存池通常由 SSD 组成,分为读缓存(Read Cache)写缓存(Write Cache),可以显著提升 I/O 性能。
    • 缓存池是作为存储池的辅助功能,不能独立作为存储池使用。
  • Unraid 的缓存池
    • Unraid 的缓存池不仅可以用于加速性能,还可以作为临时存储区域,用于存放新写入的数据,之后再将其移动到主阵列中。
    • 缓存池在 Unraid 中是一个独立的存储池,可以用于存储特定共享文件夹的数据,或者作为应用程序的存储区域。
    • Unraid 的缓存池设计更灵活,用户可以选择是否将数据从缓存池移动到主阵列。

2. 缓存机制

  • 群晖的缓存池
    • 群晖的缓存池支持读缓存写缓存
    • 读缓存:缓存频繁读取的数据,减少从机械硬盘读取的次数。
    • 写缓存:先将数据写入 SSD 缓存,再异步写入主存储池,提升写入速度。
    • 缓存池的容量通常较小(如 128GB、256GB),主要用于热点数据加速。
  • Unraid 的缓存池
    • Unraid 的缓存池通常用于存储新写入的数据,用户可以选择是否将数据移动到主阵列。
    • 缓存池的容量可以较大,甚至可以作为独立的存储区域使用。
    • Unraid 的缓存池不区分读缓存和写缓存,而是作为一个独立的存储层。

3. 数据管理

  • 群晖的缓存池
    • 缓存池中的数据是临时性的,主要用于加速访问,缓存策略由系统自动管理。
    • 缓存池中的数据不会长期保留,系统会根据访问频率自动调整缓存内容。
  • Unraid 的缓存池
    • 缓存池中的数据可以长期保留,用户可以选择是否将数据移动到主阵列。
    • Unraid 提供了“Mover”工具,可以定期将缓存池中的数据移动到主阵列中。

4. 灵活性和配置

  • 群晖的缓存池
    • 缓存池的配置较为固定,主要用于加速特定存储池的性能。
    • 用户无法直接将缓存池用作独立的存储区域。
  • Unraid 的缓存池
    • 缓存池的配置更加灵活,可以作为独立的存储池使用,也可以用于加速性能。
    • 用户可以根据需求选择缓存池的用途,甚至可以完全依赖缓存池存储数据。

5. 硬件要求

  • 群晖的缓存池
    • 需要支持 SSD 缓存的群晖设备,通常需要特定的 SSD 型号和数量(如至少 1 个 SSD 用于读缓存,2 个 SSD 用于写缓存)。
  • Unraid 的缓存池
    • 对硬件的要求较低,用户可以使用任何类型的 SSD 或硬盘作为缓存池,配置更加自由。

6. 数据保护

  • 群晖的缓存池
    • 写缓存通常需要至少 2 个 SSD 以提供冗余保护,防止单点故障导致数据丢失。
  • Unraid 的缓存池
    • 缓存池可以配置为 RAID 1 或其他冗余模式,但默认情况下没有冗余保护,用户需要手动配置。

总结

  • 群晖的缓存池:主要专注于性能加速,缓存池是存储池的辅助功能,设计较为固定。
  • Unraid 的缓存池:更灵活,既可以用于性能加速,也可以作为独立的存储区域,用户可以自由配置和管理。
选择哪种缓存池功能取决于你的具体需求。如果你需要专注于性能加速,群晖的缓存池可能更适合;如果你需要更灵活的数据管理和存储方案,Unraid 的缓存池可能更符合你的要求。
在 Unraid 6.9.0 之前,缓存池有且只能有一个,并且名称固定为 cache (缓存);在 Unraid 6.9.0 及之后,用户可以创建多个存储池,并且这些缓存池的名称可以自定义(但需遵守命名规则)。而到了 7 版本,用户可以直接在不使用阵列的情况下单独使用缓存池,这在 6 版本是不行的。因此,“池”已不再局限于“缓存”这一应用场景,它的概念已经进一步扩大,因此将“池”称之为“用户自定义池(User-defined pool)”会更符合实际。
简单来说,“池”在 Unraid 的早期版本主要起到缓存的作用,但随着系统版本的发展,“池”已经不再局限于“缓存”,用户既可以将“池”替代“阵列”作为主存储池使用,也可以继续用于缓存的目的进行文件中转加速。并且,如果一个“池”还不够,用户还可以创建多个“池”用于多种用途。因此在如今,我认为将“池”统称为“用户自定义池”会更符合当下的语境。
官方的文档中提供了一个 Gif 动态图来介绍缓存池的工作原理:文件 → 缓存池 → 阵列存储池
官方的文档中提供了一个 Gif 动态图来介绍缓存池的工作原理:文件 → 缓存池 → 阵列存储池
用户自定义池与阵列最大的一个不同之处在于,用户自定义池能够组 RAID 模式,而阵列不具备这一功能。比如说作者的两块 1T NVME 固态可以实现 Raid0Raid1 模式:
假如有3块盘,那么还可以实现 RAID 5 模式。
假如有3块盘,那么还可以实现 RAID 5 模式。
这就意味着我们完全可以通过用户自定义池去创建高性能的 RAID 阵列,从而实现高速的读写性能和数据冗余。

3、阵列和用户自定义池之间的关系

在 6 版本中,阵列是 Unraid 的“根”,你可以不用池,但你不能不使用阵列;而在 7 版本,用户可以不使用阵列的情况下单独去使用池。Unraid 系统发展到如今,池的应用场景相对过去已经扩大了很多,下面我会举实际的例子方便大家理解阵列和池之间的关联。

3.1 缓存池

假设你有:
  • 3 x 16T 机械硬盘。
  • 2 x NVME 1T 固态。
  • 1 x 4T 和 1 x 2T 硬盘。
在传统的 Unraid 的存储规划中,习惯将所有机械硬盘都放到阵列中,然后将固态硬盘来作为缓存盘使用:
  • 阵列存储:(3 x 16T) + 4T + 2T = 54T 可用空间。
  • 缓存池:2 x 1T 组 Raid1 阵列 = 1T 可用空间。
你将得到一个阵列存储空间为 54T 、缓存空间为 1T 的总存储空间。当我们需要拷贝或者下载文件到 Unraid 上时,我们可以借助缓存盘实现高速的传输速度,然后再借由 Mover 将文件转回机械盘。
在这个例子中,缓存池主要为阵列服务,起到一个中转的作用。

3.2 高性能存储池

还是以上面的存储设备为例,我们可以创建一个高性能的住存储池,例如组建一个 ZFS 阵列:
  • ZFS 池:我们将 3 块 16T 的硬盘组成一个 Raiz1 模式的 ZFS 缓存池,可用空间为 2 x 16 = 32T 。借助 ZFS 文件系统的特性,可以实现快照、压缩等功能,并且由于可以组 Raid 阵列模式,读写速度也得到了成倍的提高。
    • 关于 ZFS 的更多资料,大家可以看作者的 ZFS 教程
  • 阵列存储:此时我们剩下 4T、2T 的机械硬盘各一个,所以你可以选择把其中一个或者全部放到阵列里作为阵列存储(获取拿去直通给虚拟机什么的都可以)。
  • 其余缓存:此时还有两个 1T 的 NVME 固态,这时候你可以选择继续拿去做另一缓存池,甚至你也可以加进阵列存储中或者拿去直通,这些都随你。
这里以作者的存储结构为例:
notion image
  • 阵列:一个校验盘,一个存储盘,阵列总可用空间为 16T 。
    • 池 1 (名为 cache):2 x 1T NVME 固态组成 Raid1 阵列,来作为下载盘使用。
    • 池 2 (名为 zpool):3 x 4T 机械硬盘组成 ZFS Raiz1 阵列,可用空间为 8T(另外一个 4T 作为冗余盘),来为重要数据、服务运行配置文件、虚拟机虚拟硬盘等提供存储(当然也可以作为下载盘使用,具体怎么用都随用户定义),因为可以使用 ZFS 的快照、压缩、ROW 等功能,所以可以为数据提供更好的安全保证。

4、总结

  • 6.X 版本,Unraid 的阵列是系统存储的“根”,必须要有存储设备给到阵列去使用(最少一个),你可以不用缓存,但不能没有阵列。
  • 缓存池的出现是为了解决 Unraid 读写慢的问题,是为阵列服务的,从这一点上看阵列是“主”,缓存池为“辅”。但在具体的使用上,这完全取决于用户。
  • 阵列与池最大的不同在于,缓存池可以组 RAID 模式。根据缓存池硬盘的数量可以实现 常见的 Raid0Raid1Raid5 … 等模式,并且可以组建多个池。因此在当下,将池称之为“用户自定义存储池”(user-definded pool)会更符合实际。
 
上一篇
新手教程:如何在手机管理unRAID上的文件
下一篇
新手教程:如何在 unRAID 上正确安装 Docker

评论
Loading...