分布式架构之 lease 机制
由于lease是一种承诺,具有的承诺内容可以非常的宽泛,可以是上面提到的数据的正确性;也可以是某种权限,例如当需要做并发控制时,同一时刻只给某一个节点颁发lease,只有持有lease的节点才可以修改数据;也可以是某种身份,持有lease的节点才具有primary身份。lease承诺的内涵还可以 非常宽泛 。
lease机制具有很高的容错能力。 首先,通过引入有效期,lease机制能否非常好的容错网络异常。 lease颁发过程只依赖于网络可以单向通信,即使接收方无法向颁发者发送消息,也不影响lease的颁发。 由于lease的有效期是一个确定的时间点,lease的语义与发送lease的具体时间无关,所以同一个lease可以被颁发者不断重复向接受方发送。 即使颁发者偶尔发送lease失败,颁发者也可以简单的通过重发的办法解决。 一旦lease被接收方成功接受,后续lease机制不再依赖于网络通信,即使网络完全中断lease机制也不受影响。 再者,lease机制能够比较好的容错节点宕机。 如果颁发者宕机,则宕机的颁发者通常无法改变之前的承诺,不会影响lease的正确性。 在颁发者机器恢复后, 如果颁发者恢复了之前的lease信息,颁发者可以继续准守承诺。 如果颁发者无法恢复lease信息,则只需等待一个最大的lease超时时间就可以使得所有lease都失效。 从而不破坏lease机制。 对于接受方宕机的情况,颁发者不需要做更多的容错处理,只需要等待lease过期失效,就可以收回承诺,实践中也就是收回之前赋予的权限、身份等。 最后lease机制不没有依赖于存储。 颁发者可以持久化颁发过的lease信息,从而宕机恢复后可以使得在有效期的lease继续有效。 但这对于lease机制只是一个优化,即使颁发者没有持久化lease信息,也可以通过等待一个最大的lease时间的方式使得之前所有颁发的lease失效,从而保证机制继续有效 。
lease机制 依赖于有效期 ,这就是要求颁发者的 时钟是同步 的。一方面,如果颁发者的时钟比接收者的时钟慢,则当接收者认为lease已经过期的时候,颁发者依旧认为lease有效。接收者可以在lease到期前申请新的lease的方式解决这个问题。另一个方面,如果颁发者的时钟比接收者的时钟快,则当颁发者认为lease已经过期的时候,接收者依旧认为lease有效,颁发者可能将lease颁发给其他节点,造成承诺失效,影响系统的正确性。对于这种时钟不同步,实践中的通常做法是将颁发者的有效期设置的比接收者的略大,只需要大过时钟误差就可以避免对lease的有效性的影响。