作者:大叔据

来源:大叔据

先讲一个故事。


从前,在国王Leslie Lamport的统治下,有个黑暗的希腊城邦叫paxos。城邦里有3类人,

  • 决策者

  • 提议者

  • 群众

虽然这是一个黑暗的城邦但是很民主,按照议会民主制的政治模式制订法律,群众有什么建议和意见都可以写提案交给提议者,提议者会把提案交给决策者来决策,决策者有奇数个,为什么要奇数个?很简单因为决策的方式很无脑,少数服从多数。

最后决策者把刚出炉的决策昭告天下,群众得知决策结果。

等一下,那哪里黑暗呢?问题就出在“提议者会把提案交给决策者来决策”,那么多提案决策者先决策谁的?谁给的钱多就决策谁的。

那这样会有几个问题,决策者那么多,怎么保证最后决策的是同一个提案,以及怎么保证拿到所有提议者中最高的报价。

聪明又贪婪的决策者想到了一个办法:分两阶段报价


第一阶段

  1. 决策者接受所有比他当前持有报价高的报价,且不会通知之前报价的人

  2. 提议者给所有决策者报价,若有人比自己报价高就加价,有半数以上决策者接受自己报价就停止报价。


第一阶段结束的状态

每个提议者都觉得有半数以上的大佬接受了自己的提案,很开心。而决策者集团此刻的状态是一致的,半数以上同意的提案只有一个,这个就是报价最高的(因为高的总是可以覆盖低的),具体是谁提的who care,一致就行。

第二阶段

提议者去找收过自己钱的大佬签合同,这里有3种情况:

  1. 大佬都收了别人更高的价,回去拿钱继续贿赂,回到第一阶段重新升级;

  2. 大佬收到的最高报价是自己的,美滋滋,半数以上成功签合同,提案成功;

  3. 提议者回去拿钱回来继续贿赂的时候发现合同已经被签了且半数以上都签了这个提案,不干了,赶快把自己的提案换成已经签了的提案,再去提给所有大佬,看看能不能分一杯羹遇见还没签的大佬。

第二阶段结束的状态

所有提议者手头的提案都是一样的,因为有“赶快把自己的提案换成已经签了的提案”这一步;决策者集团所有成员最终接受的提案是一样的。

好的目的已经达到了,把这个提案昭告天下,让所有群众知道这件事。

故事说完了,用正确的姿势再简单介绍下paxos

paxos是什么?

Paxos是一种分布式一致性算法,用于解决分布式系统中一致性问题,可以说是分布式一致性的奠基石,基本所有的一致性算法都是基于它做的改造。

至于paxos的内容,上面的故事其实已经讲得很清楚了,下面我再用专业的词“解释”一遍。

分布式系统中的节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。

paxos作为基于消息传递通信模型的分布式系统,不可避免的会发生以下错误:进程可能会慢、被杀死或者重启,消息可能会延迟、丢失、重复,在基础 Paxos 场景中,先不考虑可能出现消息篡改即拜占庭错误的情况。

Paxos算法解决的问题是在一个可能发生上述异常的分布式系统中如何就某个值达成一致,保证不论发生以上任何异常,都不会破坏决议的一致性。一个典型的场景是,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致的状态。

为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致。一个通用的一致性算法可以应用在许多场景中,是分布式计算中的重要问题。

在paxos算法中,分为4种角色:

  • Acceptor:决策者

  • Proposer :提议者

  • Client:产生议题者(群众)

  • Learner:最终决策学习者(群众)


阶段一:

  1. Proposer向半数以上的Acceptor发送Prepare请求并附上编号N。

  2. 若Acceptor收到一个编号为N的Prepare请求,且N大于该Acceptor已经响应过的所有Prepare请求的编号,那么它就会将它已经接受过的编号最大的提案(如果有的话)作为响应反馈给Proposer,同时该Acceptor承诺不再接受任何编号小于N的提案。

  3. Proposer若没有得到半数以上Acceptor的响应,则编号+1继续发起请求。

