分布式一致性算法paxos和raft
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一, 分布式系统
定义
分布式系统是这样一种系统,它的各个组件分布在联网的若干台计算机上,通过传递消息进行相互通信和协同工作。
特点
•并发性:在没有协同的情况下,组件各自行事。
•没有全局时钟:目前的时间同步精度不够。
•故障无处不在:总是会发生各种各样的故障。
二, basic-Paxos算法原理:
1.Paxos算法解决的问题
是分布式系统如何对一个问题达成共识。
2.Paxos算法中的角色
从提案到表决流程涉及到三个角色:
•Proposer:提案者,可能有多个,它门负责提出提案。
•Acceptor:接受人,一定要有多个,它们对指定提案进行表决,同意则接受提案,不同意则拒绝。
•Learner:学习人,收集每位Acceptor接受的提案,并根据少数服从多数的原则,形成最终提案。
实际上,分布式系统中一个组件可以对应一种或多种角色。
3.Paxos算法描述
•第一阶段(Prepare阶段)
Proposer:
o选取提案编号n,并向大多数Acceptor发送携带编号n的prepare请求。
Acceptor:
o如果收到的提案编号n比自己已经收到的编号都要大,则向Proposer 承诺不再接收编号小于n的提案,如果之前接受过提案,则同时将接
受的提案中编号最大的提案及其编号发给Proposer。
o如果收到的提案编号n小于自己已经收到提案编号的最大值,则拒绝。
•第二阶段(Accept阶段)
Proposer:
o首先,对接收到响应,逐条处理:
▪如果接收到拒绝,则暂不处理。
▪如果接收到同意,同时还接收到Acceptor已经接受的提案,则
记下该提案及编号。
o处理完响应后,统计拒绝和同意个数:
▪如果大多数拒绝,则准备下次提案。
▪如果大多数同意,从这些Acceptor已经接受的提案中选取提案
编号最大的提案作为自己的提案,没有则使用自己的提案,逐
个向Acceptor发送Accept消息。
Acceptor:
o如果收到的提案编号n小于自己已经收到最大提案编号,则拒绝。
o如果收到的提案编号n等于自己已经收到最大提案编号,则接受该提案。
o如果收到的提案编号n大于自己已经收到最大提案编号,则拒绝。
•形成共识(与Prepare&Accept阶段并行)
Acceptor:
o每当接受一个提案,则将该提案及编号发给Learner。
Learner:
o记录每一个Acceptor当前接受的提案,一个Acceptor先后发来多个提案,则保留编号最大的提案。
o统计每个提案被接受的Acceptor个数,如果超过半数,则形成共识。
三, multi-paxos算法:
1. 选主阶段
Multi Paxos一边先运行一次完整的paxos算法选举出leader,有leader处理所有的读写请求,然后省略掉prepare过程.
PS:
因为 Paxos 协议的基本保证就是一旦形成决议,就不能更改,那么再次选新主就没办法处理了。因此对“选主”,需要变通一下思路,还是执行 Paxos 协议,但是我们并不关心决议内容,而是关心“谁成功得到了多数派的 AcceptRespo nse”,这个 Server 就是选主产生的 Leader。而多轮选主,就是针对同一个 Paxos Instance 反复执行,最后赢得多数派 Accept 的 Server 就是“当选Leader”。
2, 提交阶段
Multi Paxos要求在各个Proposer中有唯一的Leader,并由这个Leader唯一地提交value给各Acceptor进行表决,在系统中仅有一个Leader进行value提交的情况下,Prepare的过程就可以被跳过, 变成了一个一阶段的递交协议:
一阶段a:client经过发起者(leader)直接告诉Acceptor,准备递交协议号为I +1的协议
一阶段b:收到了大部分acceptor的回复后(超过半数),leader就直接回复client 协议成功写入
四, paxos算法应用场景
1, 高可靠的分布式锁实现:
1, client(1,2)向Proposer(leader)发起lock请求
2, leader将该lock记录发给所有的acceptor
3, 超过半数的acceptor接受该lock记录, 则认为lock成功, 返回给client
4, 每个lock都有一个lock number, 这个是递增的整数, 当恢复时, lock number最大, 而且存在大部分的acceptor上, 则被认为lock成功
5, 如果client1,2发现lock失败(leader异常), 获取想释放lock, 都必须调用unlock, 该过程和lock一样, 都需要acceptor记录该lock状态的转变.
Client异常恢复:
1, 假设client1获取锁成功, 并异常
2, leader必须复制检查client1是否存在(headbeat), 如果client1异常,
则将client1的lock释放
Leader异常恢复:
1, 新选举leader
2, 新选举的leader必须从accept中获取所有的locker记录,
超过半数的acceptor有记录的lock, 被认为是合法的
3, 同步这些locker记录, 恢复locker的状态, 后开始工作
4, leader的locker记录必须是最权威的
Acceptor异常恢复:
1, 从leader的记录中恢复locker的状态, 并开始工作
2, paxos状态机(高可用状态机)
状态机认为, 只有初始状态和事件的执行顺序是一样的, 那么状态机器的结果必然也是一致的
当有server1, server2, server3组成一个分布式状态机的时候, 先需要考虑
使用paxos来保证状态记录的一致性和事件的执行顺序的一致性, 这样就可以无差别的恢复状态机, 保证了状态机的高可用
1, multip-paxos保证事件的顺序是event1(seq=1), event5(seq=2), event3(seq=3), 这个顺序即使在异常发生后, 恢复也是保证不变的
2, 状态机1按照顺序执行事件event1, event5, event3, 记录最新的seq=2号,
并且经过paxos记录当然状态(status)
3, 状态机1在执行的过程中发生任何异常, 执行中断
4, paxos有高可靠保证, 可以获取状态记录(status)和有序事件记录(event1, event2, event3),
5, 根据状态(status)恢复状态机2, 根据status记录的最新seq, 假设seq=1
表示当前状态是已经执行了event1, 但是event2(seq=2), event5(seq=3)还没执行, 继续执行event2和event5,
6, 状态机2的最终结果和状态机1在没有发生异常的情况下的最终结果是一致,