从数据库到区块链共识算法回顾之Paxos
Posted 刘教链
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从数据库到区块链共识算法回顾之Paxos相关的知识,希望对你有一定的参考价值。
一、为什么需要共识算法
因为我们想把数据存放到多台计算机节点上,还要保证这些节点上保存的数据的一致性。这就需要共识算法。
为什么我们要把数据存放到多台计算机节点上去呢?在互联网的技术架构里,是为了提高访问性能。比方说,一台计算机最多可以支撑1万人同时访问,如果能把数据复制到10台计算机,不就可以同时支撑10万人访问了吗?就是这么一个朴素的道理。
其实有一个最朴素的、众所周知的办法,就是数据库里经典的“主从结构”。人为指定一台节点为“领导”,其他的都是“部下”。要求部下对领导盲信盲从。这样的朴素的数据库架构有一个关键问题,就是所谓的高可用性问题:一旦领导挂了,整个团队(计算机集群)就不能对外提供服务了。必须半夜呼叫运维工程师爬出被窝,人肉复活领导,或者临时让某个部下充当领导。
那么让所有人都是领导不就可以实现高可用性了吗?任何一个领导挂掉都不会影响大局。可是问题在于,都是领导,谁听谁的呢?
共识,英文consensus,就是这些节点就应该保存什么数据达成一致意见。共识算法,就是一个如何达成一致意见的算法,或者说一套标准程序。
比如你们团队有五个人,中午大家需要决定究竟是去吃麦当劳,还是吃吉野家。怎么迅速达成一致意见呢?这就是Paxos算法所要解决的问题。
二、什么是Paxos算法
Paxos是一个虚构的小城镇的名字,虚构它的人叫莱斯利兰伯特[1]。对,就是那个虚构了拜占庭将军问题的莱斯利兰伯特。兰伯特说这个小城镇在希腊,他们这个城镇实行简单民主,共同决定公共事务。由此引出一套决策方法,称为Paxos算法。
三、Paxos算法的基本思路
Paxos算法简单的讲就是从善如流,平等协商。也就是每个人都遵守一个原则:听别人的。在这个原则上,只需要两步就能达成共识:
第一步,先问问大多数人想去吃啥。如果他们没想法,就会说“听你的”;否则就会告诉你他们的想法。术语叫做“准备/承诺”。
第二步,如果他们没啥想法,就动员他们去吃麦当劳(或者吉野家);否则就按他们的想法来(如果他们之中有人还没有想法,需要告诉这些人决定是什么)。术语叫做“接受/已接受”。
简单吧?
四、特点
大家可以看到,Paxos算法里,大家只有一个共同目标,就是尽快达成一致。至于这个一致的结果,究竟和我的想法是不是一样,其实并不重要。换言之,每个人都是绝对的从善如流、从众如流!
从而,Paxos算法就可以保持一个较强的一致性。可以实现较高的访问性能。比如,微信设计的一套分布式存储系统PaxosStore内存云,其访问性能可以达到惊人的十亿Paxos/分钟[2]。
而在Paxos算法里,那个提议的人,可以是任何一个人,这样就实现了系统的“去中心化”和高可用性。
五、争议
Paxos算法有一个bug。就是当出现多个提议人的时候,有可能会陷入竞争状态,死循环。这个情况是这样发生的:
假设Bob准备提议大家去吃麦当劳,而Alice准备提议大家去吃吉野家。
于是Bob先问一圈,一个个问,你有啥想法没?得到的答复是,没有,听你的。
结果Bob还没来得及回过头去告诉他们吃麦当劳的光景,Alice已经重新问了一圈。因为每个被问的人都还不知道Bob要去“麦当劳”,他们就纷纷答复Alice说,还没有想法呢,听你的呀。
这时候Bob开始从头一个个说,咱们去吃麦当劳吧!结果这群人接二连三的答复你说,抱歉啊,刚刚答应Alice说,听她的了。
然后Bob怎么办?从头再来过。Bob再问一圈,那么你们确定要去吃啥了没?因为Alice还没来得及告诉他们去吃吉野家。结果他们纷纷表示没确定呢,而且,既然没确定,那还是听你的吧。
这时候Alice开始从头一个个说,咱们去吃吉野家吧!结果这群人一个个只好答复她说,抱歉啊,刚刚答应Bob要听他的了。
然后Alice再来一遍……
然后Bob再来一遍……
然后……
有一种解法是要求重来一遍的时候休息一个随机的时间。另一种解法是要求提议者中选举出一个领导。可是,选举领导这个事也是一个共识过程,需要一个算法,也用Paxos算法的话,这个过程也死循环了怎么办?实践中有一种粗暴的方法,就是不选举,直接按大家名字的字母排序,谁在前面谁就是领导。这样就可以跳出死循环。
六、适用限制
Paxos算法可用场景的最大限制就是,它只适用于节点中没有恶意节点,并且数量预先确定(以便于知道几个节点能算多数同意)的和平、稳定的网络环境。
非恶意节点只有正常工作和不能正常工作(失去响应)两种情况,而不会主动造假、发假消息欺诈其他节点。
当机节点数量也不能超过总数的一半,否则算法也无法取得多数表决结果,从而无法达成一致。
一个隐藏的问题是,Paxos算法中每一轮的询问和商讨,需要一个全局不冲突、单调有序的序列号发生。这个序列号发生及其有序性(按照时间先后有序),实质上是由中心权威决定的,而不是系统自决的。
另一个隐藏的问题是,如何引入可验证的全局随机性,以便公平决定领导节点,打破争议时的死循环,Paxos算法的应对措施本质上是回避了这个问题。
可见,与比特币需要同时做到兼容恶意节点、非恶意节点可以随意离线、数量未知、身份未知、系统自决全局事件先后顺序、自决全局可验证随机性这些要求比起来,Paxos算法所面对的问题场景具备的条件,简直不要好太多!
也正是引入了诸多限制和善意假设,Paxos算法才可以达到数亿TPS。当然,Paxos算法中节点间协商需要产生O(n)的通信开销,而整个系统的性能会被多数节点的响应性所决定,节点越多、分布越远,性能越差。
七、应用
Paxos算法在今日互联网云端服务中得到了广泛的应用。比如Google的分布式锁服务ChubbyLock,分布式数据库Spanner;Apache基金会的Zookeeper;等[3]。国内则有阿里巴巴的高性能分布式强一致性基础协议库x-paxos[4],以及腾讯的paxos类库phxpaxos[5]、分布式一致性中间件paxosstore[6],等。
参考文献:
[1] 微信PaxosStore:深入浅出Paxos算法协议
[2] 微信PaxosStore内存云揭秘:十亿Paxos/分钟的挑战
[3] Paxos算法https://zh.wikipedia.org/zh-cn/Paxos%E7%AE%97%E6%B3%95
[4] 未开源。媒体相关报道http://tech.it168.com/a2017/0803/3159/000003159055.shtml
以上是关于从数据库到区块链共识算法回顾之Paxos的主要内容,如果未能解决你的问题,请参考以下文章