加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

【分布式】Chubby与Paxos

发布时间:2016-10-29 00:46:06 所属栏目:教程 来源:站长网
导读:副标题#e# 一、前言 在上一篇理解了Paxos算法的理论基础后,接下来看看Paxos算法在工程的应用。 二、Chubby Chubby是一个面向松耦合分布式系统的锁服务,GFS(Google File System)和Big Table等大型系统都是用它来解决分布式协作、元数据存储和Master选举

  在客户端进入危险状态时,客户端会通过一个“jeopardy”事件来通知上层应用程序,如果恢复正常,客户端同样会以一个“safe”事件来通知应用程序可以继续正常运行,但如果客户端最终没能从危险状态中恢复过来,那么客户端会以一个“expired”事件来通知应用程序当前Chubby会话已经超时。

  2.10 Master故障恢复

  Master服务端会运行着会话租期计时器,用来管理所有的会话的生命周期,如果Master在运行过程中出现故障,那么该计时器就会停止,直到新的Master选举产生后,计时器才会继续计时,即从旧的Master崩溃到新的Master选举产生所花费的时间将不计入会话超时的计算中,这就等价于延长了客户端的会话租期,如果Master在短时间内就选举产生了,那么客户端就可以在本地会话租期过期前与其创建连接,而如果Master的选举花费了较长的时间,就会导致客户端只能清空本地的缓存而进入宽限期进行等待,由于宽限期的存在,使得会话能够很好地在服务端Master转化的过程中得到维持,整个Master的故障恢复过程中服务端和客户端的交互情况如下

【分布式】Chubby与Paxos

  如上图所示,一开始在旧的Master服务器上维持了一个会话租期lease M1,在客户端上维持对应的lease C1,同时客户端的KeepAlive请求1一直被Master服务器阻塞着。一段时间后,Master向客户端反馈了KeepAlive响应2,同时开始了新的会话租期lease M2,而客户端在接收到该KeepAlive响应后,立即发送了新的KeepAlive请求3,并同时也开始了新的会话租期lease C2。至此,客户端和服务端的交互都是正常的,随后,Master发生了故障,从而无法反馈客户端的KeepAlive请求3,在此过程中,客户端检测到会话租期lease C2已经过期,它会清空本地缓存并进入宽限期,这段时间内,客户端无法确定Master上的会话周期是否也已经过期,因此它不会销毁它的本地会话,而是将所有应用程序对它的API调用都阻塞住,以避免出现数据不一致的现象。同时,在客户端宽限期开始时,客户端会向上层应用程序发送一个“jeopardy”事件,一段时间后,服务器开始选举产生新的Master,并为该客户端初始化了新的会话租期lease M3,当客户端向新的Master发送KeepAlive请求4时,Master检测到该客户端的Master周期号已经过期,因此会在KeepAlive响应5中拒绝这个客户端请求,并将最新的Master周期号发送给客户端,之后,客户端会携带上最新的Master周期号,再次发送KeepAlive请求6给Master,最终,整个客户端和服务端之间的会话就会再次回复正常。

  在Master转化的这段时间内,只要客户端的宽限足够长,那么客户端应用程序就可以在没有任何察觉的情况下,实现Chubby的故障恢复,但如果客户端的宽限期设置得比较短,那么Chubby客户端就会丢弃当前会话,并将这个异常情况通知给上层应用程序。

  一旦客户端与新的Master建立上连接之后,客户端和Master之间会通过互相配合来实现对故障的平滑恢复,新的Master会设法将上一个Master服务器的内存状态构建出来,同时,由于本地数据库记录了每个客户端的会话信息,以及持有的锁和临时文件等信息,因此Chubby会通过读取本地磁盘上的数据来恢复一部分状态。一个新的Master服务器选举之后,会进行如下处理。

  ① 确定Master周期。Master周期用来唯一标识一个Chubby集群的Master统治轮次,以便区分不同的Master,只要发生Master重新选举,就一定会产生新的Master周期,即使选举前后Master是同一台机器。

  ② 新的Master能够对客户端的Master寻址请求进行响应,但是不会立即开始处理客户端会话相关的请求操作。

  ③ Master根据本地数据库中存储的会话和锁信息来构建服务器的内存状态。

  ④ 至此,Master已经能够处理客户端的KeepAlive请求,但仍然无法处理其他会话相关的操作。

  ⑤ Master会发送一个Master故障切换事件给每一个会话,客户端接收到这个事件后,会清空它的本地缓存,并警告上层应用程序可能已经丢失了别的事件,之后再向Master反馈应答。

  ⑥ 此时,Master会一直等待客户端的应答,直到每一个会话都应答了这个切换事件。

  ⑦ Master接收了所有客户端的应答之后,就能够开始处理所有的请求操作。

  ⑧若客户端使用了一个故障切换之间创建的句柄,Master会重新为其创建这个句柄的内存对象,并执行调用,如果该句柄在之前的Master周期中就已经被关闭了,那么它就不能在这个Master周期内再次被重建了,这一机制就确保了由于网络原因使得Master接收到那些延迟或重发的网络数据包也不会错误的重建一个已经关闭的句柄。

三、Paxos协议实现

  Chubby服务端的基本架构大致分为三层

  ① 最底层是容错日志系统(Fault-Tolerant Log),通过Paxos算法能够保证集群所有机器上的日志完全一致,同时具备较好的容错性。

  ② 日志层之上是Key-Value类型的容错数据库(Fault-Tolerant DB),其通过下层的日志来保证一致性和容错性。

  ③ 存储层之上的就是Chubby对外提供的分布式锁服务和小文件存储服务。

【分布式】Chubby与Paxos

  Paxos算法用于保证集群内各个副本节点的日志能够保持一致,Chubby事务日志(Transaction Log)中的每一个Value对应Paxos算法中的一个Instance(对应Proposer),由于Chubby需要对外提供不断的服务,因此事务日志会无限增长,于是在整个Chubby运行过程中,会存在多个Paxos Instance,同时,Chubby会为每个Paxos Instance都按序分配一个全局唯一的Instance编号,并将其顺序写入到事务日志中去。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读