Lease(租约)以及在GFS文件系统中的作用

 

租约的作用:分布式环境中维持缓存的一致性的一种协议

传统的解决方案:

轮询:即每次读取数据时都先询问服务器数据是否是最新的,如果不是就从服务器传输新数据,这种方法需要每次读取数据时都与服务器通信。

问题:每读取数据都需要与服务器确认,服务器负载大

回调或称为无效化:由服务器记住有哪些客户端读取了数据,对数据做修改时首先通知所有这些客户端数据已经失效。

问题:需要服务器记住所有读取过数据的客户端,这是很大的负担,更严重的是,一旦有客户端联系不上或者丢失了客户端的信息,修改操作将无法进行。

分布式应用环境中,租约是一个使用物理时钟处理主机和通信失败的一致性协议。

租约是一种协议,该协议赋予持有该协议者在某个属性性特定的有限时间的权利。在缓存中,即服务器给予客户端在一定期限内可以控制修改操作的 权力,比如在数据被写入之前,服务器必须获取租约持有者的批准。客户端从服务器读取数据时往往就同时获取租约

 

因 为租约是基于时钟的,因此其有效性需要系统时间来保证

 

很多情况下,系统中已经有一个保证一致性的中心服务,如某个单一服务器或者是实现了Paxos协议的一组服务器,但如果所有的功能都需要通过这个中心服务,很容易造成性能瓶颈。为了提高效率和扩展性,可以通过租约把一致性扩展到更多服务上。事实上用租约来维护缓存一致性也是相当于把服务器上的数据一致性扩展到了客户端。

 

客户端写数据:服务器必须推迟该请求直到每一个拥有租约的客户端同意或者该客户端上的对应的租约过期。

租约时间为零就相当于轮询,此时修改操作随时可以进行,而 读取数据总是要联系服务器,租约时间无限长就相当于回调。

租约与带期限的锁非常相似,但更加灵活,因为租约还提供了“寻求同意”的机制(我觉得可以称为“带期限可妥协的锁”)。服务器还可以实现多种租约,比如“写租约”和“读租约”,并保证一个时间段内只有一个写租约或者多个读租约,这就相当于是单写者多读者的锁协议。

一般租约的周期都比较短,太长容易引起假共享问题。

 对于一个期限为Ts的租约,对于该缓存的真正有效期Tc实际上是:

Tc=max(0,Ts-(Mprop+2Mproc)-e)

参考: http://duanple.blog.163.com/blog/static/70971767201141111440789/

 

到底租约是什么?

在很多时候,租约的定义似乎很模糊,有的时候租约类似心跳,有的时候又类似于锁。到底租约的本质是什么呢?

回到租约最原始的定义:租约就是在一定期限内给予持有者特定权力的 协议。我觉得这里的期限就是租约的根本特性,正是这一特性使得租约可以容忍机器失效和网络分割。在期限之内,租约其实就是服务器和客户端之间的协议,而这 个协议的内容可以五花八门。如果协议内容是服务器确认客户端还存活,那么这个租约的功能就相当于心跳;如果协议内容是服务器保证内容不会被修改,那么这个 租约就相当于读锁;如果协议内容是服务器保证内容只能被这个客户端修改,那么这个租约就相当于写锁。租约这种灵活性和容错性,使其成为了维护分布式系统一致性的有效工具。

 

租约适用与什么情况:租约适合用于“单点”服务器的场景,例如GFS系统master使用租约管理chunkServer)。

租约的扩展:

 事实上租约不止能用于保持缓存的一致性,我们要了解到租约的本质,本质上来讲,租约至少在租约有效期内,让租约拥有者决定某件事。在缓存一致性中,在租约有效期内,租约持有者(也就是从服务器中读取数据的客户端)拥有该租约所在对象(服务器对象的数据)的决定权,在服务器修改数据时,必须通知租约持有者让其同意,从而才能修改。

在GFS文件系统中:Master节点为Chunk的一个副本建立一个租约,我们把这个副本叫做主Chunk。主 Chunk对Chunk的所有更改操作进行序列化。所有的副本都遵从这个序列进行修改操作。因此,修改操作全局的顺序首先由Master节点选择的租约的 顺序决定,然后由租约中主Chunk分配的序列号决定。GFS文件系统中为了保持高可用,必须拥有数据副本,而为了提高客户端响应速度,客户端不需要写多份数据,仅需要写一份数据到主chunk数据即可。在这里租约的作用是什么?要解决这个问题我们可以反过来想,假设在写的过程中有这几种情况,

              在租约有效期内: master联系不到主chunk,客户端可以联系到主chunk。对于修改操作顺序都一致,并没有影响,

              在租约有效期内:master联系不到主chunk,客户端不可以联系到主chunk。对于修改操作所有的操作全都失败,但并不会影响数据的一致性(因为没有数据写入,全部返回失败)

              当租约失效:master重新选择主chunk,不论客户端联不联系到主chunk,操作都不会受影响(假设联系到原先的chunk,客户端会被告知,其租约已失效,重新到master中获取新的主chunk信息,若在过期前一直联系不到主chunk,到过期后(客户端缓存过期时间)会从新从主master拉取信息)。

         从上面我们可以看出,这种租约机制保证了写顺序性,同时由于租约,假设master与chunk所在的chunkServer服务器失去了联系,该租约也会有效,也减轻了master的负担(客户端不用每次写入都请求master,在租约有效期内,client只需访问一次master,因为master修改chunk数据,必须要进过chunkServer同意,所以如果chunkServer改变客户端再次访问时,会被yuanchunkServer)

     对GFS文件中的租约机制做一个简要的总结:GFS文件系统中使用租约机制来确保写入的顺序性,并有效的减轻了master的负担(如果没有租约,每次写入都必须询问master写入到哪个chunk中)。

 

 

 

 

参考:The Google System File  

          lease: 中文版链接 http://duanple.blog.163.com/blog/static/70971767201141111440789/

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值