缓存一致性

来源:互联网 发布:人工智能产品 编辑:程序博客网 时间:2024/06/01 19:05

    为了减少发送给服务器请求的数量,一些分布式文件系统将一些操作的结果缓存起来。客户缓存可能导致针对同一文件,不同客户端有不同版本文件或内容,这是因为一个客户端对文件的更改不会立刻引起他客户端上文件拷贝的立刻更新。这便是缓存的一致性问题。
   1、基于回调的机制(AFS,Andrew File System采取的一致性措施)
    当服务器进程(Vice)为客户端进程(Venus)提供文件拷贝时,同时回复了一个回调承诺——由管理该文件的服务器发送的一种标识,用于保证当其他客户修改该文件时通知其他的具有此文件拷贝或缓存的客户端。回调承诺和被缓存的文件一起存储在客户端磁盘上,他有两种状态:有效或取消。当服务器执行一个文件更新操作时,它会通知所有发送过回调承诺的客户端。当客户端收到这个通知时,便把相关文件的回调承诺设置成取消状态。
    当客户端执行open请求时,它首先检查缓存,如果所需的文件在缓存中,它便检查其回调承诺标识,若是取消的,那么必须从服务器取得新的文件拷贝,如果是有效的便可以直接打开使用本地缓存的文件。
    如果客户端因为故障重启,那么在故障期间有可能丢失了回调(意味着,缓存中的备份已经不是最新的了),所以重启后,在使用缓存文件和目录前,需要先对回调承诺的有效性进行验证,客户端生成一个缓存有效性请求给管理该文件的服务器,该请求包含一个文件修改时间戳。如果其时间戳是当前的,服务器便会应答一个有效信息,其回调承诺标识值被恢复;如果时间戳显示该文件时过期的,就回应一个取消消息。
    其实回调的本质在于,客户端不用轮询服务器是否文件被更新,服务器会主动告知客户端文件的更新。这种通知是单向的,一旦出现通信故障或是服务器故障,导致客户端无法接收到回调消息,客户端是没有办法知道到底是文件没有更新还是出现了故障,因此当使用客户端文件缓存前要确认这一点,方法是检查从文件缓存开始有多久没有跟服务器通信了,一旦这个时间超过了阈值,回调必须被更新。
    2、基于时间戳的机制(NFS,Network File System采用的一致性措施)
    在使用缓存块之前,可以使用时间戳的方式对缓存块进行验证。缓存中的数据或元数据项都被标记上两种时间戳:
    a) Tc是缓存条目上次被验证的时间。
    b) Tm是服务器上次修改文件块的时间。
    这两个时间戳对应两种有效性验证方式:
    a) 设当前时间为T,若T-Tc小于更新时间间隔t,意味着文件肯定没有被更新,所以缓存中的数据肯定是有效的。(t越小越可以有效保证一致性,但是频繁通信,消耗较大,所以要折中考虑)
    b) 当记录在客户端的Tm值和服务器上的Tm值相等时(也就是自上次缓存条目被验证过之后,服务器文件没有被更新)
    满足任何一种验证方式,都可以证明缓存项的有效性。
    每次使用缓存项都会执行有效性检查:a条件的判断可以不访问服务器便可以判断,若a为真(此处不会更改Tc项),不必判断b的有效性;若a为假,则需要查看服务器上的Tmserver,若服务器上的Tmserver和客户端Tm是一致的,那么缓存项是有效的,Tc被更新为当前时间;若为假,则客户端的缓存项无效,会产生一个获得服务器相关数据的请求。

原创粉丝点击