阶段二:

  1. 如果Proposer收到半数以上Acceptor对其发出的编号为N的Prepare请求的响应,那么它就会发送一个[N,提案]Accept请求给半数以上的Acceptor。

  2. 如果Acceptor收到一个针对编号为N的提案的Accept请求,只要该Acceptor没有对编号大于N的Prepare请求做出过响应,它就接受该提案

另外再提一下,在一个Paxos过程只批准一个value,只有被prepare的value且被多数Acceptor接受才能被批准,被批准的value才能被learner。

看故事的时候不知道大家有没有疑问,我是有的


决策者Acceptor为什么要多个?

若只有一个acceptor多个proposer,acceptor可以选任意一个提案,很美好,但是有单点问题。

为什么要用“半数以上通过”这个办法来决策?

一个集合不可能同时存在两个半数以上的子集,过半的思想保证提交的value在同一时刻在分布式系统中是唯一的一致的。

这种提交方式不管proposer接受到的消息是接受了谁的提议过半,只保证是有提议过半了的。然后再在第二阶段确定这个过半了的提议,让所有节点知道这件事。因此算法如果能保证value被半数acceptor接受,则意味这此时被认定的value是唯一的。

为什么acceptor要接受多个提案?

如果acceptor只能够接受一个提案,则可能发生所有proposer提出的提案都无法达到多数,决策者接收一个就结束了,状态无法一致。

当Proposer有很多个的时候,会有什么问题?

很难有一个proposer收到半数以上的回复,进而不断地执行第一阶段的协议,决策收敛速度慢,很久都不能做出一个决策。


提案为什么要带上编号(即故事中用来贿赂的钱)?

带上编号是为了决策者可以在自身接受到的提案的对比中做出最终的唯一决策。

试想如果按照提案到达时间对比提案,且不说这样就变成了只接收一个第一到达的提案,还可能因为网络原因每个决策者接受到的提案的先后顺序不一样,凉凉。


接着上面的问题,那如果把所有决策者收到的提案汇集起来选出个时间最早的呢?

把提案汇集,这时候肯定需要一个master来做判断,大家有没发现这个master好像就变成了propser,它拿到最早的提案,交给决策者...

其实,这就演变成了paxos的变种协议。

后记

为了避免竞争,加快收敛的速度,有人在算法中加入leader来代替propser,且leader在集群中只有一位,也就是说只有leader有权提议。这时leader会有单点问题,于是又加入了leader选举机制保证健壮性,到目前为止paxos演变的越来越像我下一篇要讲的zab协议了。

为了能讲得更通俗,很多地方讲得不够严谨,见谅,有问题可以提出交流。

其实这篇和zookeeper的关系不太大算是讲zab之前做的一个铺垫吧。

-END-

 近期热文:

  • 从面试官的角度谈谈大数据面试

  • 为什么 Spring 框架如此流行?

  • 关注点分离之RestTemplate的错误处理

  • 分享几个 SpringBoot 实用的小技巧

  • Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题

关注我

点击“阅读原文”,看本号其他精彩内容

