🚏新手教程:阵列与缓存池
00 分钟
2023-7-28
2024-8-17
type
status
date
slug
summary
tags
category
icon
password
如需技术支持,请点击 👉 联系方式
关于缓存策略的说明,请看:

1、什么是阵列(Array)

阵列是指由多个物理硬盘组成的存储池,它将多个硬盘合并成一个逻辑卷,并提供数据冗余和容错能力。
notion image
Unraid 拓展存储空间很简单,你只需要在“磁盘阵列设备”列表(如上图)添加硬盘即可直接扩展阵列存储池的空间,这一点对于用户的使用是很友好的,也是 Unraid 的卖点之一。
除此之外,Unraid 的阵列还有以下特点:
  1. 容错性:通过在阵列中使用校验盘存储冗余校验信息,即使其中一个硬盘出现故障,也可以恢复数据。当硬盘失败时,系统可以使用校验盘和其他硬盘上的数据来重建丢失的数据。
    1. Unraid 的阵列使用了一种称为“未同步异构冗余”(Unraid Parity)的数据保护机制。其中一个硬盘被用作校验盘(Parity Disk),用于存储数据的冗余校验信息,其余的硬盘则用于存储实际的数据。
  1. 扩展性:Unraid 允许在阵列中添加或移除硬盘,以扩展或缩小存储容量。你可以根据需要随时增加或减少硬盘的数量,而无需重新构建整个阵列。
  1. 异构性:阵列可以由不同容量和型号的硬盘组成,这使得 Unraid 在硬件升级或扩展时更加灵活。你可以根据实际需求混合使用不同的硬盘。
  1. 数据保护:Unraid 的阵列可以提供单个硬盘的容错能力,即使多个硬盘同时发生故障,也只会丢失与故障硬盘相关的数据,而不会影响其他数据。
通过使用 Unraid 的阵列,用户可以构建可靠的、灵活的存储解决方案,以满足个人、家庭或企业的数据存储需求。

2、什么是缓存池(user-definded pool)

简单来说,缓存池相当于是阵列存储池的“文件中转站” —— 当往阵列中写入文件时,会先写入到由 SSD 固态硬盘所组成的缓存池中,然后再借由 Unraid 内部的转移功能(Mover)将缓存池的文件转移到阵列存储池中,从而弥补 Unraid 阵列存储池读写速度较慢的缺点。
除了机械盘自身的读写速度之外,关于 Unraid 阵列存储池读写速度较慢的问题,各位读者可以看我之前写的 《为什么unRAID下载/拷贝文件时CPU占用高:详解FUSE-SHFS、I/O问题和解决办法》文章,里面详细介绍了此问题的前因后果。
这里再补充另一个会造成 Unraid 阵列写入慢的原因 —— 校验盘。由于校验盘的工作机制,数据写入到阵列中的硬盘之后,校验盘会实时的对所有阵列里的硬盘进行奇偶校验,所以当你写入数据到阵列时,你也会发现校验盘也在同步的进行数据写入,校验盘的这一机制某种程度上会造成阵列写入速度变慢的情况。
缓存池在官方文档中的正式书名叫做“用户自定义存储池”(user-definded pool),用户可以创建多个自定义存储池(相当于你可以创建多个缓存池)。
官方的文档中提供了一个 Gif 动态图来介绍缓存池的工作原理:文件 → 缓存池 → 阵列存储池
官方的文档中提供了一个 Gif 动态图来介绍缓存池的工作原理:文件 → 缓存池 → 阵列存储池
缓存池与阵列最大的一个不同之处在于,缓存池能够组 RAID 模式,而阵列是不行的。比如说作者的两块 1T NVME 固态可以实现 Raid0Raid1 模式:
notion image
这就意味着我们完全可以通过缓存池去创建高性能的 RAID 阵列,从而实现高速的读写性能和安全冗余。
总的来说,作者还是比较建议大家去购买固态硬盘来作为缓存池使用,一方面因为目前 SSD 硬盘价格便宜,另一方面添加缓存池所带来的用户体验是明显的。

3、阵列和缓存池之间的关系

💡
2024-08-04 补充:在未来的 Unraid 7.0 版本中,阵列不再是必要项,你可以不创建阵列的情况下去使用 Unraid 系统,因此这一篇文章主要针对的是 6.X 版本下的阵列与缓存池特性,7.0 版本出来之后将缓存池与阵列的逻辑将会发生改变。关于 7.0 版本的内容可以参考博主的《Unraid 7.0 前瞻》这一篇文章。
读者们只需要记住:阵列是 Unraid 的“根”,你可以不用缓存,但你不能不使用阵列。
站在系统逻辑角度,缓存是为阵列服务的,阵列是“主”,缓存为“辅”。但对于用户来说,具体怎么用取决于用户,这也是为什么缓存池的正式名称叫做“用户自定义存储池”(user-definded pool)。
假设你有:
  • 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 将文件转回机械盘。
但从 6.12 版本开始,由于 Unraid 开始支持 ZFS 文件系统,因此我们完全可以将阵列与缓存的主从关系颠倒过来 —— 以缓存为主(将主要的存储空间放到 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、总结

  • Unraid 的阵列是系统存储的“根”,必须要有存储设备给到阵列去使用(最少一个),你可以不用缓存,但不能没有阵列。
  • 缓存池的出现是为了解决 Unraid 读写慢的问题,是为阵列服务的,从这一点上看阵列是“主”,缓存池为“辅”。但在具体的使用上,这完全取决于用户。
  • 阵列与缓存最大的不同在于,缓存池可以组 RAID 模式。根据缓存池硬盘的数量可以实现 常见的 Raid0Raid1Raid5 … 等模式,并且可以组建多个缓存池,因此缓存池也叫做“用户自定义存储池”(user-definded pool)。
  • 从 6.12 开始 Unraid 支持 ZFS 文件系统,因此用户完全可以利用缓存池组建 ZFS 阵列来作为主要的存储空间使用,那么从这个角度上看的话,用户完全可以根据实际需求去转换阵列与缓存两者之间的主次关系。
 

评论