分布式系统一致性Paxos算法模型提出(Paxos 问题)

考虑一个故事:

    希腊岛屿Paxon 上的执法者(legislators,后面称为牧师priest)在议会大厅(chamber)中表决通过法律,并通过服务员传递纸条的方式交流信息,每个执法者会将通过的法律记录在自己的账目(ledger)上。问题的难点在于执法者和服务员都会随时因为各种事情离开议会大厅,并随时可能有新的执法者(或者是刚暂时离开的)回到议会大厅进行法律表决。现在要解决的问题是使用何种方式能够使得这个表决过程正常进行,且通过的法律不发生矛盾。在Paxon中的法律通过投票(ballots)完成,每次投票涉及到的一群牧师称为法定人数(quorum),当且仅当法定人数中的所有牧师都赞成这个法案时,投票成功并通过该法律。

那么选举怎么才会成立呢?一次法律的投票选举定义为B。做了三个约定:

Law1、投票选举B中,每个选举都有一个独一无二的选举编号。

Law2、投票选举B中,每两个选举至少有一个共同的牧师。

Law3、投票选举B中,每一次选举B ,如果其法定人数中任意牧师在之前的一次选举中赞成,那么这次选举B等于之前一次有B 中牧师赞成的选举。即新的法律等于所有参与选举牧师中投赞成票的法律。

从故事中可以看出:

    故事中的议会大厅就是我们的分布式系统,每个牧师就是对应的每个节点或者进程,服务员传递纸条的过程即通信的过程,法律即是我们需要保证一致性的值(value)。牧师和服务员的进出对应着节点/网络的失效和加入,牧师的账目对应节点持久化存储设备。上面表决过程正常进行可以进一步表述为过程需求(progress requirements):当大部分牧师在议会大厅呆了足够长时间,且期间没有牧师进入或者退出,那么提出的法案应该被通过并被记录在每个牧师的账目上。如果要对集群中的数据库节点进行数据更新时候,每个key-value 有多个副本,客户端发起一个update(key,vaule) 的操作,则会产生由一个节点发起、相关节点进行响应的一次一致性操作,即选举B。对保存了该key-value 的副本进行更新。需要注意的是法定人数牧师是所有保存这个key-value 副本的节点的一个大部分子集,因为可能在某些时候某些保存这个key-value 副本的节点不可达。B 是关于某个key-value 的一系列更新操作,不同的法律实际上是一个key-value 的不同值。那么三个约定就好明白了,Law1指一次只进行一个更新操作;Law2指每两次更新操作必须有共同的节点参与;Law3指某次key-value 操作的key-value 值与所有参与节点中之前进行投赞成票的最新值一致。这是因为如果某个节点在之前已经投票,说明它已经确认可以修改该值,而其他法定人数的牧师/节点还没有确认该值。



你可能感兴趣的:(分布式系统一致性Paxos算法模型提出(Paxos 问题))