Acceptor: Acceptor收到accept请求后,分为两种情况:
- 如果发送的提案请求N大于此前保存的RespN,接受提案,设置AcceptN = N, AcceptV=V, 并且回复ok 。
- 如果发送的提案请求N小于等于此前保存的RespN,不接受,不回复或者回复error 。
第三阶段: Learn学习阶段
Learner: Proposer收到多数Acceptor的Accept后,决议形成,将形成的决议发送给所有Learner 。
文章插图
Paxos应用案例前面讲述了paxos算法细节,可能你还是不明白paxos算法在实际场景中有什么用处,我们现在讲个实际的使用案例 。
我们以一个分布式的KV数据库为例,分析Paxos的应用场景 。
文章插图
3个server组成一个分布式内存数据库,他们的状态必须保持同步,也就是每个server 节点都需要维护有顺序的操作日志,同时保持一致 。
+---+-------------+|1|Put("a", 1)|+---+-------------+|2|Put("b", 2)|+---+-------------+|3|Put("c", 3)|+---+-------------+
多个客户端并发在发送请求的时候,服务端多个节点需要协商,选择其中一个大家都认可的数据(指令), 存入到操作表中,这里协商确定指令的过程就是Paxos 。比如我们将paxos算法封装到下面的方法中:
Op doPaxos(int seq, Op v){...}
以上面图示的例子详细分下这个过程:- Cient2向集群发送了请求Put("b", 2),假设这个请求最终到了server1上 。
- Client3向集群发送了请求Put("c", 3), 假设这个求情发到了server2上 。
- server2调用doPaxos函数进行协商,即询问集群中的所有server咱们的第2个操作能否为Put("c", 2)
- 此时server3也调用doPaxos函数进行协商,即询问集群中的所有server咱们的第2个操作能否为Put("c", 3)
- 这是Paxos只会选择其中1个提案,我们这里假设server2的议题最终被通过了,集群中所有server的状态表都新增Put("c", 2)
- server3发现自己的提案没有选中,他会对自己的database进行Put("b", 2)操作,然后重新升级提案编号,再次调用doPaxos方法,直到自己的提案被通过 。
根据前面讲述的Paxos算法流程,不知道大家有没有发现一个问题,如果两个Propser依次提出编号递增的提案,最终回陷入死循环,进入死锁状态,如下图:
文章插图
我们可以通过选取主Proposer,就可以保证Paxos算法的活性,这样是ZAB协议的由来 。
【深入浅出理解分布式一致性Paxos算法】
推荐阅读
- 深入浅出Flask PIN
- 4K电视正确的理解方式 什么是4K电视机
- 拉丁舞的文化融合 对2个拍子之间AND的理解
- 如何通俗理解人均GDP的含义? 人均gdp是什么意思
- 百里守约|职业赛场的顶尖思维,盘点路人局难理解,后来令你惊呼的玩法
- 怎样理解社保和养老保险 社保和养老保险有什么区别
- |从领导处得知了很多职场里的小道消息,也对一些职场里的规矩有了深刻的理解
- 从保利地产的年报理解地产生意 保利地产怎么样
- 中国成语典故 最难理解的十大成语典故有哪些
- 省考言语理解之歧义句辨析 歧义是什么意思