当RAID BBU和UPS存在时,NFSasynchronous有多危险?

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

  • 如果我的服务器崩溃了,会发生什么事情(即是否会丢失即将被写入的数据,是否会破坏底层文件系统等)?
  • 如果服务器和客户端同时崩溃(例如,电源故障/故障和UPS未能处理),会发生什么情况?
  • 如果服务器崩溃,但是我有RAID BBU。 服务器能否安全恢复?
  • 有什么方法可以检测到这样的腐败(类似fsck也许)?
  • 如果服务器通过UPS正常关机怎么办? 那么我会有数据损坏的机会吗?
  • 你们用什么 – syncasync

所有机器都是Ubuntu OS 10.04。

我试图在这里find类似的问题,没有可用的。 我已经阅读了NFS主页 ,并快速浏览了pipe理NFS和NIS,第二版的书。

那么NFSv3规范说的基本上就是以下两个NFS数据操作

  • WRITE操作与稳定位设置
  • 承诺

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

也就是说,asynchronous的潜在腐败问题基本上是沿着下面的东西

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

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

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

如果我的服务器崩溃了,会发生什么事情(即是否会丢失待写入数据,是否会损坏底层文件系统等)?

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

janneb已经写了一个关于崩溃在NFS服务器环境下意味着什么的很好的解释。

如果服务器和客户端同时崩溃(例如,电源故障/故障和UPS未能处理),会发生什么情况?

您validation任何重要的数据。

如果服务器崩溃,但是我有RAID BBU。 服务器能否安全恢复?

不。导出asynchronous意味着服务器告诉客户端“我已经存储了你在稳定的存储上给了我什么,现在你可以不用担心了”,甚至在试图写入数据到你的RAID之前。

有什么办法可以检测出这样的腐败(类似fsck也许)?

正如詹尼布所说,不。

如果UPS优雅地closures服务器呢? 那么我会有数据损坏的机会吗?

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

不。导出asynchronous意味着服务器告诉客户端“我已经存储了你在稳定的存储上给了我什么,现在你可以不用担心了”,甚至在试图写入数据到你的RAID之前。

为了扩展这一点,因为你有一个RAID卡BBU,通过启用写入caching,你将获得更快的NFS性能。 这是BBU的目的,在断电后保持这个caching中的数据活着。 我不会在生产中启用asynchronous。 就像上面的作者所说的那样,这是链条的一个独立部分。

我推荐这个ZFS文章,其中包括一些通用的NFS和性能信息:

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