你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

了解 Azure NetApp 文件中的文件锁定和锁类型

在 NAS 环境中,多个客户端访问同一卷中的文件。 NAS 卷不支持应用程序感知,因此,为了在多个客户端尝试同时写入同一文件时保护数据免遭潜在损坏,应用程序会向 NAS 服务器发送锁定请求,以防止其他客户端在文件正在使用时进行更改。 对于 NFS,文件锁定机制取决于所使用的 NFS 版本。

锁类型

NFS 锁有多种类型,其中包括:

共享锁:共享锁可由多个进程同时使用,仅当文件上没有独占锁时才能发出。 这些锁用于只读工作,但可用于写入(例如在使用数据库时就是如此)。

排他锁:排他锁的操作方式与 SMB 中的排他锁相同:存在排他锁时,只有一个进程可以使用该文件。 如果任何其他进程已锁定该文件,则无法发出排他锁,除非该进程已分叉

委托:委托仅与 NFSv4.x 一起使用,在启用 NFS 服务器选项且客户端支持 NFSv4.x 委托时进行分配。 委托通过为客户端使用的文件创建“软”锁,提供了一种在客户端缓存操作的方法。 这通过减少客户端和服务器之间的调用次数来提高特定工作负荷的性能,类似于 SMB 机会锁。 Azure NetApp 文件当前不支持 NFSv4.x 委托。

字节范围锁:字节范围锁只锁定文件的一部分,而不是锁定整个文件。

锁定行为取决于锁的类型、客户端操作系统版本和所使用的 NFS 版本。 请务必在环境中测试锁定以衡量预期的行为。

NFSv3 锁定

NFSv3 使用网络锁管理器 (NLM) 和网络状态监视器 (NSM) 等辅助协议来协调 NFS 客户端和服务器之间的文件锁。 这些辅助协议在 RFC-1813 中定义,Azure NetApp 文件遵守该协议。

NLM 帮助建立和释放锁,而 NSM 则通知对等方服务器重新启动。 使用 NFSv3 锁定时,如果客户端重新启动,服务器必须释放锁定。 当服务器重新启动时,客户端会提醒服务器它所持有的锁

注意

在某些情况下,NFS 锁机制无法正常通信(例如,在网络中断的情况下就是如此),并且过时的锁会保留在服务器上,必须手动清除。 有关此任务的详细信息,请参阅排查文件锁问题

NFSv4.x 锁定

NFSv4.x 使用集成在 NFS 协议中的基于租约的锁定模型。 这意味着无需维护或担心辅助服务;所有锁定都封装在 NFSv4.x 通信中。

Azure NetApp 文件支持 NFSv4.x 文件锁定机制,该机制在基于租用的模型下维护所有文件锁的状态。 根据 RFC 8881,Azure NetApp 文件会“为 NFS 客户端拥有的所有状态定义一个租用期限。 如果客户端未在定义的期限内续订其租用时间,则服务器可能会释放与客户端的租用关联的所有状态。”

这意味着客户端可以通过执行诸如读取文件之类的操作来显式或隐式地续订其租用时间。 此外,Azure NetApp 文件定义了一个宽限期,这是一段特殊处理期限:客户端在服务器恢复期间尝试回收其锁定状态。

术语 定义
Lease Azure NetApp 文件不可撤销地向客户端授予锁的时间段。
宽限期 当服务器发生故障时,客户端在服务器恢复期间尝试回收其锁定状态的时间段。

Azure NetApp 文件如何处理 NFSv4.x 锁

锁由 Azure NetApp 文件根据客户端请求以租赁方式颁发。 Azure NetApp 文件服务器每 30 秒检查一次每个客户端上的租约是否有更改。 在客户端重新启动的情况下,客户端可以在重新启动后从服务器回收所有有效的锁。 如果 Azure NetApp 文件服务器重新启动,则在重新启动后,它不会在 45 秒的宽限期内向客户端发出任何新锁。 在此之后,可以向发出请求的客户端发出锁。 如果在指定的宽限期内无法重新建立锁,则锁将自行过期。 此行为与 NFSv3 锁定不同,因为不会存在需要手动打破的旧锁。

手动在客户端上建立锁

若要测试 NFS 锁,客户端必须告诉 NFS 服务器建立锁。 然而,并非所有应用程序都使用锁。 例如,应用程序“vi”不会锁定文件。 它使用点命名约定在同一文件夹中创建一个隐藏的交换文件,然后在应用程序关闭时向该文件提交写入。 然后旧文件被删除,交换文件被重命名为该文件名。

然而,有一些实用工具可以手动建立锁。 例如,flock 可以锁定文件。

若要对文件建立锁,请首先运行 exec 来分配数字 ID。

# exec 4<>v4user_file

使用 flock 在文件上创建共享锁或排他锁。

# flock

Usage:
 flock [options] <file|directory> <command> [command args]
 flock [options] <file|directory> -c <command>
 flock [options] <file descriptor number>

Options:
 -s  --shared             get a shared lock
 -x  --exclusive          get an exclusive lock (default)
 -u  --unlock             remove a lock
 -n  --nonblock           fail rather than wait
 -w  --timeout <secs>     wait for a limited amount of time
 -E  --conflict-exit-code <number>  exit code after conflict or timeout
 -o  --close              close file descriptor before running command
 -c  --command <command>  run a single command string through the shell

 -h, --help     display this help and exit
 -V, --version  output version information and exit

# flock -n 4

解锁该文件。

# flock -u -n 4

通过手动锁定文件,你可以测试文件打开和编辑交互,并测试 Azure NetApp 文件中的锁定中断功能。

后续步骤