1、提出问题如果群集中有n个节点,则最安全的方法是在一个节点写入后,同步到其馀的N-1个节点,然后向客户端返回ok,但如果其中一个节点同步失败,则整个群集中将无法使用。 在此基础上能稍微提高可用性吗
3表示,多数派集群节点被设定为如果奇数同步成功超过集群内的N/2节点,则向客户端返回ok,但存在顺序性问题
多数派的写入操作成功后的读取整合性,虽然不认为下图的2个操作满足多数派的通过,但是S3这个服务与S1S2不一致,必须达到多数派内部的整合性
2、Paxos Paxos以共识算法为目的,是解决前面所述的写多数派时的顺序性问题
Paxos角色分区群集中的每个节点都充当
宣传者负责提案的生成
注意在Paxos算法中,虽然可以同时提出多个代理,但有可能引起锁定问题
加速器负责批准提案
如果只有一个加速器,则应该有多个,因为存在单点问题
Learner负责在提案加速器批准提案后,将提案发送给所有Learner
执行一个修改操作并不会立即分为两个阶段
准备阶段Proposer负责接收client请求并生成提案,多数派的加速器必须批准并通过提案
当您将接受阶段建议并执行的修改操作广播到Acceptor时,此修改仍然会启用许多派,以便对客户端做出响应
3、算法要点
整个算法分为两个阶段预备阶段的前两个箭头来接受阶段后的两个箭头。
预备阶段的目的,首先是拦截旧的提案,其次是找到最新的acceptValue
对于专业人士
预备阶段只发送提案编号接受阶段,发送提案编号值
提案编号n是唯一的、全球增加的提案编号具有更高的优先级
查看最新接受的值时,proper将替换自身的原始值以保证一致性
对于加速器,以下信息将被永久保存
最小建议号将在初步和接受阶段更新为更大的建议号,用于确定宣传者是否可以选择建议
acceptN接受建议编号,acceptValue接受的值将在接受阶段更新。 如果是minN n,则不会更新
4、示例1 P广播建议编号1
3个a接受提案时,满足n minN将minN更新为1
3个a正常返回p收到的响应超过一半,但没有遇到更多的acceptNo和acceptValue,所以使用自己的value X
p广播建议编号和值1:X
3个a接收提案编号和值的更新状态,将minN值1返回p
p接收并检查过半数的应答,如果发现没有出现minN 1,则检查提案值x
5、例2
S1想把广播提案号码1值更新为x
S5我想把广播提案号码2值更新为y
S1、S2、S3已经经过了Accept阶段,选择了值x
关键点S3也接受了S5的prepare提案,此时有不一致的地方吗
此时,如果S3状态将acceptN和acceptValue分别更新为1:X,并返回到S5的ack,则13360x将返回到S5
S5将自己的原始值y置换为返回的x,执行后续的过程后与x同步
6、例3
S1想把广播提案号码1值更新为x
S5我想把广播提案号码2值更新为y
S1、S2、S3已经经历了Accept阶段,与例2不同的是还没有选择值x
关键点S3也接受了S5的prepare提案,此时有不一致的地方吗
此时,如果S3状态为将acceptN和acceptValue分别更新为1:X,然后返回S5的ack,则13360x将返回S5
S5将自己的原始值y置换为返回的x,执行后续的过程后与x同步
7、例4
S1想把广播提案号码1值更新为x
S5我想把广播提案号码2值更新为y
如果点S3还没有经过Accept阶段就得到了S5的prepare提案,此时会不会有不一致呢
S3在收到S1的accept请求时,由于nminN条件不成立,所以不更新acceptN和acceptValue,返回的minN为2
对S1来说,S3返回的minN大于n,如果选举失败试图更新x,就有必要开始新的提案
在S5中,accept阶段发送自己的2:Y,然后将值同步到y
8、例5
回顾最初提到的顺序问题,确认Pax操作系统是否能解决它
下图显示了分析过程的参考示例3,说明了Pax操作系统如何解决顺序问题
9、Paxos缺点效率低的两轮操作只能选择一个值
很难理解
生摇滚问题
因为Paxos允许多个Proposer,所以如上图所示执行时,下一个方案总是无法选择上一个方案,明显会出现死循环
参考资料
https://www.youtube.com/watch? vJEpsBg0AO6ot41s Raft的作者就Paxos进行了说明