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

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

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

锁类型

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

共享锁: 共享锁可以同时由多个进程使用,并且仅当文件中没有排他锁时才能发出。 这些锁适用于只读工作,但可用于写入(如数据库)。

独占锁: 独占锁与 CIFS/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 文档中测试锁定中断功能。

后续步骤