Paxos
节点角色
- Proposer:用于接收客户端的请求,客户端的请求到达 Proposer 之后,它会将这个请求封装为提案,然后把这个提案广播给所有的 Acceptor。
- Acceptor:决定是否批准提案,会给 Proposer 返回一个类似于 yes or no 的响应。Proposer 根据响应情况决定是否要执行下一阶段。
- Learner:用于获得一个已达成共识的提案,然后将它输入到状态机。
提案
- Value:提案的值
- Number:提案编号
prepare 阶段
- prepare(N)请求:Proposer 提出一个提案,编号为 N(编号是递增的),向所有的 Acceptor 广播,注意这里只发送编号没有内容。当 Proposer 收到集群中大多数的 Acceptor 的同意之后,它拥有本轮提出提案的所有权,可以进入 Accept 阶段。
- promist(n, value)返回:Acceptor 在收到 prepare 请求时,如果 N 大于该 Acceptor 此前接收的所有提案编号就接收(并承诺不再接收比 N 小的提议),并且如果该 Acceptor 存在已经同意的提案(经过第二阶段 Accept 的提案),返回这个提案的编号和内容,否则返回空值表示接收即可。
accept 阶段
- accept(N,value)请求:Proposer 收到多数派的响应,从 prepare 响应中选取提案编号最大的 value 作为本次提交的值。如果响应中不包含任何提案,那么 value 就由 Proposer 决定。
- accepted(N)返回:Acceptor 在接收到一个编号为 N 的提案的 Accept 请求时,如果在此期间没有任何编号大于 N 的提案,就接受提案内容否则就拒绝。当 Proposer 收到超过半数的 Acceptor 的响应后,提案达成共识,否则 Proposer 会重新进入第一阶段,递增提案编号,重新发出 Prepare 请求。
存在的问题
参考
标签:请求,Proposer,编号,提案,Paxos,Acceptor From: https://www.cnblogs.com/zyb993963526/p/16589732.html