如果2个或更多服务器尝试同时写入同一文件,NFS会发生什么?

时间:2010-09-30 16:19:38

标签: php file nfs contention

我正在开发一个自动调整图像大小的PHP webapp,我正在考虑将缓存的副本存储在NFS挂载的NAS上,这样我就可以在更新图像时轻松刷新缓存。

我唯一担心的是,如果群集中有2个或更多服务器同时尝试创建相同的图像缓存文件,那么通常会发生什么?

很有可能当缓存刷新内容更新时他们可能会发生冲突,但是我没有很好的方法来测试开发中的这个场景,因为我只在一个盒子上工作。

有经验的人吗?

1 个答案:

答案 0 :(得分:4)

这取决于您打开文件的方式。如果你以“追加”模式打开文件,那么Unix / Linux实际上会将内容写入缓存,直到你创建一个新行字符,然后它将新行粘贴到文件的末尾(覆盖“文件结束“字节模式”并写入一个新的“文件结束”。在这种情况下,如果两个人试图同时写入同一个文件,那么两个写行都将通过,按照接收顺序一次连接一行。因此你可以期待像:

This was the old contents
of the file
The first script added
The second script added
this line (script 1)
this line (script 2)

在极少数情况下,两个“写入”命令完全同时到达(精确到纳秒级),然后操作系统实际上会创建一个中断状态。这取决于操作系统如何处理这个问题,但大多数人只会生成两个随机数来决定谁先走。

如果您以“写入”模式打开文件(假设您想要向中间添加内容),那么您实际上必须锁定文件才能执行此操作。第二个PHP脚本将抛出一个错误,说它无法打开文件。