【问题标题】:What happens in NFS if 2 or more servers try to write the same file simultaneously?如果 2 台或更多台服务器尝试同时写入同一个文件,NFS 会发生什么情况?
【发布时间】:2011-04-19 11:01:42
【问题描述】:

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

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

很有可能当缓存被刷新以进行内容更新时,它们可能会发生这样的冲突,但我没有很好的方法在开发中测试这种情况,因为我只在一个盒子上工作。

有这方面经验的人吗?

【问题讨论】:

  • serverfault.com上提问可能会更好。
  • 我没有遇到 serverfault.com,所以感谢您指出。这看起来也是一个很棒的资源,我将来会使用,但我认为 steven_desu 在下面照顾了我。

标签: php file nfs contention


【解决方案1】:

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

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 脚本会抛出一个错误,说它无法打开文件。

【讨论】:

  • 感谢您的信息。图像是用 PHP 的 imagejpeg() 函数保存的,它声明它将创建或覆盖给定的文件,这似乎与 fopen() 相同,如果它存在则截断文件,如果存在则写入或创建它它不见了。
  • 所以我认为最坏的情况是服务器 1 试图让它......它完成了,但服务器 2 在服务器 1 完成之前已经开始制作它自己的版本(因此 2 没有看到完成的文件),所以当它完成时,它会用相同的副本替换服务器 1 刚刚制作的内容。这似乎可以正常工作,而且实际上这种情况可能不会经常发生。如果我想进一步减少冲突,我什至可以在实际保存图像之前添加文件检查。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 2014-07-28
  • 1970-01-01
  • 2020-09-16
  • 2018-08-17
  • 2015-03-08
相关资源
最近更新 更多