当存在 RAID BBU 和 UPS 时,NFS 异步有多危险?

当存在 RAID BBU 和 UPS 时,NFS 异步有多危险?

我有一台 NFSv3 服务器和大约 15 个客户端。我正在寻找在服务器端启用的利弊async。我已经阅读过相关内容,但我仍然不太清楚。我知道如果服务器在写入操作过程中崩溃,它可能会导致数据损坏。但是,我还读到客户端存储了相同操作的缓存,并且可以在需要时恢复它。我的问题是:

  • 如果我的服务器崩溃了,究竟会发生什么呢(例如,它会丢失待写入的数据吗?它会破坏底层文件系统吗?等等)?
  • 如果服务器和客户端同时崩溃(即电源故障和UPS无法处理)会发生什么?;
  • 如果服务器崩溃了,但我有 RAID BBU,服务器可以安全恢复吗?
  • 有什么方法可以检测这种损坏(类似于fsck可能)?;
  • 如果服务器通过 UPS 正常关闭会怎样? 那时数据会损坏吗?
  • 你们用什么-sync或者async

所有机器都是 Ubuntu OS 10.04。

我试图在这里找到类似的问题,但没有找到。我读过NFS 主页并快速浏览了《管理 NFS 和 NIS》第二版一书。

答案1

那么NFSv3规范说,基本上是针对以下两个 NFS 数据操作

  • 设置稳定位的写操作
  • 犯罪

仅当数据到达稳定存储后,服务器才允许向客户端返回成功。这是 Linux NFS 服务器使用默认“同步”导出选项实现的。使用“异步”,即使数据不在稳定存储中,服务器也可以作弊并返回成功。

也就是说,异步的潜在损坏问题基本上是以下问题

  1. 服务器返回 WRITE 或 COMMIT 操作成功
  2. 客户端看到成功,并在某个时候从自己的缓存中删除这些页面(它认为,既然它们已经在服务器存储中了,为什么还要浪费空间保留它们)
  3. 服务器崩溃,从而丢失未提交到稳定存储的数据
  4. 客户端重新连接到服务器,但由于没有写入或未写入哪些数据的日志,因此无法确切知道哪些数据丢失了。

现在,最后一点是严重的事情,因为没有办法知道哪些数据丢失/损坏了。

另一方面,如果客户端崩溃,那么客户端缓存中的任何脏数据(尚未刷新)都将丢失,但客户端程序员可以解决这个问题(即,只有在 fsync() 或 close() 返回成功后,程序员才能假定数据在稳定存储中)。

答案2

如果我的服务器崩溃了,究竟会发生什么呢(例如,它会丢失待写入的数据吗?它会破坏底层文件系统吗?等等)?

与计算机是否是 NFS 服务器无关,如果它崩溃,您将丢失页面缓存中的数据(即已写入但尚未从 RAM 刷新到磁盘的数据)。使用日志文件系统,文件系统应在下次使用日志安装时自动修复。

janneb 很好地解释了在 NFS 服务器环境中崩溃的含义。

如果服务器和客户端同时崩溃(即电源故障和UPS无法处理)会发生什么?

您可以验证任何重要的数据。

如果服务器崩溃了,但我有 RAID BBU,服务器可以安全恢复吗?

不。使用异步导出意味着服务器在尝试将数据写入您的 RAID 之前就告诉客户端“我已将您提供的内容存储在稳定存储中,您现在不必再担心它了”。

有没有什么方法可以检测这种损坏(可能类似于 fsck)?

正如 janneb 所说,不是。

如果服务器通过 UPS 正常关闭会怎样?那时数据会不会损坏?

不是,因为在这种情况下 NFS 服务器会将所有数据写入稳定存储。

答案3

不。使用异步导出意味着服务器在尝试将数据写入您的 RAID 之前就告诉客户端“我已将您提供的内容存储在稳定存储中,您现在不必再担心它了”。

稍微扩展一下,由于您有 RAID 卡 BBU,因此通过启用写入缓存,您将获得更快的 NFS 性能。这就是 BBU 的用途,在断电后保持此缓存中的数据处于活动状态。我不会在生产中启用异步。正如上面的作者所说,这是链的一个独立部分。

我推荐这篇 ZFS 文章,其中包含大量通用 NFS 和性能信息:

https://blogs.oracle.com/roch/entry/nfs_and_zfs_a_fine

相关内容