分布式系统原理(4)--Lease机制

Lease机制是最重要的分布式协议,其最重要的应用:判定节点状态

(1)基于lease的分布式cache系统

l  设计原因:分布式系统中各种操作都依赖于元数据,若仅由中心服务器节点存储维护,则该节点的性能会成为系统的瓶颈。

l  设计思路:元数据cache,在各个节点上cache元数据信息,减少对中心服务器节点的访问,提高性能。

l  设计要求:各个节点上cache的数据要始终与中心服务器上的数据阈值,不能是旧的脏数据;cache系统要能最大可能的处理节点宕机、网络中断等异常,最大程度的提高系统的可用性。

l  基本原理:中心服务器在向各节点发送数据的同时向节点颁发一个lease,每个lease有一个有效期。

n  基于lease的cache,客户端节点读取元数据的流程

1. 判断元数据是否已经处于本地cache且lease处于有效期内

       1.1 是:直接返回cache中的元数据

       1.2 否:向中心服务器节点请求读取元数据信息

              1.2.1 服务器收到读取请求后,返回元数据及一个对应的lease

              1.2.2 客户端是否成功收到服务器返回的数据

                     1.2.2.1失败或超时:退出流程,读取失败,可重试

                     1.2.2.2成功:将元数据与对应lease记录到内存中,返回元数据

n  基于lease的cache,客户端节点修改数据流程

1. 节点向服务器发起修改元数据请求

2. 服务器收到修改请求后,阻塞所有新的读请求,即接收读请求,但不返回数据

3. 服务器等待所有与该元数据相关的lease超时

4. 服务器修改元数据并向客户端节点返回修改成功

l  容错关键:客户端cache元数据的唯一标准时lease超时,服务器只要等待lease超时就可以修改数据,而不破坏cache的一致性

l  优化改进:

a)对修改数据中的步骤2,服务器进入修改元数据流程后,一旦收到读请求,则只返回数据但不颁发lease,即用户只能读不能缓存;或lease有效期选已发出lease的最大有效期,用户既可以读,服务器也不用延长cache更新时间

b)针对步骤2带来的时延,可服务器主动通知各个持有lease的节点放弃lease并清除cache中的数据,若服务器收到确认放弃lease的消息,则不需等待该lease超时,若未收到,则继续等到即可,不影响正确性。

l  cache机制与多副本机制的区别

相同点:都是将一份数据保存在多个节点上

不同点:

a)cache机制简单,可随时丢弃,其后果仅是需访问数据源读取数据

b)副本不能随意丢弃,每是去一个副本,服务质量都在下降,副本数下降到一定程度,服务将不再可用

(2)lease机制的分析

l  lease定义:lease是由颁发者授予的在某一有效期内的承诺,颁发者一旦发出lease,则无论接收方是否收到,也无论后续接收方处于何种状态,只要lease不过期,颁发者一定严守承诺,另一方面,接收方在lease有效期内可以使用颁发者的承诺,但一旦lease过期,接收方一定不能继续使用颁发者的承诺

l  优点

n  有很高的容错能力

a)可容错网络异常,lease颁发是单向通信,可通过重发解决接收失败问题,一旦接受,后续不依赖网络通信,即使网络中断也无影响。

b)可容错节点宕机,宕机颁发者也无法改变之前承诺,恢复后可继续遵守,接收方宕机,只需等lease超时,收回承诺即可

n  不依赖于存储,持久化颁发的lease信息,可在宕机恢复后使有效期内lease继续有效,但这只是优化,继续不保存,也可通过等待最大lease时间使得所有lease失效,保证机制继续有效

l  缺点

lease机制依赖于有效期,要求颁发者和接收者时钟同步。

a)若颁发者时钟慢于接收者,则当接收者认为已过期时,颁发者认为依旧有效。

改进:接收者可在lease到期前申请新的lease

b)若颁发者时钟快于接收者,则当颁发者认为已过期时,接收者认为依旧有效。颁发者可能将lease发给其他节点,造成承诺失效,影响系统正确性。

改进:将颁发者有效期设的比接收者略大,只需大过时钟误差即可。

(3)基于lease机制确定节点状态

存在问题:

由于可能存在网络分化,拥塞,延迟,节点状态无法通过网络通信来确定,如监控节点确定primary节点故障,从而选新primary过程,就可能造成“双主”问题。

解决思路:

1. 设计的分布式协议可以容忍“双主”错误,即不依赖于对节点状态的全局一致性认识,或者全局一致性状态是全体协商后的结果,改用去中心化设计。

2. 利用lease机制,由中心节点向其他节点发送lease,若某个节点持有有效的lease,则认为该节点正常可以提供服务。

举例:如A/B/C周期发送heart beat报告自身装入,Q接收到heart beat后发一个lease,表示确定了A/B/C状态,并允许节点在lease有效期内正常工作,Q可以给primary节点一个特殊的lease,表示节点可以作为primary工作,一旦Q希望切换新的primary,只需等前一个primary的lease过期,则可安全颁发新的lease给新的primary节点,避免“双主”问题。

