分布式系统原理系列目录

  • 分布式系统的麻烦
  • 副本与一致性
  • 为什么需要一个分布式共识算法
  • 世界上只有一种共识算法,那就是Paxos
  • CAP定理,说起来一句话,实际坑不少
  • BASE,可用性高于强一致性
  • 分布式事务方案那么多,到底该选哪一个

图片上的人叫Leslie Lamport(莱斯利·兰波特),这老爷子看发型就很资深,就是它提出了分布式共识算法Paxos,还有拜占庭将军问题,我们前面说过分布式系统的麻烦,严格来说,拜占庭将军问题也应该算在其中,为啥没讲呢,因为拜占庭将军问题是假设分布式系统中某些节点可以不遵守协议,比如撒谎、或者恶意扰乱,我们绝大多数系统都是按照既定协议运行的,所以可以不用考虑这个问题。只有在一些特定的场景下才会需要考虑拜占庭将军问题。比如在航空航天环境中,计算机内存或CPU寄存器中的数据可能被辐射破坏,导致它以任何不可预知的⽅式响应其他节点;再比如区块链场景,它就是要让互不信任的各⽅达成共识

好,说回paxos本身。关于Paxos 在分布式领域的地位,有这么一种说法:世界上只有一种共识协议,就是 Paxos,其他所有共识算法都是 Paxos 的退化版本。这句话有点夸张的成分,但是如果没有 Paxos,那后续的 Raft、ZAB 等算法,ZooKeeper、etcd 这些分布式协调框架,Hadoop、Consul 这些在此基础上的各类分布式应用,都很可能会延后好几年面世

Paxos的故事

Paxos从被提出到广为人知这个过程并不是一帆风顺的,可以说是很曲折了,大家就当故事听一下哦:

兰伯特在 1990 年首次发表了 Paxos 算法。由于这个算法本身就非常复杂,然后为了展示自己的幽默感呢,老爷子还特地用了一个希腊城邦的比喻,这就让论文显得更难理解了。然后这篇论文的三个审稿人,一致要求他删掉希腊城邦的故事。这就让老爷子非常不爽,认为这些人不懂他的幽默,然后干脆就撤稿不发了

之后过了8年,也就是 1998 年,Lamport 把这篇论文重新整理后又发出来了。这次论文是审核通过了,但是并没有多少人能看懂他到底在说什么

又过了3年,到了 2001 年,Lamport 认为前两次没有引起什么反响,是因为同行们无法理解他以“希腊城邦”来讲故事的幽默感。然后这次发表的时候,它终于放弃了“希腊城邦”的比喻,尽可能用(他认为)简单直接、可读性较强的方式去介绍 Paxos 算法。这次的情况虽然比前两次要好一些,但是相对于它本应该受到的重视程度来说,这次也没好到哪里去,为什么?还是因为太难懂了

后来这段经历被 Lamport 以自嘲的形式放到了他的个人网站上,如果你打开“Paxos Made Simple”这篇论文(我也没打开过。这句话是别人说的哦。),你就会看到它的摘要部分只有一句话:“Paxos算法,如果用英文来解释,非常简单.” ,就很让人怀疑他是在嘲讽审稿人和读者,“你们这些愚蠢的人类!”

到这里Paxos的知名度依然不太高,直到了2006 年,Google 发表了Chubby、Megastore 和 Spanner 等分布式系统的论文,文中提到这些系统都使用 Paxos 解决了分布式共识的问题,Google 的行业影响力很大,Paxos 算法一夜间成为分布式领域的网红概念。随后,才有了 Paxos 在分布式系统、云计算、区块链等多个领域大放异彩的故事。这事也充分说明了,在技术圈里,即使再有本事,也还是要好好包装一下啊

paxos要解决的问题

paxos算法的细节我这里就不说了,一来篇幅很长,二来估计我也很难讲的清楚。接下来我就大概说下paxos要解决的问题

Paxos要干的事情就是让多个节点就某件事情达成共识,这个事情看起来好像不难,但实际非常困难,困难主要来源于两方面:

1、我们前面说过,分布式系统中有各种异常问题(机器宕机、网络异常等等),解决这些问题的办法是法定人数机制,每次都投票,少数服从多数,这样可以容忍少数节点故障。具体来说就是每次收到客户端请求时,只要超过半数的节点同意执行这个请求,那就算请求成功

