新手教程
🛢️新手教程:详解 Unraid 缓存策略及应用案例
00 分钟
2023-8-15
2024-1-27
type
status
date
slug
summary
tags
category
icon
password
许多刚接触 Unraid 的用户对缓存策略感到困惑,尤其是今年6月份 Unraid 更新后对缓存策略做了调整,使得新手更加不解。为此,本文将深入介绍新旧版本的 Unraid 缓存策略,并提供应用案例与常见问题答疑,帮助读者更深入地理解缓存策略。

1、什么是缓存策略?

缓存策略指的是文件在迁移程序(Mover)作用下如何在阵列和缓存池之间转移的规则
在进行具体的讲解之前,需要说明的是,从 6.12 版本开始关于共享文件夹指定存储池的方式有了概念上的变化,因此缓存策略的使用也跟着有了相应的改变(但本质并没有变)。改动的效果我认为是正向的,逻辑上更清晰,也更符合使用上的直觉。
此改动始于 6.12.0-rc4 版本,可查看此版本的 Releases Note 信息。
由于新版本的变化,本文在介绍缓存策略的使用时会分为两部分去做讲解,分别是系统版本 < 6.12 的使用方式和系统版本 ≥ 6.12 版本的使用方式。
使用缓存策略的前提是得先有缓存池,只有创建了缓存池的情况下才可以在共享文件夹的属性界面去指定缓存策略(点击共享文件夹名字即可进入属性界面)
下面的两张图是不同版本下的缓存策略配置参数界面:
系统版本 < 6.12 下的缓存策略
系统版本 < 6.12 下的缓存策略
系统版本 ≥ 6.12 下的缓存策略
系统版本 ≥ 6.12 下的缓存策略
补充:关于缓存池(User-definded pool),官网上提供了一张动态图来说明其工作原理。
文件先写入到缓存池中,然后再借助相应的机制(Mover)将文件转移到阵列中的硬盘。
文件先写入到缓存池中,然后再借助相应的机制(Mover)将文件转移到阵列中的硬盘。

2、什么是迁移程序(Mover)

notion image
当你在 Unraid 的“主界面”最底部,点击了“移动”之后就会触发迁移程序 Mover其作用是将文件从缓存池转移到阵列,或者从阵列转移到缓存池,又或者不转移文件,最终的结果依据缓存策略而定
Mover 是系统的一个可执行程序,其路径为 /usr/local/bin/mover/usr/local/sbin/mover ,因此除了手动点击网页上的 移动 按钮之外,还可以用命令执行,亦或者借助 计划任务(如上图所示)进行调用,下文的案例三会说明如何设置 Mover 的定时任务。
也就是说,缓存策略影响的是 Mover 转移文件的最终结果,因此利用好缓存策略,我们可以将文件在缓存池和阵列池之间进行流转

3、缓存策略之间的区别

本章节来具体讲解不同缓存策略之间的区别。

3.1、旧版本下的缓存策略

旧版本下(< 6.12)的缓存策略有四个,除了第一个 之外,在你使用其余三个策略中的任意一个时,新写入的文件都会先写入到缓存池中,然后当 Mover 被触发时依据不同的策略将文件在阵列和缓存池之间进行流转(或者不流转)
系统版本 < 6.12 下的缓存策略
系统版本 < 6.12 下的缓存策略
下面是除了 之外不同策略之间的区别:

(1)缓存策略:是(Yes)

当 Mover 被执行后,文件将会从缓存池 → 阵列。
notion image

(2)缓存策略:首选(Prefer)

当 Mover 被执行后,文件将会从阵列 → 缓存池。
跟策略 是(Yes) 刚好相反。
notion image

(3)缓存策略:仅(Only)

当 Mover 被执行后,文件不会进行转移(无事发生)
这种策略的目的是让文件保持在缓存池中,例如系统运行文件,这样就可以利用固态硬盘读写速度快的特性来加速系统服务的运行,在本文第 4 章应用案例一中介绍了这种策略的用途。
notion image

3.2、新版本下的缓存策略

