我正在使用NFS来允许两个服务器通过简单的文本文件进行通信,但有时似乎服务器读取文本文件以获取信息是读取不完整的文件,然后因为这个崩溃。然后我去查看导致它崩溃的“不完整”文件,文件已经完成。在NFS完成编写之前,读取这些文件的服务器是否可能会看到它们?我使用linux的mv
只能在完全写入时将它们从本地机器移动到NFS,因此“应该”永远不会是NFS上的不完整状态。
这个问题可能与sync vs async有关吗?现在我正在使用异步。根据我的理解,异步只是意味着你从写入返回,你的程序可以继续运行,这个写入将在以后发生。而同步意味着您的进程将在其继续运行之前等待该写入完成。更改为同步修复此问题?或者有更好的方法来处理这个问题吗?我知道有两台服务器可以通过数据库进行通信,但我实际上是这样做是为了尽量减少数据库使用量。谢谢!
答案 0 :(得分:1)
mv
转换为cp
+ rm
,即使没有涉及NFS,也肯定不是原子的。您应该首先将文件复制到目标文件系统中的临时文件,然后将其重命名为正确的名称。例如,而不是:
$ mv myfile.txt /mnt/targetfs/myfile.txt
做的:
$ mv myfile.txt /mnt/targetfs/.myfile.txt.tmp
$ mv /mnt/targetfs/.myfile.txt.tmp /mnt/targetfs/myfile.txt
(这假设读取文件的进程在没有正确名称时忽略它。)