改进:中心节点不应该是一个,一旦宕机或网络异常,则所有节点没有lease,系统高度不可用,实际系统总是使用多个中心节点互为副本,成为一个小集群,具有高可用性,对外颁发lease功能,chubby和zookeeper都是这样设计的。

(4)lease的有效期时间选择

l  太短:如1s,一旦出现网络抖动lease很容易丢失,造成依赖lease 的服务不稳定

l  太长:如1min,一旦某节点宕机,需要较大时间等待lease过期才能发现节点异常

l  工程:一般时长10s级别,经验值

(5)工程投影

a)GFS中的Lease

GFS中使用Lease确定Chuck的Primary副本。Lease由Master节点颁发给primary副本,持有Lease的副本成为primary副本,控制该chuck的数据更新流量,确定并发更新操作在chuck上的执行顺序。GFS中的Lease信息由Master在响应各个节点的HeartBeat时附带传递(piggyback)。当GFS的master失去某节点的HeartBeat时,只需待该节点上的primarychuck的lease超时,就可以为这些chuck重新选择primary副本并颁发lease

b)Niobe中的Lease

l  Niobe中也是通过lease机制维持primary副本的选择,不同的是Niobe中的lease是由secondary节点向primary发送。

l  Niobe中有一个高可用的全局元数据服务节点称为GSM(global state manager),其上的元信息有唯一地址的版本号(称为epoch),每次更新该元信息都必须附带提交之前读取到的版本号,并进行condition-write,即GSM会检验客户节点提交的版本号是否与当前的版本号相同,若相同则允许提交更新操作,并递增版本号,否则更新失败,从而实现了元信息更新的全局顺序一致

l  在Niobe协议中,每个Sencondary副本都会给Primary副本发Lease,含义是,在Lease时间内,本副本承认你是Primary节点。一旦出现primary失去某个secondary的lease,primary和secondary都尝试kill对方,secondary在kill对方的同时还尝试成为新的primary。当primary失去某secondary的lease后,primary会立刻尝试修改GSM中的元信息,将该secondary在元信息中标记为“不可用”,从而kill掉secondary,被kill掉的secondary只有重新与primary同步后才会被重新标记为“可用”并提供服务。而当某个secondary因不能与primary通信,造成无法给primary发送lease后,在lease超时后,也会尝试修改GSM,将primary标记为“不可用”且将primary设置为自己。由于在GSM上更新操作靠epoch实现全局一致。primary与secondary相互kill对方的操作有且只有一个会成功,失败的那个副本需重新读取GSM的元数据后才能发起新的更新元数据操作,如果被对方kill,那么重新读取元数据时会发现自己已经被设置为“不可用”从而无法再kill对方。

c)Chubby与Zookeeper中的Lease

l  Chubby中有两处使用到Lease机制

1. chubby通过paxos协议实现去中心化的选择primary节点,一旦某节点获得了超过半数的节点认可,该节点成为primary节点,其余节点成为secondary节点。secondary节点向primary节点发送lease,含义是“承诺在lease时间内,不选举其他节点成为primary节点”。只要primary节点持有超过半数节点的lease,那么剩余的节点就不能选举出新的primary。一旦 primary 宕机,剩余的secondary 节点由于不能向 primary 节点发送 lease,将发起新的一轮 paxos选举,选举出新的 primary 节点。这种由secondary 向 primary 发送lease 的形式与 niobe 的 lease 形式有些类似。

2.primary节点也会向每个client节点办法lease,含义是“确定client的死活状态”,一个client只有具有合法的lease,才能与chubby中的primary进行读写操作。一个client如果占有chubby中的一个节点锁后lease超时,那么这个client占有的chubby锁会被自动释放,从而实现了利用chubby对节点状态进行监控的功能。另外,chubby中client中保存有数据的cache,故此chubby的primary为cache的数据颁发cache lease,上两个lease可合并为一个。

l  Zookeeper中的Lease机制

secondary不向primary发送lease,当发现没有primary时,secondary会发起新的paxos选举,只要primary和secondary工作正常,新选举由于缺少多数secondary参加而不会成功。

primary节点会向client颁发lease,时间正是zookeeper中的session时间。在zookeep中,临时节点是与session的生命期绑定的,当一个client的session超时,那么这个client创建的临时节点会被自动删除。通过监控临时节点的状态,也容易实现对节点状态的控制。

d)间接使用Lease

直接实现 lease机制的确会对增加系统设计的复杂度。然而,由于有类似 Zookeeper 这样的开源的高可用系统,在工程中完全可以间接使用 Lease。借助 zookeeper,我们可以简单的实现高效的、无单点选主、状态监控、分布式锁、分布式消息队列等功能,而实际上,这些功能的实现都是依赖于背后 zookeeper与 client 之间的 Lease 的。


猜你喜欢

转载自blog.csdn.net/summer00072/article/details/80720077
今日推荐