我真的需要 ZIL SLOG 吗?

我真的需要 ZIL SLOG 吗?

我正在构建一个用于家庭/个人用途的 NAS,它将使用 ZFS(可能运行 FreeNAS)而不是 SATA SSD 阵列。就使用情况而言,我预计系统会经常处于“空闲”状态(不计算 ZFS 后台内容,例如清理),并且我预计主要的性能瓶颈是 1Gb 以太网。

我对 ZIL 有点熟悉,但对 SLOG/辅助 ZIL 存储设备的使用感到困惑。

该系统将使用 UPS,因此它更有可能出现类似内核崩溃的情况,而不是系统突然断电。无论如何,只要它不耗尽我的池,我并不特别担心灾难性事件可能导致最后几分钟的数据丢失。(请记住,这是一个家庭系统,而不是任务关键型系统。)

具体来说,是否可以只将主 ZIL 放在 RAM 中(这会对“安全”产生什么影响)?如果我没有专用的 SLOG 设备,是否意味着我被迫使用存储池来存储 SLOG,这会带来什么实际影响(性能和磨损)?如果我需要专用设备,高性能 NVMe SSD(例如中等尺寸的 WD Black SN750)是否足够,还是我真的需要花 250 美元购买英特尔 900p?(见更新)

我能找到的大部分信息都说“是的,250 美元 900 便士是绝对重要“,但并没有真正解释如果我省略它我会处于什么情况。

更新:

因此,我读到的大部分内容是:a) 将 ZIL 放在主池上很糟糕(性能减半,对于 SSD 来说更糟糕的是,写入次数翻倍),以及 b) “需要” ZIL 的主要原因是为了减少同步写入的延迟。鉴于我的池是全 SSD(尽管是 SATA,但另一方面,我的用户都受到 1Gb LAN 的限制),似乎我有三个选择:

  • 添加 SLOG。我的理解是,任何非 PLP 设备都比无用更糟糕(至少比后面的两个选项更糟糕),但理论上,我可以使用 Intel 900p,它似乎是最便宜的选择。
  • 使用仅 RAM 的 ZIL。(基本上,在同步方面撒谎。)虽然这“听起来”很糟糕,但据我所知,它不会影响正直就我的池子和我的用途而言,我不确定是否值得额外花费。任何故障都有可能让我丢失数据,因为 NAS 处于离线状态。最有可能的是,我会立即知道出了问题,并能够采取某种补救措施(例如,暂时保存到其他位置,直到我可以恢复 NAS)。
  • 不要使用 ZIL;强制所有写入直接进入磁盘。虽然这会降低旋转式 Rust 的性能,但目前尚不清楚 ZIL 是否适用于全 SSD 系统,因为使其适用于旋转式 Rust 的主要问题(驱动器速度较慢、寻道延迟)并不适用。

至于选项 2,我见过有人在帖子中指出“数据完整性就是数据完整性”……但实际上,它不是。丢失我刚刚尝试写入的任何文件(并且可能立即知道出了问题),而我很有可能能够以某种方式手动恢复,与丢失几个月或几年前创建的文件之间存在显着差异。我可以看到,一般来说,这两种情况都有可能发生,但就我而言,我更关心档案的完整性。

答案1

感谢 user121391 的回答。我想跟进一点,但比评论允许的更详细。

我的理解是,任何非 PLP 设备都比无用的设备更糟糕 [...]

ZIL 的目的是提供同步写入的保证,而无需实际执行同步写入的开销(和其他问题)。

实际的同步写入可能很慢(因为写入“较慢”的主存储池)并且效率较低,因为无法等待并批量写入。前者对于 SSD 池来说不是什么大问题,但后者可能很重要,特别是当应用程序执行一些不正常的操作时,例如一次将几个字节写入文件然后发出同步。

ZIL 旨在成为一个“安全”的写入缓冲区,记录待处理的写入日志,以便在发生故障(断电、内核崩溃等)时不会丢失写入。如果没有单独的 ZIL 设备(“SLOG”),ZIL 通常会镜像到主存储池,这当然很慢。这也意味着写入次数增加一倍,对于 SSD 池来说,这是很糟糕的。

这给我们留下了四个选择,它们与我的问题中的选择大多相似:

  • 禁用 ZIL 并直接写入池。
  • 使用非 PLP SLOG。
  • 使用 PLP SLOG。
  • 仅将 ZIL 保存在 RAM 中。

在这里,我只关心为什么 #2 比其他任何选项都差...更准确地说,它严格来说比 #4 差。(但事实并非如此,但我们会回到这个问题上。)

ZIL 是一个经常写入但几乎从不读取的缓冲区。只有在系统严重宕机(例如断电、内核崩溃等)时才会读取 ZIL。在这种情况下,ZIL 用于重建用户/应用程序确信已安全提交到磁盘但实际上并未提交的写入。

从安全角度来看,至关重要的是,一旦 ZIL SLOG 报告数据已被写入,它确实已经写好了。但是,非 PLP 设备通常使用内部(硬件)缓存并对此撒谎。因此,如果系统突然停机,非 PLP 设备可能会损坏 ZIL,就像 RAM 中的 ZIL 会丢失一样。因此,如果发生电源故障,非 PLP SLOG 可能会面临严重的风险,即与仅将 ZIL 保存在 RAM 中相比,它没有任何优势。

另一方面,如果系统因其他原因而停机,非 PLP ZIL 有望在系统断电之前完成写入(如果确实发生这种情况;我不确定硬件是否会注意到软重置),因此仍将保护池。因此,廉价的 SSD 比仅 RAM 的 ZIL 更好,但仅适用于系统停机但未断电的情况。如果断电,非 PLP ZIL 与仅 RAM 的 ZIL 一样危险,但它也慢点比仅限 RAM 的 ZIL 更佳;具有使用带有 PLP 的 SLOG 的所有缺点,但仅具有部分优点。

英特尔傲腾 (Optane) 提出了一个有趣的案例;虽然它在技术上没有 PLP,但理论上它同样安全,没有需要PLP。原因可以追溯到我们为什么需要 PLP;驱动器具有内部缓存,并谎称同步写入以提高性能。据我所知,Optane 没有缓存,因此当 ZFS 对 ZIL 进行同步写入时(然后才向用户/应用程序报告同步已完成),写入确实安全地投入到设备上。

Optane 很有趣(阅读:制造非常好在其他方面,它可能是 SLOG 的选择。虽然它在纸面上可能不是最快的,但它低延迟,据我所知,这是 ZIL 性能最重要的因素。900p 也绝对令人惊叹的写入耐久性(5.1 PBW 是我见过的最接近的竞争对手的 3.5 倍,是其价格范围内大多数“传统”SSD 的 8 倍,与价格只有其三分之一的 800P 相比更是高达 24 倍)。再加上它在旨在模拟 ZIL 的基准测试中往往胜过其他所有产品,选择实际上归结为我最初问题中的那些:a) 900P,b) 仅 RAM,或 c) 禁用 ZIL。

...最后一个可能在性能方面不错,但是驱动耐久性方面让我感到不安。

答案2

首先:这篇文章写得很好,研究透彻!您自己已经找到了很多答案,所以我只是补充了一些想法。


我的建议是:试试看。购买最小可行配置(仅池磁盘)并进行设置,然后使用它并检查它是否足够快(如果您不直接从它那里为虚拟机提供服务,我的猜测是“是”)。

如果没有,则添加单独的设备。您可以根据需要添加和删除任意数量的设备(镜像),而不会破坏池。

您还应该评估为什么需要特定的全 SSD 设计。这样每 GB 的成本会更高,而且很可能浪费您的需求(有关详细信息,请参阅此答案的最后一段)。另一方面,如果您的目标是小尺寸的静音和简单性,那么这将是一个可行的替代方案,在这种情况下,我个人不会因为成本而投资单独的日志设备(无论如何性能都很好)。


添加 SLOG。我的理解是,任何非 PLP 设备都比无用更糟糕(至少比后面的两个选项更糟糕),但理论上,我可以使用 Intel 900p,它似乎是最便宜的选择。

