系统相关
首页 > 系统相关> > linux-在AWS EFS上使用flock来模拟关键部分是否安全?

linux-在AWS EFS上使用flock来模拟关键部分是否安全?

作者:互联网

根据文档,AWS EFS (Amazon Elastic File System)支持文件锁定:

Amazon EFS provides a file system interface and file system access semantics (such as strong data consistency and file locking).

在本地文件系统(例如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中提供的锁定支持?不幸的是,我不知道协议的细节,但是在分布式系统中提供原子性比在本地机器上要困难得多.

更新:小规模实验

当然,这不是证明,但是在我的测试中,它可以在多个实例中工作.现在,我认为该模式是可以安全使用的.不过,很高兴知道它在理论上是否合理.

解决方法:

它应该工作.

问题中的模式中使用的flock命令应在所有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系统调用,但是可以由安全的fcntl系统调用来实现:

while (flock(fd, type | block)) {
  ...
  case EBADF:       /* since Linux 3.4 (commit 55725513) */
        /* Probably NFSv4 where flock() is emulated by fcntl().
         * Let's try to reopen in read-write mode.
         */

注意:解决方法是指在Linux内核中找到的this commit

Since we may be simulating flock() locks using NFS byte range locks,
we can’t rely on the VFS having checked the file open mode for us.

标签:filelock,amazon-efs,amazon-web-services,nfs,linux
来源: https://codeday.me/bug/20191108/2007969.html