欢迎来到扬州恩信交通器材有限公司官网!

交通信号灯被设计成个需要访问中心化节点的


  Paxos 协议是一个解决分布式系统中,多个节点之间就某个值(提案)达成一致(决议)的通信协议。但Paxos算法晦涩难懂,原版论文也是让人难以理解。故有了本文,希望给大家提供一点思路。

  Proposer:提议发起者,处理客户端请求,将客户端的请求发送到集群中,以便决定这个值是否可以被批准。

  Acceptor:提议批准者,负责处理接收到的提议,他们的回复就是一次投票。会存储一些状态来决定是否接收一个值。

  1a promise 承诺:acceptor承诺只接收协议号的协议(包括prepare和accept),并拒绝比当前协议号N小的协议,回复proposer之前接收的所有协议值。如果当前协议号N比之前都小,那么回复拒绝。交通信号灯

  4.后的结果是,S1和S2的值是red,而S3,S4和S5的值是blue,没有达成一致。所以两阶段必不可少,Prepare阶段的作用是阻塞旧的提议,并且返回已经接收到的acceptedProposal。

  1.将提议进行排序,可以为每个提议赋予一个的ID,规定这个ID越大越新,很明显(5,blue)和(1,red),5比1大,所以保留blue

  很多文章有误解说Muti-Paxos是一阶段提交,那是仅限于leader稳定时。刚选出来一个新的leader时,依然是二阶段提交如下图:

  Multi Paxos中leader用于避免活锁(例如1个leader,4个Proposer,2个提议A,2个提议B不能达成一致,导致活锁),但leader的存在会带来其他问题,一是如何选举和保持leader(虽然无leader或多leader不影响一致性,但影响决议进程progress),二是充当leader的节点会承担更多压力,如何均衡节点的负载。Mencius[1]提出节点轮流担任leader,以达到均衡负载的目的;租约(lease)可以帮助实现leader,但leader故障情况下可导致服务短期不可用。

  Google Chubby是一个高可用分布式锁服务,被设计成一个需要访问中心化节点的分布式锁服务。本文只分析chubby服务端的实现。

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

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

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

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

  在Paxos中,每一个Paxos Instance都需要进行一轮或多轮的Prepare-Promise-Propose-Accept这样完整的二阶段请求过程来完成对一个提议值的选定,为了保证正确性的前提下尽可能地提高算法运行性能,可以让多个Instance共用一套序号分配机制,并将Prepare-Promise合并为一个阶段。具体做法如下:

  ① 当某个副本节点通过选举成为Master后,就会使用新分配的编号N来广播一个Prepare消息,该Prepare消息会被所有未达成一致的Instance和目前还未开始的Instance共用。

  ② 当Acceptor接收到Prepare消息后,必须对多个Instance同时做出回应,这通常可以通过将反馈信息封装在一个数据包中来实现,假设多允许K个Instance同时进行提议值的选定,那么:

  -当前之多存在K个未达成一致的Instance,将这些未决的Instance各自后接受的提议值封装进一个数据包,并作为Promise消息返回。

  -同时,判断N是否大于当前Acceptor的highestPromisedNum值(当前已经接受的的提议编号值),如果大于,交通信号灯那么就标记这些未决Instance和所有未来的Instance的highestPromisedNum的值为N,这样,交通信号灯这些未决Instance和所有未来Instance都不能再接受任何编号小于N的提议。

  ③ Master对所有未决Instance和所有未来Instance分别执行Propose-Accept阶段的处理,如果Master能够一直稳定运行的话,那么在接下来的算法运行过程中,就不再需要进行Prepare-Promise处理了。但是,一旦Master发现Acceptor返回了一个Reject消息,说明集群中存在另一个Master并且试图使用更大的提议编号发送了Prepare消息,此时,当前Master就需要重新分配新的提议编号并再次进行Prepare-Promise阶段的处理。
以上信息由扬州市旭瑞照明器材有限公司整理编辑,了解更多交通信号灯,红绿灯,标志牌信息请访问http://www.yzxrjt.com


在线客服

在线咨询

全国服务热线:
400-6699-897
咨询电话:
18014982991
二维码

打开微信扫一扫