根据文档,AWS EFS (Amazon Elastic File System)支持文件锁定:
Amazon EFS提供了文件系统界面和文件系统访问语义(例如强大的数据一致性和文件锁定)。
在本地文件系统(例如ext4)上,可以在外壳程序脚本中使用flock
来创建critical section。例如,this answer描述了我过去使用的模式:
#!/bin/bash
(
# Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds
flock -x -w 10 200 || exit 1
# Do stuff
) 200>/var/lock/.myscript.exclusivelock
可以在EFS上应用相同的模式吗?亚马逊提到他们正在使用NFSv4协议,但是它提供与ext4上的flock
相同的保证吗?
如果没有,您如何强制操作仅在连接到同一EFS卷的所有EC2实例上运行?如果它适用于进程,就足够了,因为我不打算运行多个线程。
还是我误解了NFSv4中提供的锁定支持?不幸的是,我不知道协议的细节,但是在分布式系统中提供原子性比在本地机器上要困难得多。
更新:小型实验
当然不是证明,但是在我的测试中,它可以在多个实例中工作。现在,我认为该模式是可以安全使用的。不过,很高兴知道它在理论上是否合理。
答案 0 :(得分:3)
应该可以。
问题模式中使用的RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.123$
RewriteRule admin\.php / [QSD,R=302,L]
命令应在所有NFS文件系统上均有效。这意味着,它也将在实现NFSv4协议的EFS上运行。实际上,到目前为止,使用它在不同EC2实例上同步Shell脚本时,我也没有遇到任何问题。
根据使用情况,您必须了解gotchas of file locking on Linux,尽管大多数不是NFS特定的。例如,上面的模式在进程级别上运行,如果要同步多个线程,则无法使用。
在阅读的同时,我遇到了一些老问题。在2.6.12之前的内核中,NFS和flock
系统调用(例如,参见flock vs lockf on Linux)似乎存在问题。
它不应该在这里应用,因为它已在较新的内核中得到改进。查看flock
命令中的source code,可以确认它仍然使用flock
系统调用,但是可以通过安全的flock
系统调用来实现: / p>
fcntl
注意:可以在Linux内核中找到this commit的解决方法:
由于我们可能正在使用NFS字节范围锁来模拟flock()锁, 我们不能依靠VFS为我们检查文件打开模式。