我有一个NFSv3服务器和大约15个客户端。 我正在寻找利弊在服务器端启用async
。 我已经读过,但对我还是有点不清楚。 我知道这可能会导致数据损坏,如果服务器在写入操作中间崩溃。 不过,我也读过,客户端存储相同操作的caching,如果需要,可以恢复它。 我的问题是:
fsck
也许)? sync
或async
? 所有机器都是Ubuntu OS 10.04。
我试图在这里find类似的问题,没有可用的。 我已经阅读了NFS主页 ,并快速浏览了pipe理NFS和NIS,第二版的书。
那么NFSv3规范说的基本上就是以下两个NFS数据操作
只有数据达到稳定存储后才允许服务器返回成功。 这是Linux NFS服务器使用默认“同步”导出选项实现的。 使用“asynchronous”,即使数据不在稳定的存储上,服务器也可以作弊并返回成功。
也就是说,asynchronous的潜在腐败问题基本上是沿着下面的东西
现在,最后一点是严重的事情,因为没有办法知道哪些数据丢失/损坏或不是。
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和性能信息: