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

Posted

技术标签:

【中文标题】在 AWS EFS 上使用 flock 来模拟关键部分是不是安全?【英文标题】:Is it safe to use flock on AWS EFS to emulate a critical section?在 AWS EFS 上使用 flock 来模拟关键部分是否安全? 【发布时间】:2019-04-10 04:51:32 【问题描述】:

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

Amazon EFS 提供文件系统接口和文件系统访问语义(例如强数据一致性和文件锁定)。

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

更新:小规模实验

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

【问题讨论】:

我自己也在测试这个。到目前为止,我还没有发现任何问题。 @ScottTalbert 是的,我正在考虑自己写一个答案。据我了解,上面的模式应该支持 NFS,Amazon 的 EFS 实现的。到目前为止我也没有遇到任何问题。 【参考方案1】:

它应该可以工作。

问题中的模式中使用的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可以找到:

由于我们可能使用 NFS 字节范围锁来模拟 flock() 锁, 我们不能依赖 VFS 为我们检查文件打开模式。

【讨论】:

不幸的是,我可能刚刚发现了一个不起作用的案例。我让两个 EC2 实例在周末运行,一个持有一群,另一个等待获取它。似乎在某个时刻,持有羊群的机器失去了与 NFS 服务器的连接(131090 毫秒。Dec 2 05:04:32 ip-172-31-30-242 kernel: [105059.038603] nfs: server fs-e05dfc48 。 efs.us-west-2.amazonaws.com 没有响应,超时)。在这一点上,似乎另一个系统能够获得锁,而原来的系统似乎仍然拥有它。两个带锁的系统。 @ScottTalbert 有趣。在我的设置中,我使用了 200 秒超时的羊群。大多数锁的持有时间很短( 是的,就我而言,我试图使用它来防止多个节点担任“领导者”角色,这将持续很长时间。它似乎不适合这个用例,因为 NFS 似乎可以回收锁,就像我看到一个节点短暂失去与服务器的连接一样。

以上是关于在 AWS EFS 上使用 flock 来模拟关键部分是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

AWS EFS 是不是足够快以执行 PHP 代码?

对等方重置连接:AWS EFS

如何在 aws EFS 上挂载 aws EC2 文件作为持久卷?

AWS Cloudformation - 在 EFS 中创建初始文件夹

AWS EC2 用户数据 - 如何调试失败的 EFS 挂载失败

带有 Lambda 函数的 AWS EBS 与 EFS