这取决于设备和具体情况……一般来说,建议使用 PLP,因为在 5000 美元的存储阵列上,选择劣质 SSD 时节省 50 美元是没有用的,因为出现问题的微小概率是不值得的。特别是当您不需要大容量 SSD 时,几 GB 就足够了。但如果一个磁盘发生故障而另一个磁盘没有发生故障,或者没有在相同的扇区发生故障(取决于磁盘/设备上的控制器),那么您就没事了。问题是,没有人能保证这一点,所以您尝试添加安全措施并降低风险。

您可以将其与池设计进行比较。单个磁盘很便宜,但如果出现问题,您就完蛋了。现在您可以购买一个更好的磁盘,或者两个便宜的磁盘,或者两个更好的磁盘,或者三个便宜的磁盘等等……最后您必须计算您的风险并将其与您的预算相平衡。在大多数情况下,极端情况都是不好的(单个便宜的磁盘与可用的最佳磁盘的 32 路镜像),因此通常建议采取健康的中间立场(对于小型部署,这将是双向镜像,对于大型部署,这将是三向镜像)。

您的 SLOG 设备只需要三样东西:

  1. 比最弱的池磁盘具有更好的持续 IOPS。如果 SLOG 设备速度较慢,您最好只使用没有它的池,或者甚至将其作为另一个镜像添加到池中(速度较慢,但​​更安全)。

  2. 高写入耐久性。如果写入耐久性较低,则必须尽快更换。对于您而言,这应该没有太大影响,因为无论哪种方式,写入量都会非常低,并且可以在几天后添加第二个磁盘来错开更换时间。

  3. 可靠性,决定了发生严重故障的可能性。可以通过使用多个磁盘(镜像)、使用 PLP、使用优质磁盘(或同时使用这三种磁盘,见上文)来提高可靠性。同样,这取决于池磁盘的速度(随机 IOPS)。

使用仅 RAM 的 ZIL。(基本上,在同步方面撒谎。)虽然这“听起来”很糟糕,但据我所知,它不会影响我的池的完整性,而且就我的使用而言,我不确定它是否值得额外的花费。任何类型的故障都可能导致我丢失数据,因为 NAS 处于离线状态。最有可能的是,我会立即知道出了问题,并能够采取某种补救措施(例如,暂时保存到其他位置,直到我可以恢复 NAS)。

仅当您在其上运行专门的应用程序并且知道它不能完全信任存储时我才会这样做 - 例如在多镜像(其他存储节点)设置中,定期同步会检测到暂时关闭的节点中的任何错误。

如果您只有一台机器,那么您将获得廉价的性能,但风险却大大增加。一次不干净的意外关机(按下按钮或孩子扯下 UPS 的电缆等)可能会带来风险,并且肯定会影响您的安心。

不要使用 ZIL;强制所有写入直接进入磁盘。虽然这会降低旋转式 Rust 的性能,但目前尚不清楚 ZIL 是否适用于全 SSD 系统,因为使其适用于旋转式 Rust 的主要问题(驱动器速度较慢、寻道延迟)并不适用。

它只会影响那些特殊同步随机写入的性能......您没有说明该机器的用途,但如果我想象典型的家庭用途,那么它将是:

  • 常规客户端备份(假设为 Windows/SMB/CIFS):不受影响,因为异步数据存储上的顺序写入
  • 家庭数据的长期存档:不受影响,因为大部分数据处于静止状态,将以与备份相同的方式进行复制
  • 向客户提供媒体库,包括编码:不受影响,因为只读和瞬态编码不会返回存储
  • 运行一些虚拟机来提供邮件、云访问等服务:理论上会受到影响,但如果只有少数客户端访问它(而不是每秒一千个或更多),你不会注意到性能

即使普通磁盘也能轻松满足这些限制(作为镜像),SSD 也能轻松突破。您的机器大部分时间都处于闲置状态,您最好将钱投资于更多存储空间或更好的异地备份系统。

相关内容