Lease机制是最重要的分布式协议,广泛应用于各种实际的分布式系统中。Lease机制最重要的应用是,判断节点状态。Lease是由颁发者授予的在某一有效期内的承诺。办法者一旦发出lease,则无论接收方是否收到,也无论后续接收方处于何种状态,只要lease未过期,颁发者一定严守承诺;另一方面,接收方在lease的有效期内可以使用颁发者的承诺,则一旦lease过期,接收方一定不能继续使用颁发者的承诺。
Lease表示某种承诺,具体的承诺内容可以非常的宽泛。可以使某种权限,例如当需要进行并发控制时,统一时刻只给某一节点颁发lease,只有持有lease的节点才可以修改数据。
Lease机制依赖于有效期,这就要求颁发者和接收者的时钟是同步的。一方面,如果颁发者的始终比接收者慢,则当接收者认为lease已经过期的时候,颁发者依旧认为lease有效。接收者可以用在lease到期前申请新的lease的方式解决这个问题。另一方面,如果颁发者的时钟比接收者的始终快,当颁发者认为lease已经过期的时候,接收者依旧认为lease有效,颁发者可能将lease颁发给其他节点,造成承诺失败,影响系统的正确性。对于这种时钟不同步,实践中的通常做法是将颁发者的有效期设置得比接收者的略大,只需大过时钟误差就可以避免对lease的有效期的影响。
基于lease机制确定节点状态:
在分布式系统中,确定一个节点是否处于正常工作状态是一个困难的问题。由于可能存在网络分化,可点的状态无法通过网络通信来确定。下面通过一个例子来说明:
在一个primary-secondary架构的系统中,有节点A,B,C互为副本,其中有一个节点为primary,同一时刻只能有一个primary节点。另有一个节点Q负责判断节点A,B,C的状态,一旦Q发现primary异常,节点Q将选择另一个节点作为primary。假设最开始时A为primary, B,C为secondary。节点Q需要判断节点A,B,C的状态是否正常。
基于“心跳heartbeat”的方法并不能很好的解决这个问题。A,B,C周期性的向Q发送心跳信息,若Q超过一定时间收不到某个节点的心跳信息,则认为节点异常。但显然,通信异常也有可能是网络中断导致的,更大的可能是节点间的网络拥塞造成的“瞬断”,而“瞬断”是可以很快恢复的。
假设A本身工作正常,但Q与A之间的网络暂时中断,A与B,C之间的网络正常。此时Q认为A异常,重新选择B为primary,并通知A,B,C新的primary为B。由于Q的通知消息到达节点A,B,C的顺序无法确定,假设先到B,则在这一时刻,系统中同时存在两个primary,即A,B。假如此时A,B都接受外部请求并与C同步数据,会产生严重的数据错误。
解决的方法可以是利用lease机制确定节点状态:由中心节点向其他节点发送lease,若某个节点持有有效的lease,则认为该节点正常可以服务。例如,A,B,C依然周期性的发送心跳信息报告自身状态,节点Q收到心跳后发送一个lease,表示确认了A,B,C的状态,并允许节点在lease有效期内正常工作。Q可以给primary节点一个特殊的lease, 表示节点可以作为primary工作。一但节点Q希望切换新的primary,则只需等前一个primary的lease过期,则就可以安全的颁发新的lease给新的primary节点,这样可以避免“双主”问题。
Lease的有效时间的选择:若太短(如1秒),很容易因为网络抖动造成lease丢失。若太长(如1分钟),一旦接收者异常,颁发者需要很长时间才能收回lease承诺。工程中,通常选择10秒级别。
GFS中的Lease:
GFS中使用lease确定Chunk的primary部分。lease由master节点颁发给primary副本,持有lease的副本成为primary副本。primary副本控制该chunk的数据更新流量,确定并发更新操作在chunk上的执行顺序。GFS中的lease信息由master在响应各个节点的heart beat时附带传递。但GFS得master失去某个节点的heart beat时,只需待该节点上的primary chunk的lease超时,便可以为这些chunk重新选择primary副本并颁发lease。
References
01.分布式文件系统,刘杰
02.Google File System, Google
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。