参考 https://blog.csdn.net/u013679744/article/details/79222103
分布式系统
多个节点之间的两种通讯模型:共享内存、消息传递。
Paxos算法是基于消息传递的。Paxos的前提假设是不存在拜占庭将军问题,即:信道是安全的(信道可靠),发出的信号不会被篡改,否则该算法就不可靠。
如何保证消息没被篡改:数字签名等、
Paxos能达成一致的原因:过半数学原理: 我们称大多数(过半)进程组成的集合为法定集合,两个法定(过半)集合必然存在非空交集,即至少有一个公共进程,称为法定集合性质。
因此,当超过一半的Accepter接受某个提案A1后,Proposer再向多于半数的Accepter发送prepare请求时,至少包含一个Accepter是已经接受了上述提案A1的,Proposer的第二阶段的propose请求带的value必定是A1,收到A1的这些Accepter中,原本AcceptV是null或者更小提案编号对应的值的被变更为A1。后面所有Proposer发起请求都得到超过半数的A1的Accept,所有Accepter的值也达到一致。
活锁问题:一个Proposer在第二阶段未Accept之前,有另一个Proposer发送新的prepare请求,那么前一个一定会失败,因为超过半数的Accepter的ID已更新,前面的Proposer不可能得到超过半数的Accept。
解决办法:通过选取主Proposer,就可以保证Paxos算法的活性。选择一个主Proposer,并规定只有主Proposer才能提出议案。这样一来,只要主Proposer和过半的Acceptor能够正常进行网络通信,那么肯定会有一个提案被批准(第二阶段的accept),则可以解决死循环导致的活锁问题。