Paxos算法

Paxos算法的作用

Paxos一致性算法主要是解决分布式数据一致性问题。当集群中发生某个错误导致数据可能出现不一致,我们有两个问题要解决:1. 集群中任何节点在决议的过程中中段或者失去服务能力的情况下(故障节点不能超过一半),都能让数据保持一致;2. 投票选举多数派能够让数据损失在保证1的情况下达到最小,而Paxos算法能够解决这两个问题。

关于描述paxos算法写的最好的一篇文章应该就是维基百科了地址戳这里

学习Paxos的思想前提

  1. 当集群中出现违反一致性的状况发生后,可以用Paxos算法实现一致性;
  2. 在执行Paxos算法过程中,集群任何节点都是不可靠的;
  3. Paxos算法并不是达到理想中最完美的方式,而是在错误的情况下达到能够做到的现实中最完美的方式;
  4. 一种部署方式可以是:节点既是proposers,又是acceptors,还是learners,在节点中实现了Paxos算法。

Paxos算法约束


  1. 决议(value)只有在被proposers提出后才能被批准(未经批准的决议称为“提案(proposal)”);
  2. 在一次Paxos算法的执行实例中,只批准(chosen)一个value;
  3. learners只能获得被批准(chosen)的value。

首先将议员的角色分为proposers,acceptors,和learners(允许身兼数职)。proposers提出提案,提案信息包括提案编号和提议的value;acceptor收到提案后可以接受(accept)提案,若提案获得多数acceptors的接受,则称该提案被批准(chosen);learners只能“学习”被批准的提案。划分角色后,就可以更精确的定义问题:

角色约束

这里写图片描述
proposers
p2b:一旦一个具有value v的提案被批准(chosen),那么以后任何proposer提出的提案必须具有value v(由于通信是异步的,P2a和P1会发生冲突才提出的进一步约束)。
acceptors
p1:一个acceptor必须接受(accept)第一次收到的提案;
P1a:当且仅当acceptor没有回应过编号大于n的prepare请求时,acceptor接受(accept)编号为n的提案;
p2a:一旦一个具有value v的提案被批准(chosen),那么之后任何acceptor再次接受(accept)的提案必须具有value v。
value
p2:一旦一个具有value v的提案被批准(chosen),那么之后批准(chosen)的提案必须具有value v。
learners
只能“学习”被批准的提案。
leader:当完成上面的约束后,满足条件p2c的成为新的leader
p2c:如果一个编号为n的提案具有value v,那么存在一个多数派,要么他们中所有人都没有接受(accept)编号小于n 。

决议的提出与批准

准备阶段(prepare):
1. proposer选择一个提案编号n并将prepare请求发送给acceptors中的一个多数派;
2. acceptor收到prepare消息后,如果提案的编号大于它已经回复的所有prepare消息,则acceptor将自己上次接受的提案回复给proposer,并承诺不再回复小于n的提案;
批准阶段(chosen):
1. 当一个proposer收到了多数acceptors对prepare的回复后,就进入批准阶段。它要向回复prepare请求的acceptors发送accept请求,包括编号n和根据P2c决定的value(如果根据P2c没有已经接受的value,那么它可以自由决定value);
2. 在不违背自己向其他proposer的承诺的前提下,acceptor收到accept请求后即接受这个请求。

这个过程在任何时候中断都可以保证正确性。例如如果一个proposer发现已经有其他proposers提出了编号更高的提案,则有必要中断这个过程。因此为了优化,在上述prepare过程中,如果一个acceptor发现存在一个更高编号的提案,则需要通知proposer,提醒其中断这次提案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章