[英]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.