由于 6.12 版本对共享文件夹指定存储空间的方式有了概念上的变更所以缓存策略的配置也有了逻辑上的变化(但本质不变)。
在新版本下(≥ 6.12),当你创建了一个共享文件夹之后,往往需要设置以下三个选项:
notion image
  1. 主存储空间( Primary storage ):顾名思义,是创建新文件和新文件夹时所使用的存储池。主存储空间只有两种类型的选择 —— 阵列和缓存池:
    1. Cache 和 Zpool 分别是两个缓存池。
      CacheZpool 分别是两个缓存池。
  1. 辅助存储( Secondary storage ):只有在主存储空间选择了缓存池之后,辅助存储才可能进行配置,并且只有两个固定选项 —— / 阵列
    1. notion image
      如果你在主存储空间选择了 阵列 ,那么也就相当于不去使用缓存池(此时辅助存储不可设置),换成 6.12 之前版本等价于你选择了
      主存储空间选择了 阵列 的情况下辅助存储为不可设置
      主存储空间选择了 阵列 的情况下辅助存储为不可设置
      等价于在旧版本中选择了 否
      等价于在旧版本中选择了
  1. Mover 动作:只有主存储空间选择了缓存池,辅助存储选择了 阵列 的情况下,Mover 动作才可以进行配置,并且选项只有两个:Cache → 阵列阵列 → Cache
    1. 只有 ① + ② 才可能开启 ③ 的设置
      只有 ① + ② 才可能开启 ③ 的设置
      Cache → 阵列 等同于旧版本的 阵列 → Cache 等同于旧版本的 首选
      notion image
      如果主存储空间选择了缓存池,辅助存储设置为 ,那么等同于旧版本下的 策略:
      表示只使用缓存池
      表示只使用缓存池
      等同于在旧版本下的 仅 。
      等同于在旧版本下的
上面的内容可能有些零碎,不好理解,但其实逻辑很简单,这里我做个总结:
  • 新版下多出了两个概念 —— 主存储空间和辅助存储,作用顾名思义。
  • 主存储空间可以选择阵列或者缓存池。选择 阵列 就表示新创建或新写入的文件都会存储到阵列中,也就表示不去使用缓存池,这就相当于在旧版本的缓存策略中选择
    • 主存储空间选择 阵列 。
      主存储空间选择 阵列
  • 如果主存储空间选择了缓存池,那就意味着你可以去使用缓存策略,如果以旧版本的缓存策略为依照去对比,那会对应的逻辑如下:
    • 请读者体会设置上的逻辑,你会发现这其实是符合使用直觉的。
    • 是(Yes) :主存储空间选择缓存池,辅助存储选择 阵列 ,Mover 动作选择 Cache → 阵列
      • notion image
    • 首选(Prefer) :主存储空间选择缓存池,辅助存储选择 阵列 ,Mover 动作选择 阵列 → Cache
      • notion image
    • 仅(Only) :主存储空间选择缓存池,辅助存储选择
      • notion image
其实可以看到,在新版本下存储池与缓存策略的设置都更人性化,逻辑上也更符合直觉。

4、应用案例

理论用于实际中才能更好的理解其含义,本章节作者将介绍几种不同场景下,使用缓存策略来实现文件目的的案例。

4.1、案例一:将系统运行文件放到缓存中进行加速

例如,我们可以将 Unraid 上的 appdatasystem 这两个文件夹放到缓存池中进行加速(其他文件夹同理)。
  • appdata 文件夹存储了 Docker 容器的配置文件,把此文件夹放到缓存池中可以为 Docker 容器的运行进行加速。
  • system 文件夹存储了 Docker 服务和虚拟机服务的 .img 镜像文件,放到缓存池同样可以提高系统的运行速度。
假设这两个文件夹目前都存储在阵列中,要将他们转移到缓存池里面就需要:
  • 在转移文件前,需要先把所有的 Docker 和虚拟机都停止运行,然后分别在“设置 - Docker”和“设置 - 虚拟机”中将 Docker 和虚拟机的服务都关闭。那是因为如果一个文件正在被占用,那么 Mover 程序是没办法将此文件进行转移的,关闭 Docker 和虚拟机的系统服务就是为了能够将这两个服务所使用的相关文件进行转移。
  • 旧版本( < 6.12 ):在 appdatasystem 共享文件夹的属性设置中,将缓存策略设置为 首选(Prefer)
    • notion image
  • 新版本( ≥ 6.12 ):主存储空间设置为缓存池,辅助存储设置为 阵列 ,Mover 动作选择 阵列 → Cache
    • notion image
最后,在主页面点击 移动 即可触发 Mover 程序的执行,来将 appdatasystem 文件夹转移到缓存池中。
当文件转移完成之后,你可以考虑将 appdatasystem 这两个共享文件夹的缓存策略设置为 仅(Only) ,这样可以保证这两个文件夹内的文件会一直保存在缓存池中,并且后续有新文件写入时也只会写入到缓存池。但也请注意,如果你的缓存池没有组 Raid 阵列来实现数据冗余,那么里面的数据无法得到保护,请谨慎使用 仅(Only) 策略。
notion image

4.2、案例二:我需要更换缓存盘,缓存盘里面的文件要怎么转移?

在这种去情况下,我们的目标是将缓存池里面的文件转移回阵列中,当缓存池的文件都转移走之后,我们就可以放心的把缓存盘换下来,替换上新的缓存盘。
这时候我们需要:
  • 停止相关的服务:例如把 Docker 和虚拟机都停掉(包括在设置中停止 Docker 和虚拟机服务),防止相关的文件被占用而无法转移。
  • 旧版本(< 6.12):将缓存池中对应的共享文件夹缓存策略设置为 是(Yes)
    • notion image
  • 新版本(≥ 6.12):主存储空间设置为缓存池,辅助存储设置为阵列,Mover 动作选择 Cache → 阵列
    • notion image
最后,在主页面点击 移动 即可触发 Mover 程序的执行,来将对应的共享文件夹内的文件转移到阵列中。
notion image
当文件都转移走之后,你就可以插上新的硬盘,然后还需要在“设置 - 新配置”中创建一个新的配置,最后在缓存池的硬盘选择列表中,将需要替换的那个盘更改为新的硬盘即可:
notion image
notion image

4.3、如何利用缓存盘为 BT / PT 下载提供加速?

相信大多数 NAS 用户都会用到 qBittorrent 或者 Transmission 等下载工具,由于 P2P 下载的特性,固态硬盘在这种使用场景下要比机械硬盘更能胜任此工作。
多数时候,固态硬盘的容量要比机械硬盘小得多,因此随着下载任务的增加,缓存池的空间往往会消耗的比较快,所以我们这时候就需要定期的将缓存池的文件转移回阵列中,以此来腾出空间给其他的任务进行下载,保证缓存池永远有一定的可用空间来实现下载加速。
💡
注意 前面提到过,如果一个文件正在被占用,那么 Mover 程序是没办将这个文件进行转移的。对应到这里的 P2P 下载场景中,假设一个种子文件正在下载或者正在做种,那么 Mover 程序将无法转移此文件。解决办法很简单,那就是暂停需要转移文件的下载任务或者做种任务,然后再执行 Mover 程序进行转移。当然这种办法并不便捷,后续博主会更新另一篇文章来介绍如何通过脚本去暂停 QB 的特定任务并调用 Mover 去转移种子文件。
在这种情况下:
  • 旧版本(< 6.12):将用于下载的共享文件夹缓存策略设置为 是(Yes)
    • notion image
  • 新版本(≥ 6.12):主存储空间设置为缓存池,辅助存储设置为阵列,Mover 动作选择 Cache → 阵列
    • notion image
  • 设置计划任务,定时执行 Mover 来将文件从缓存池转移到阵列中:
    • notion image
      notion image

5、常见问题

Q:如果缓存池满了,那么写入文件时会发生什么?

A:假如缓存池满了,那么往设置了缓存策略的共享文件夹中写入新文件时,文件会直接写入到阵列中。
但需要注意的是,如果共享文件夹的策略设置为了 Only (对应到新版本:主存储空间设置为缓存池,并且不设置辅助存储),那么当写入新文件时会提示存储空间不足而无法写入文件。

Q:为什么我执行了 Mover 程序,文件还是没有转移?

A:很大概率是因为文件正在被占用,因此无法转移。
这种情况下就需要检查是哪些程序占用了文件,例如是否是 QB 或者 Transmission 正在下载文件或者在做种导致无法转移,找到对应的程序后把程序停止,然后再去转移即可。
为了保险起见,可以将所有 Docker 和虚拟机都关闭之后再去转移文件。

Q为什么会有个别文件没有转移?

A:可能是因为缓存池与阵列中同时存在同名文件。
假设你发现大部分文件都转移了的情况下,仍有个别文件依然没有进行转移,那么很可能是因为这个文件同时存在阵列和缓存池中,也就是说可能有两份一摸一样的文件分别存在阵列和缓存池中,这样导致了文件没有“转移”的错觉。
当然也有可能这两个文件因为是同名的关系而无法转移,这时候就需要你去判断这两个文件是不是同一个文件,还是说一个是新的一个是旧的,然后你就需要删掉旧的那一个来让新的那一个得到转移。

Q:我没有缓存盘,我如何将阵列中某个硬盘的文件转移到另一个硬盘中?

A:这种情况下你可以使用一个叫做 unBALANCE 的插件。
具体的使用方法请看博主的另一篇文章《unBALANCE 文件转移工具使用方法和应用案例介绍》
notion image
notion image

Q:缓存池根目录放一个文件,这个文件会不会被转移?

A:不能。
因为缓存策略针对的是共享文件夹,如果这个文件不是存放在共享文件夹,而是比如说存放在缓存池的根目录,那么这个文件是不会被转移的。
 

评论