簡體   English   中英

在AWS EFS上使用flock來模擬關鍵部分是否安全?

[英]Is it safe to use flock on AWS EFS to emulate a critical section?

根據文檔, AWS EFS(Amazon Elastic File System)支持文件鎖定:

Amazon EFS提供文件系統接口和文件系統訪問語義(例如強數據一致性和文件鎖定)。

在本地文件系統(例如,ext4)上,可以在shell腳本中使用flock來創建關鍵部分 例如, 這個答案描述了我過去使用的模式:

#!/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腳本時,我也沒有遇到任何問題。


根據您的使用情況,您必須了解Linux上的文件鎖定問題 ,盡管其中大部分都不是NFS特定的。 例如,上面的模式在進程級別上運行,如果想要同步多個線程則不能使用。

在閱讀時,我遇到了舊問題。 在2.6.12之前的內核中,似乎存在NFS和flock系統調用的問題(例如,請參閱Linux上的flock vs lockf )。

它不應該適用於此,因為它已在新內核中得到改進。 查看flock命令的源代碼 ,您可以確認它仍然使用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內核中可以找到此提交

由於我們可能使用NFS字節范圍鎖來模擬flock()鎖,因此我們不能依賴VFS為我們檢查文件打開模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM