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

grs*_*grs 3 linux ubuntu nfs

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

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

所有机器都是 Ubuntu OS 10.04。

我试图在这里找到类似的问题,但没有。我已经阅读了 NFS 主页并快速浏览了管理 NFS 和 NIS,第 2 版书籍。

jan*_*neb 5

所以NFSv3规范所说的基本上是针对以下两个 NFS 数据操作

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

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

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

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

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

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