【Java高级工程师蜕变之路】060 分布式一致性协议之Lease机制
Lease机制
什么是Lease机制
Lease机制,就是租约机制,是一种在分布式协议中常用的协议,是维护分布式系统中数据一致性的常用工具。
Lease机制的特点:
- Lease是颁发者对一段时间内数据一致性的承诺
- 颁发者发出Lease后,不管是否被接受,只要Lease不过期,颁发者都会按照协议,遵守承诺
- Lease的持有者只能在Lease的有效期内使用承诺,一旦Lease超时,持有者需要放弃执行,重新申请Lease。
以租车为例:
Lease机制解决了什么问题
分布式系统中,如何确定一个节点是否正常工作?
假设有5个副本,1号是主副本。
在分布式系统中最直观的办法是在主副本与副本之间维持一个心跳,期望通过心跳是否存在判断节点是否存活。
心跳其实无法从根本上解决分布式下节点是否正常这个问题,例如如下场景:
-
在某个时候几点Node1发生网络抖动或者网络中断情况(不是宕机),导致节点无法接收心跳
-
会在剩下的节点中选区一个当做主节点
主要解决思路有四种:
- 设计能够容忍双主的协议
- Raft协议-通过term版本高的同步低的
- 用Lease机制
- 涉及去中心化-Gossip协议
Lease的原理
-
引入中心节点负责下发Lease
-
出现网络问题
在1.05如果出现网络抖动,会导致其他节点申请Lease失败,因为节点在1.10之前都会承认有主节点,不允许其他节点再申请Lease。
-
如果网络回复
-
如果到了1.10,主节点会进行续约操作,然后下发新的Lease
-
如果主节点宕机,其他节点申请Lease也会失败,承认主节点的存在
-
当Lease过期时,副节点申请Lease成功
Lease的容错
-
主节点宕机
Lease机制可容忍网络、接收方差错,时间就是Lease剩余的过期时长。
-
中心节点异常
颁发者宕机可能使得所有节点没有Lease,系统处于不可用状态。解决办法是使用一个小集群而不是单个节点来作为颁发者。
-
时差问题
中心节点与主节点之间的时差可能存在问题,只需要中心节点考虑时钟误差即可。
按照经验,Lease的时间差一般取1-10s即可。太短网络压力大,太长则,收回承诺时间过长,影响可用性。
应用
-
GFS(Google 文件系统)中,Master通过Lease决定哪个是主副本,Lease在给各个节点的心跳响应中携带。
收不到心跳,则等待Lease过期,然后在颁发给其他节点。
-
chubby中,paxos选主后,从节点会给主办法lease,在期限内,不允许选择其他节点为主。
主节点给client发送lease,用于判断client是否存活。