P11 Cache Consistency Frangipani 视频观看笔记
Frangipani 是一个网络文件系统(NFS),是一个去中心化的设计,即复杂的逻辑实现都在Frangipani内部完成,frangipany与petal通过RPC进行交互来获取磁盘中的数据。
缓存一致性、分布式事务和分布式故障恢复
缓存一致性
缓存一致性即是如果缓存了一些数据,但之后修改了实际数据却没有考虑到缓存中的数据,则需要进行一些额外的工作来使缓存与实际数据保持一致。
在多客户端共享服务器存储时,若当前客户端在共享存储中的文件读取出来,并在缓存中对文件做了更改,那么其余客户端便无法看到这个更改,便会出现不一致的情况。
缓存一致性协议来实现缓存一致性,缓存一致性由锁来保证。
存在一个锁服务器,锁服务器会记录每个文件的锁被谁持有。每个工作站中会记录它锁持有的锁以及锁对应的文件内容。当工作站决定要读取文件时,会先向一个锁服务器请求文件对应的锁,之后才会向服务器请求文件或者目录的数据。收到数据之后,工作站会记住对应锁的状态以及文件的内容。
在工作站完成了相应的操作时,工作站会释放锁,锁的状态为Idle,但仍被工作站锁持有,从锁服务器的角度来看,工作站仍持有锁。
一些规则:
- 工作站不允许持有缓存的数据,除非同时持有了与数据相关的锁。
- 释放锁之前,必须将修改了的数据写回到共享存储服务器中,只有服务器收到了数据,才可以释放锁,然后工作站的lock表单中删除有关文件锁和缓存数据的记录。
缓存一致协议包含的4种消息如下:
- 工作站发送给锁服务器Request消息,锁服务器会等到该锁空闲时(异步)发送Grant消息给工作站。
- 锁服务器如果收到加锁的请求,若查看自己的lock表单发现这个锁正在被工作站持有,那么锁服务器就向该工作站发送一个Revoke消息给该工作站以请求释放锁。工作站中的锁若是Idle状态,则会进行释放,并向锁服务器发送一条Release消息(在消息写入到共享存储之后)。
每个工作站用完锁没有立即释放,而是改为Idle状态是由于局部性原理所做出的一种优化。
另一个优化点是读写锁的优化。
原子性
以锁为核心,实现一个数据库风格的分布式事务系统。
即在整个操作的过程中持有所有的锁,便可以获得不可分割的原子事务。
分布式故障恢复
若当前工作站崩溃掉了,不会影响其他使用共享系统的工作站,即使正在查看当前工作站的目录,也希望可以正常运行,可以漏掉没有Write-Back的操作,但能看到正常运行的文件系统。
通过**预写型日志(WAL)**实现故障可恢复的事务。
即工作站在向共享存储写入数据之前,会在共享存储中自己的log列表中追加需要完成操作的日志条目,当日志条目追加完成之后,才会开始向共享存储发送数据。log条目带有序列号。
log中只包含了对于元数据的修改,不包含写入文件的数据,一个log条目包含的是一个完成的操作步骤。
收到Revoke请求时,会先将完整log写入到共享存储中,再进行后面的操作。
故障发生的情景:
- 工作站在向共享存储中写入log,还没有进行文件数据的写入。
- 工作站正在向共享存储中写入修改的文件,完整的log已经写入。
工作站崩溃之后,锁服务器向工作站发送一个Revoke消息,锁服务器得不到响应之后,会触发故障恢复,如果其他工作站需要崩溃的工作站所持有的锁,那么锁服务器会发出Revoke消息,锁服务器收不到Release消息直到租约到期后,开始进行初始化恢复工程(认为该工作站崩溃了)。
锁服务器通知另一个工作站,当前工作站已崩溃,读取它的log并重新执行,执行完成之后,对锁服务器进行通知,锁服务器将锁释放,来让该工作站使用。