Paxos 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。一个典型的场景是,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点执行相同的操作序列,那么他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致。一个通用的一致性算法可以应用在许多场景中,是分布式计算中的重要问题。因此从20世纪80年代起对于一致性算法的研究就没有停止过。节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。Paxos 算法就是一种基于消息传递模型的一致性算法。 不仅仅是分布式系统中,凡是多个过程需要达成某种一致的场合都可以使用Paxos 算法。一致性算法可以通过共享内存(需要锁)或者消息传递实现,Paxos 算法采用的是后者。Paxos 算法适用的几种情况:一台机器中多个进程/线程达成数据一致;分布式文件系统或者分布式数据库中多客户端并发读写数据;分布式存储中多个副本响应读写请求的一致性。
这个故事摘自《以两军问题为背景来演绎Basic Paxos》,感谢作者的分享,Paxos 解决分布式一致问题,有点难理解,希望以后可以慢慢理解。
背景
在计算机通信理论中,有一个著名的两军问题(two-army problem),讲述通信的双方通过ACK来达成共识,永远会有一个在途的ACK需要进行确认,因此无法达成共识。
两军问题和Basic Paxos非常相似
1) 通信的各方需要达成共识;
2) 通信的各方仅需要达成一个共识;
3) 假设的前提是信道不稳定,有丢包、延迟或者重放,但消息不会被篡改。
Basic Paxos最早以希腊议会的背景来讲解,但普通人不理解希腊议会的运作模式,因此看Basic Paxos的论文会比较难理解。两军问题的背景大家更熟悉,因此尝试用这个背景来演绎一下Basic Paxos。
为了配合Basic Paxos的多数派概念,把两军改为3军;同时假设了将军和参谋的角色。
假设的3军问题
1) 1支红军在山谷里扎营,在周围的山坡上驻扎着3支蓝军;
2) 红军比任意1支蓝军都要强大;如果1支蓝军单独作战,红军胜;如果2支或以上蓝军同时进攻,蓝军胜;
3) 三支蓝军需要同步他们的进攻时间;但他们惟一的通信媒介是派通信兵步行进入山谷,在那里他们可能被俘虏,从而将信息丢失;或者为了避免被俘虏,可能在山谷停留很长时间;
4) 每支军队有1个参谋负责提议进攻时间;每支军队也有1个将军批准参谋提出的进攻时间;很明显,1个参谋提出的进攻时间需要获得至少2个将军的批准才有意义;
5) 问题:是否存在一个协议,能够使得蓝军同步他们的进攻时间?
接下来以两个假设的场景来演绎BasicPaxos;参谋和将军需要遵循一些基本的规则
1) 参谋以两阶段提交(prepare/commit)的方式来发起提议,在prepare阶段需要给出一个编号;
2) 在prepare阶段产生冲突,将军以编号大小来裁决,编号大的参谋胜出;
3) 参谋在prepare阶段如果收到了将军返回的已接受进攻时间,在commit阶段必须使用这个返回的进攻时间;
两个参谋先后提议的场景
1) 参谋1发起提议,派通信兵带信给3个将军,内容为(编号1);
2) 3个将军收到参谋1的提议,由于之前还没有保存任何编号,因此把(编号1)保存下来,避免遗忘;同时让通信兵带信回去,内容为(ok);
3) 参谋1收到至少2个将军的回复,再次派通信兵带信给3个将军,内容为(编号1,进攻时间1);
4) 3个将军收到参谋1的时间,把(编号1,进攻时间1)保存下来,避免遗忘;同时让通信兵带信回去,内容为(Accepted);
5) 参谋1收到至少2个将军的(Accepted)内容,确认进攻时间已经被大家接收;
6) 参谋2发起提议,派通信兵带信给3个将军,内容为(编号2);
7) 3个将军收到参谋2的提议,由于(编号2)比(编号1)大,因此把(编号2)保存下来,避免遗忘;又由于之前已经接受参谋1的提议,因此让通信兵带信回去,内容为(编号1,进攻时间1);
8) 参谋2收到至少2个将军的回复,由于回复中带来了已接受的参谋1的提议内容,参谋2因此不再提出新的进攻时间,接受参谋1提出的时间;
两个参谋交叉提议的场景
1) 参谋1发起提议,派通信兵带信给3个将军,内容为(编号1);
2) 3个将军的情况如下
a) 将军1和将军2收到参谋1的提议,将军1和将军2把(编号1)记录下来,如果有其他参谋提出更小的编号,将被拒绝;同时让通信兵带信回去,内容为(ok);
b) 负责通知将军3的通信兵被抓,因此将军3没收到参谋1的提议;
3) 参谋2在同一时间也发起了提议,派通信兵带信给3个将军,内容为(编号2);
4) 3个将军的情况如下
a) 将军2和将军3收到参谋2的提议,将军2和将军3把(编号2)记录下来,如果有其他参谋提出更小的编号,将被拒绝;同时让通信兵带信回去,内容为(ok);
b) 负责通知将军1的通信兵被抓,因此将军1没收到参谋2的提议;
5) 参谋1收到至少2个将军的回复,再次派通信兵带信给有答复的2个将军,内容为(编号1,进攻时间1);
6) 2个将军的情况如下
a) 将军1收到了(编号1,进攻时间1),和自己保存的编号相同,因此把(编号1,进攻时间1)保存下来;同时让通信兵带信回去,内容为(Accepted);
b) 将军2收到了(编号1,进攻时间1),由于(编号1)小于已经保存的(编号2),因此让通信兵带信回去,内容为(Rejected,编号2);
7) 参谋2收到至少2个将军的回复,再次派通信兵带信给有答复的2个将军,内容为(编号2,进攻时间2);
8) 将军2和将军3收到了(编号2,进攻时间2),和自己保存的编号相同,因此把(编号2,进攻时间2)保存下来,同时让通信兵带信回去,内容为(Accepted);
9) 参谋2收到至少2个将军的(Accepted)内容,确认进攻时间已经被多数派接受;
10) 参谋1只收到了1个将军的(Accepted)内容,同时收到一个(Rejected,编号2);参谋1重新发起提议,派通信兵带信给3个将军,内容为(编号3);
11) 3个将军的情况如下
a) 将军1收到参谋1的提议,由于(编号3)大于之前保存的(编号1),因此把(编号3)保存下来;由于将军1已经接受参谋1前一次的提议,因此让通信兵带信回去,内容为(编号1,进攻时间1);
b) 将军2收到参谋1的提议,由于(编号3)大于之前保存的(编号2),因此把(编号3)保存下来;由于将军2已经接受参谋2的提议,因此让通信兵带信回去,内容为(编号2,进攻时间2);
c) 负责通知将军3的通信兵被抓,因此将军3没收到参谋1的提议;
12) 参谋1收到了至少2个将军的回复,比较两个回复的编号大小,选择大编号对应的进攻时间作为最新的提议;参谋1再次派通信兵带信给有答复的2个将军,内容为(编号3,进攻时间2);
13) 将军1和将军2收到了(编号3,进攻时间2),和自己保存的编号相同,因此保存(编号3,进攻时间2),同时让通信兵带信回去,内容为(Accepted);
14) 参谋1收到了至少2个将军的(accepted)内容,确认进攻时间已经被多数派接受;
小结
BasicPaxos算法难理解,除了讲故事的背景不熟悉之外,还有以下几点
1) 参与的各方并不是要针锋相对,拼个你死我活;而是要合作共赢,最终达成一个共识;当大家讲起投票的时候,往往第一反应是要针锋相对,没想到是要合作共赢;很明显可以想到,在第二个场景下,如果参谋1为了逞英雄,强行要提交他提出的进攻时间1,那么最终是无法达成一个共识的;这里的点就在于参谋1违反了规则,相当于产生了拜占庭错误;
2) 常规的通信协议设计,对于写操作,通常都是只返回成功和失败的状态,不会返回更多的东西;但BasicPaxos的prepare和commit,将军除了返回成功还是失败的状态之外,还会把之前已经发生的一些状态带回给参谋,这个和常规的通信协议是不同的;
3) 在两军问题的背景下,其实知道进攻时间被至少2个将军接受的是参谋,而不是将军;在“两个参谋交叉提议的场景”下,当参谋1没有做第2次prepare之前,将军1记录的其实是一个错误的进攻时间;理论上来说,任何一个将军在任何一个时刻都无法判断自己不是处在将军1的场景下;因此BasicPaxos在3个蓝军组成的系统中达成了一个共识,但并没有为每个将军明确了共识;
4) 本文的两个场景都以“两个参谋”来讲,这里的“两个参谋”可能是真的两个不同的参谋,也可能是同一个参谋因为某种原因先后做了多次提议;对应分布式系统的场景
a) 真的有两个并发的client
b) 两个client一先一后;第一个client执行到某个步骤因为某种原因停止了;过了一段时间,另外一个client接着操作同一个数据
c) 同一个client重试;第一次执行到某一步骤因为某种原因停止了,立即或者稍后进行了重试
后记
写这篇文章的时候,参考了以下两篇文章。
Paxos算法细节详解(一)--通过现实世界描述算法
http://www.cnblogs.com/endsock/p/3480093.html
第一篇文章用了我们喜闻乐见的背景,大部分内容非常容易理解,尤其是用比特币来映射编号,非常贴切;只是对于proposer-1小姐最后的“背叛”会有点违反常识。看完这个故事之后就一直在想更贴切的背景。在两军问题中,蓝军各方是要合作达成一个共识;对于参谋来说,获得了前一个参谋的提议就接受,而不再提出自己的提议是符合逻辑的,这个和paxos也更加吻合。在实际的分布式系统中,如果遇到冲突,涉及的各方也不是要针锋相对争个你死我活,想要的只是能发现冲突,只有一方成功、或者全部失败都无所谓,只要能保证数据一致就行。
以两军问题为背景,在提议编号上找不到合适的映射点,比较生硬,这一点不如第一遍文章中的故事。
Question 7: The Two Generals’ Problem of reaching consensus on when to attack is unsolvable, how come it’s possible to have consensus with Paxos?
http://bogdan.pistol.gg/2014/10/20/paxos-algorithm-explained-part-2-insights/#q7
paxos最终仍然无法解决两军问题,即使是扩展到3军也是无法解决的。在3军背景下,按paxos算法的定义,最后是达成了一个共同的进攻时间,3军中的任何一方都可以通过paxos算法读取出这个进攻时间。但3军怎么知道在什么时候去读取、其他人是否已经读取,这是一个和两军问题同样的问题;同时由于通信兵可能无限延迟,可能部分蓝军在进攻时间之前读取到了,部分蓝军可能在进攻时间之后才读取到,所以两军最终还是无解的。第二篇参考文章中也详细描述了这些问题。所以写paxos和两军问题,不是说paxos解决了两军问题,只是借用两军问题的背景来演绎paxos。
相关推荐
理解Paxos算法对于掌握Zookeeper的运作机制至关重要,因为它是保证Zookeeper高可用性和数据一致性的基石。同时,Paxos算法也是分布式系统设计中不可或缺的知识,对于从事分布式开发的工程师来说,深入理解这一算法...
在实际应用中,Paxos算法常被用在分布式数据库如Google的Chubby、Apache ZooKeeper以及许多云服务的内部架构中。通过C++实现,开发者可以更深入地了解Paxos的工作原理,并将其应用于自己的分布式系统设计中,以实现...
Paxos算法在工业界有着广泛的应用,例如在Google的Chubby分布式锁服务、Apache ZooKeeper等系统中都用到了Paxos算法或其变体。在理论层面,Paxos算法也成为了后来其他共识算法研究的基础。如Raft算法,它是Paxos算法...
### Paxos算法详解与Zookeeper应用 #### 一、Paxos算法概述 Paxos算法是一种用于解决分布式系统中一致性问题的经典算法。该算法由Leslie Lamport于1990年提出,并逐渐成为分布式一致性算法领域的核心理论之一。在...
**Paxos算法详解** Paxos算法是Leslie Lamport提出的一种分布式一致性协议,它在分布式系统中解决了一个核心问题:如何在一个网络环境中保证多个节点间的数据一致性,即使在网络存在延迟、消息丢失或重复、节点故障...
《从PAXOS到ZOOKEEPER:分布式一致性原理与实践》是一本深入探讨分布式系统一致性问题的书籍,尤其关注了PAXOS算法和ZooKeeper的实现。在这个数字化时代,分布式系统的应用越来越广泛,而分布式一致性是这些系统中至...
在实际应用中,有多种工具和框架实现了Paxos算法,例如Chubby(Google的分布式锁服务)、Zookeeper(Apache的分布式协调服务)和Riak(分布式数据库)等。这些工具通常对Paxos进行了优化,使其更适应实际应用场景。 ...
本书《从PAXOS到ZOOKEEPER:分布式一致性原理与实践》深入浅出地介绍了PAXOS算法的原理和ZOOKEEPER的实现,同时结合实际案例分析了分布式一致性在各种应用场景下的解决方案。通过阅读这本书,读者不仅可以理解分布式...
Zookeeper 是基于 Paxos 算法实现的分布式协调服务,它提供了高可用、高性能、可扩展的解决方案。下面我们将通过一个通俗的例子来解释 Paxos 算法的原理和 Zookeeper 的实现机制。 Paxos 算法原理 Paxos 算法描述...
Paxos算法是分布式一致性领域的经典算法,通过多轮投票达成共识,而ZooKeeper简化了Paxos,更适合实际应用中的复杂性和性能需求。 书中还详细介绍了ZooKeeper的应用场景,如命名服务、配置管理、集群管理、分布式锁...
在《ZooKeeper-分布式过程协同技术详解》中,会详细介绍ZooKeeper的架构设计、核心功能、API使用以及最佳实践。例如,ZooKeeper的原子操作,如create、delete、exists、get、set等,这些操作都是单次完成的,不会...
书中主要围绕Paxos算法和ZooKeeper两大主题展开,旨在帮助读者理解分布式环境中的数据一致性是如何实现的,并通过源码分析使读者能够更深入地了解实际应用。 Paxos算法是Leslie Lamport提出的一种解决分布式系统中...
总的来说,这本书深入浅出地介绍了Paxos算法和Zookeeper在分布式一致性中的应用,对于理解分布式系统的底层原理,以及如何在实际项目中使用Zookeeper,都有着重要的指导意义。通过阅读此书,读者不仅可以掌握分布式...
Paxos算法是一种分布式系统中用来实现一致性协议的经典算法。该算法由莱斯利·兰伯特(Leslie Lamport)于1990年提出,旨在解决分布式系统中不同节点间可能出现的故障和通信延迟问题,从而实现可靠的决策过程。Paxos...
fast paxos算法与zookeeper leader选举源代码分析.doc
Zookeeper在其实现中并没有直接使用Paxos算法,而是采用了一种简化版本的Paxos算法——Zab协议(Zookeeper Atomic Broadcast)。Zab协议结合了Paxos算法的优点,同时也考虑到了分布式系统中的网络延迟和故障恢复等...
《从PAXOS到ZOOKEEPER分布式一致性原理与实践》是一本深入探讨分布式系统一致性问题的书籍,尤其关注PAXOS算法与ZOOKEEPER的实际应用。在现代互联网架构中,分布式一致性是保证系统高可用性和数据正确性的关键。本书...
《从Paxos到Zookeeper:分布式一致性原理与实践》这本书深入浅出地探讨了分布式系统中的一个重要概念——一致性,以及如何在实际操作中通过Paxos算法和Zookeeper实现这一概念。分布式一致性是分布式系统设计的核心,...
《Paxos到Zookeeper:分布式一致性原理与实践》从分布式一致性的理论出发,向读者简要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了Paxos和ZAB协议。同时,本书深入介绍了分布式...