比如客户端请求写入x=1,收到请求的那个节点先只记录日志,不直接写入这个值,然后广播到其他节点请求投票,如果收到半数以上节点的投票(包括他自己),那这个写请求就算成功了,然后他自己真正写入这个值,并再广播一条提交消息让其他节点提交。如果只有这一个问题,法定人数机制就解决了,每次请求过来发起一轮投票,少数服从多数,完事儿

但还有个并发问题要解决

2、并发有什么问题呢,举个例子客户1、2同时向系统请求占座,谁能成功?我们立马会想到加锁,谁加成功谁占座。如下图,如果是在主从架构的集群中,master加锁就完事儿了,不管咋样,两个请求到master是一定有一个先后顺序的,先来先加锁就行了。问题是非中心化集群怎么加锁呢?并发请求可能会发到多个节点上,而这多个节点是完全平等的、node1会提出让client1占座,node2会提出让client2占座,那让谁占?所以就需要协调多个节点去完成加锁,这个问题是非常复杂的

paxos中的很大一部分复杂度都是为了要解决这个问题带来的,而且这个过程还会导致比较多的性能消耗。本质原因是每个节点完全平等,写请求可能会被同时发送到多个节点,那多个节点就可能同时提出提案,这些提案是有竞争关系的(只有一个能成功),为了解决这个竞争问题,比较费劲

Basic Paxos与Multi Paxos

为此lamport老爷子还专门设计了一个改进版的算法,叫做Multi Paxos,对应的哦,前面说的paxos就叫做Basic Paxos,大家在其他资料看到的Paxos如果没有特殊说明,都是指Paxos。

(ps:“专门设计”的意思是,它在 Paxos 的论文里随意提了几句可以这么做)

他说希望能够找到一种两全其美的办法:既不破坏 Paxos 中“众节点平等”的原则,又能限制下,不是每个节点都可以提案,这样子性能就可以好很多。没错,就是类似选村长的方案,首先各节点基于basic paxos选出一个leader,之后正常情况下就只有leader可以提案,那就 不需要多个节点去协调解决竞争问题了。如果发生前面我们说的两个客户端同时请求占座的情况,因为请求只会发到leader,它直接加锁控制并发就完事儿了

这样就是一开始有一群平等的节点,然后他们自己投票选出个Leader,以后都让这个Leader来做决策,如果Leader宕机了,就再投票选一个新的Leader

Multi Paxos的派生算法

后来就有人根据multi paxos的思想,提出了raft算法,发布了一篇叫做《raft-一种可以让人理解的共识算法》的论文(这再一次从侧面说明了这个paxos的难度)。这篇论文获得了USENIX ATC 2014 大会的 Best Paper,更是成为了日后 etcd、LogCabin、Consul 等重要分布式程序的实现基础。ZooKeeper 的 ZAB 算法和 Raft 的思路也非常类似,这些算法都被认为是与 Multi Paxos 的等价实现

再补充一点,很多中文资料把 共识Consensus翻译为一致性,也就是"分布式一致性算法",听起来就很像是保证数据一致性的算法,就很让人迷惑。共识(Consensus)与一致性(Consistency)是有区别的:

分布式一致性我们之前说过,指的是协调数据在不同副本之间的差异。而共识的重点是让多个节点达成一致,这和多副本数据差异完全不是一回事,大家以后看到分布式一致性算法就要知道它的重点是达成共识