zookeeper-一个关于paxos的故事相关推荐

  1. Zookeeper全解析——Paxos作为灵魂

    Zookeeper全解析--Paxos作为灵魂 原计划在介绍完ZK Client之后就着手ZK Server的介绍,但是发现ZK Server所包含的内容实在太多,并不是简简单单一篇Blog就能搞定的 ...

  2. ZIP,一个没落天才的故事

    ZIP,一个没落天才的故事,Phil Katz不愿意为一个压缩软件付钱,就索性自己写了一个更好的算法,然后无偿公开.2000年4月14日,他被发现死于一家汽车旅馆,年仅37岁,死时手中握着一个空酒瓶. ...

  3. 用ChatGPT讲一个关于猴子的故事

    今天让ChatGPT编了一个小猴子的故事,效果还不错. 首先设置目标: Goal 1: 讲一个关于猴子的故事 Goal 2: 童话故事 Goal 3: 寓言 Goal 4: 讲给小朋友听的 Goal ...

  4. 讲好一个车载诊断的故事

    讲好一个车载诊断的故事 这个故事中包含了如下内容: 1.车载诊断模型是什么样子? 2.车载诊断协议前身.今世和将来 3.常用协议UDS具体介绍(分入门和进阶) 4.常见诊断数据库CDD/ODX 5.车 ...

  5. “请帮助另外10个人吧”——一个德国小孩的故事

    刚才被这个故事感动得热泪盈眶: "请帮助另外10个人吧" ---一个德国小孩的故事 ------------------------------------------ 这是发生在 ...

  6. python 贴吧盖楼_「今天,只想讲一个跨年爱情故事。

    原标题:「今天,只想讲一个跨年爱情故事. Hula CLUB 年末一到 整颗心都会变得柔软起来 冷冽的风和冰凉的空气 仿佛都是为了衬托 一杯热饮,一只被窝和一整年的故事 带来的温暖与爱 ✨ 今天小呼啦 ...

  7. C罗,一个关于坚持的故事

    如果,他少卖几条性感的内裤,少抹点扎眼的发胶,再能找个小家碧玉.内敛低调的女朋友,或许,能少招惹些非议. 但是,谁叫他是"罗三票"呢.别人闲言碎语,谈何改变自己.是的,可爱的中国球 ...

  8. 给你一个人生哲学的故事

    给你一个人生哲学的故事               给你一个故事,希望你能喜欢这个故事并希望它能为你带来好运. 从前,有一个脾气很坏的男孩.他的爸爸给了他一袋钉子,告诉他,每次发脾气或者跟人吵架的时候 ...

  9. 陈年旧事(一个关于成长的故事)【原创】

    陈年旧事(一个关于成长的故事) 这些日子晚上都有空,我一直想做些什么,但总提不起劲头,研究生考试已结束了,年也已过完,我将要去读X大的在职研究生,与公司的合同恐怕又要续签了,发生了很多事,这些是我人生 ...

最新文章

  1. c++ char数组初始化_c专题指针数组与指针的关联
  2. CV圈太卷了!继谷歌提出MLP-Mixer之后,清华、牛津等学者又发表三篇MLP相关论文...
  3. 苹果复兴_类型复兴的故事:来自Type West的经验教训
  4. 面试题字符集和编码区别_您和理想工作之间的一件事-编码面试!
  5. Linux下WebLogic 12c启动、部署命令行
  6. cart算法_ID3、C4.5、CART决策树算法
  7. matlAB gui 变成c,matlab改变GUI和figure左上角图标的方法,并生成exe文件
  8. 停止运行_部门动态丨供水运行不能中断,保障维修从未停止
  9. 电脑太慢了最简单的办法怎么弄_最简单的电脑端微信多开方法
  10. java开发的微信公众号文章爬虫
  11. 少儿编程 电子学会图形化编程等级考试Scratch三级真题解析(判断题)2022年6月
  12. 一招教你电脑微信双开
  13. Java 基础学习笔记
  14. oracle list分区添加,oracle 11g 如何创建、修改、删除list-list组合分区
  15. WebRTC -- 添加选择音频输入输出设备功能
  16. 存货计价方法——加权平均法
  17. Alpha测试和Beta测试的区别
  18. 升级到win11后VMware不能开启虚拟机了
  19. 计算机应用方向的毕业设计,计算机应用(动画方向)毕业设计.pdf
  20. Scala Try 与错误处理

热门文章

  1. linux c 宏 LONG_MAX LLONG_MAX
  2. linux c 内核 ISO C90 forbids mixed declarations and code 警告
  3. centos7 中iptables、firewalld 、netfilter 关系
  4. centos下升级glib
  5. Linux里如何查找文件内容 grep
  6. 字符串分割(C++)
  7. openstack-Mitaka Glance上传镜像报错
  8. linux内核写文件flush,innodb_flush_method 与linux File I/O
  9. 层次聚类多维度matlab实现_第34集 python机器学习:凝聚聚类
  10. GPU深度发掘(一)::GPGPU数学基础教程