![NFS 与 AFS 缓存验证](https://linux22.com/image/674525/NFS%20%E4%B8%8E%20AFS%20%E7%BC%93%E5%AD%98%E9%AA%8C%E8%AF%81.png)
NFS 客户端通过评估 T-Tc < t 来重新验证访问的缓存块。如果失败,它会向 NFS 服务器发送 getattr 调用,请求相关文件的最后一个 Tmodified 标记。
AFS 在打开或重启时,会在周期性时间 T 之后重新验证其缓存文件。
当这些重新验证调用在网络中丢失时会发生什么?当我们假设使用 NFS 进行硬安装时,NFS 客户端是否会阻塞以等待 getattr 调用的回复,或者我们是否能够跳过一段时间的检查以便继续工作?
对于 AFS 来说也是一样,它是否会阻止等待验证,或者我们可以继续工作吗?
答案1
OpenAFS 采用的 AFS 缓存一致性模型和存储文件系统与你在问题中描述的有点不同。
/afs 下存储的每个对象都具有
- 数据:文件流、目录内容、挂载点目标或符号链接目标。
- 元数据:大小、创建者、所有者、组、unix 模式、链接数、时间戳、父 ID、锁定状态、访问控制列表和“数据版本号”
每次修改对象的数据时,该对象的“数据版本号”都会增加,但元数据更改时则不会增加。
客户端(也称为缓存管理器)被允许缓存对象的数据和元数据,但只有在从文件服务器获得“回调承诺”时才允许将其视为最新。这是缓存管理器的生命周期回调承诺决定缓存管理器必须向文件服务器发出 FetchStatus RPC 的频率。只要回调承诺尚未过期,缓存管理器就可以自由使用缓存数据。如果文件服务器发出打回来RPC 到缓存管理器,承诺被撤销,并且需要缓存管理器获取更新的状态信息。
原始 Andrew 文件系统和 OpenAFS 中从文件服务器到缓存管理器的回调通道是未经身份验证的。因此,它不能用于传输实际数据或元数据更改。缓存管理器必须通过其自己的连接获取这些信息,该连接可能经过身份验证和加密。AuriStorFS 与早期 AFS 变体之间的区别之一是使用安全回调通道。
一旦缓存管理器获得最新的元数据,它就可以将当前数据版本号与缓存的数据版本进行比较。如果版本没有改变,则缓存的数据仍然有效。否则,必须从缓存中丢弃过期的数据并获取更新的数据。
AFS 缓存一致性模型的一个特性是将文件系统视为序列化消息传递平台。有一个基本要求,即如果计算机 A 正在使用某个文件,而计算机 B 想要修改该文件,然后向计算机 A 发送带外消息以读取更新的文件,则文件更新必须在带外消息之前到达。通过确保在修改文件的 RPC 完成到发行者之前打破所有回调承诺,可以保证此特性。
您提出了当客户端和文件服务器之间的连接失败时会发生什么的问题。文件服务器将在一段时间内尝试发送回调 RPC,但不会无限期地阻塞。相反,它会为无法联系到的客户端排队延迟的回调消息,并完成对发行者的 RPC。下次失去连接的客户端联系文件服务器时,其所有操作都将阻塞,直到所有延迟的回调都已传递。
在连接丢失期间,客户端可以尝试与另一个维护数据副本的文件服务器通信。如果没有副本,并且正在访问的卷是硬安装的,则客户端将无限期阻塞。如果不是硬安装的,则发出的任何网络 RPC 都将超时,并将失败返回给发出请求的应用程序。
我希望这能够充分描述 AFS 系列文件系统的行为。