分布式系统原理-世界上只有一种共识算法,那就是Paxos相关推荐

  1. 如果世界上只有一种数据结构,那么我选择 hash

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"k8s"领取阿里云<深入浅出k8s.pdf> 来源:rrd.me/gEtR ...

  2. 世界上有两种公众号,我坚持做第二种

    世界上有两种公众号,一种喜欢追热点,热点过去,文章的价值也就随风而逝.另外一种不追热点,写一些能够经受时间考验的文章. 区分它们的方法很简单: 你看看他会不会定期发文章目录. 相比而言,第二种比较吃亏 ...

  3. 汉语是世界上唯一一种面向对象的高级语言

    2019独角兽企业重金招聘Python工程师标准>>> 在 网上看到过很多有关汉语和英语比较的文章,他们写的都很不错,并且列举了大量的事例 来证明汉语或者英语是优秀的. 不过,我想用 ...

  4. 洛克菲勒:世界上只有两种人头脑聪明...

    洛克菲勒:被人称为"石油大王".美国第一位十亿富豪与全球首富.创办芝加哥大学.洛克菲勒写给儿子的信共有38封,这些信真实记录了洛克菲勒创造财富神话的种种业绩.从这些信中我们不仅可以 ...

  5. 世界上究竟有多少种云计算?这其实是个伪命题

    世界上究竟有多少种云计算?这其实是个伪命题 两个多月前,阿里云的一句:"中国只有两种云,一种是拿来主义的云,一种是自主可控的飞天云."引发了业界的广泛吐槽,不过很多人嘴上虽然不服气 ...

  6. 世界上有10种人,一种懂二进制的,另一种不懂

    前一段时间看到网上有个笑话--世界上有10种人,一种懂二进制的,另一种不懂,这时有人问这不是才2种人吗? 哈哈哈不知你反应过来了吗?这个笑话也侧面反映了理解二进制系统的重要性,请细读下文,待我一步步揭 ...

  7. 世界上到底有多少种编程语言

    今天在找选题的时候,发现一篇<世界上最不流行的编程语言>.程序员常常讨论世界上最流行的编程语言有哪些,各种编程语言排行榜也会定时发布出来,例如Python.JavaScript.Java这 ...

  8. 世界上只有两种黑客:俄罗斯黑客和普通黑客

    大家都知道,前段时间,几乎各个国家都在制裁俄罗斯.索尼公司也宣布制裁了俄罗斯,结果俄罗斯黑客就直接把PS5攻破了.除了破解下载权限之外,还把源代码给公开了.紧接着欧美时下最火的付费游戏也被一一破解,像 ...

  9. 第一台计算机如何工作原理,世界上第一台计算机是什么原理_世界上第一台计算机...

    世界上第一台电子计算机叫什么 史上第一台笔记本电脑 世界上第一台计算机诞生于 世界上的第一台电子计算机叫什么 今天你如何和远方的他交流 20世纪改变世界的通讯技术 世界上第一台电脑靠什么作为动力 向蒸 ...

最新文章

  1. ZOJ 1610 Count the Colors 【线段树】
  2. DAI、DHCP SNOOPING、ip source guard、IPSG
  3. C# 跨程序集调用常量、变量和函数
  4. python列表函数方法_与Python列表相关的函数
  5. linux设置主机路由的接口,linux – 添加到特定主机的路由会发出特定的接口
  6. Fragment生命周期及其使用
  7. Windows Phone 7 常用控件简介
  8. 世人都晓AI好 AI芯片知多少?
  9. STM32烧写程序:Keil5使用ST-link下载程序
  10. namesilo域名注册教程
  11. Java操作MongoDB数据库(简明版)
  12. Python实现对中文文本分句
  13. C#,CAD二次开发,基于参考面参考点计算一个点的坐标
  14. 虚拟机中c#程序提示flash组件未注册解决方案
  15. 性能测试专项:帧率测试 FPS
  16. AppsFlyer的测试
  17. golang牛牛算法规则与聊天功能
  18. 四平方和定理 leetcode279 c++
  19. 【英语阅读】纽约时报 | 紧急状态下的东京:夜生活仍在继续
  20. midas显示代理服务器错误,MIDAS错误提示,帮忙看看是哪些问题哦?谢谢

热门文章

  1. 网络安全系列-XIV: 基于FCCX15数据集进行网络流量分析示例
  2. 考虑下行链路的蜂窝网络中存在多个D2D通信对和多个蜂窝用户,它们共享相同的频率资源并且蜂窝用户为主用户
  3. UVM 仿真报错找不到sequencer问题neither the item‘s sequencer nor dedicated sequencer has been supplied to star
  4. uml -- 开始之路 (rose2003 之 安装版)
  5. CSS中line-height属性详解(CSS之四)
  6. thymeleaf常用命名空间
  7. 【SpringMVC学习01】宏观上把握SpringMVC框架
  8. 配置centos虚拟机以及虚拟机联网问题
  9. python——pytest单元测试
  10. 深度学习进阶 自然语言处理