前言
随机业务需求量越来越大,由一台或多台主机组成数据中心的集中式架构逐步发展成了多个节点分布式架构已经成为主流。分布式结构能解决集中式架构中心化带来单点故障的问题,但同时也引入了分布式数据一致性的问题。Paxos算法是一种通用性分布式数据一致性协议。本文主要讲解Paxos算法中引用的小典故中包含的技术。
拜占廷将军问题
追溯本源,分布式一致性算法的典故可以从拜占廷将军问题开始说起。
拜占庭帝国有许多支军队,不同军队的将军之间必须制订一个统一的行动计划,从而做出进攻或者撤退的决定,同时,各个将军在地理上都是被分隔开来的,只能依靠军队的通讯员来进行通讯。然而,在所有的通讯员中可能会存在叛徒,这些叛徒可以任意篡改消息,从而达到欺骗将军的目的。
在学习完分布式一致性原理之后,看这个故事会有另外的一个角度。
军对与军队之间是具有分布式特性中的对等性,暗示分布式中的节点。
通讯员负责指令的传递,这里面指令就是消息,分布式架构中,应用之间的通信方式是通过消息传递的方式,如RESTful API。
通讯员通信的整个过程,可以看作是一次网络通信,网络通信自然要承担网络风险,极有可能消息丢失。
即使消息没有丢失,因为网络IO是需要时间,这段时间,消息也是存在不一致性的。
对于消息被篡改,其实这个概率是非常非常低的,往往我们都会默认消息不会被篡改。因此我们把拜占廷将军的问题更加具体化就是:需要解决异步系统延迟和不可靠的消息通道(默认可靠)
我们的主角Paxos算法应运而生,为的就是解决分布式一致性的问题。并且时至今日Paxos算法也是最权威的解决办法之一。现在许多分布式一致性算法如:Raft、ZAB、mutil-paxos都是基于Paxos算法的一种改进。
Paxos
在当时,Paxos算法的提出并没有立刻轰动整个计算机界,当时界内人士的评价是晦涩难懂的,最重要的是Paxos算法并没有用理论数学推理验证,而是用了个小故事。
Paxos的作者还嘲讽到他们并不幽默。时隔9年之后,被微软的一个工程师要求业内人士都来重新审视这篇论文。最后在麻省理工大学的帮助下,完成了数学部分的验证过程,作者本人在2013年获得新科图灵奖。
古希腊有一座小岛叫Paxos,岛上的人是通过议会讨论的形式来颁布法令的。议会中的议员通过信使来进行消息传递。值得注意的是议员(acceptor)和信使(proposer)都是兼职的。他们随时有可能离开会议厅,并且信使可能重复传递消息,也可能一去不复返。
在典故中,对于议员和信使身份是用兼职来形容的。兼职代表着实际中,每一个客户端都有可能是议员(acceptor)或是信使(proposer),有权力进行议案的提出。
“他们随时有可能离开会议厅,···,他们随时有可能离开会议厅”,代表着每个节点都有可能突发性地单点故障,允许重启之后连接回整个集群地情况发生。
结尾
作者这里只是对典故中的一些隐喻进行阐释,其实对于Paxos算法的详细并未做过多的解释,比如:全局唯一编号、Proposer生成提案和Acceptor批准提案暂未提到,感兴趣的读者可以持续关注作者后续的文章。
参考:《从Paxos到ZooKeeper分布式一致性原理与实践》