当前位置: 首页 > 编程日记 > 正文

深入浅出理解Paxos算法

Paxos算法是莱斯利·兰伯特(英语:Leslie Lamport,LaTeX中的「La」)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法。

Paxos算法一开始非常难以理解,但是一旦理解其实也并不难,之所以难理解其实是因为作者讲的故事难理解。

Paxos算法维基百科https://en.wikipedia.org/wiki/Paxos_(computer_science)

网上有2篇帖子是讲的非常好的,

分别是:以两军问题为背景来演绎Basic Paxos和Paxos算法细节详解(一)--通过现实世界描述算法

本人是在看了这2个帖子之后再结合原论文才看懂的。


Paxos一共4个角色:Client   Proposer      Acceptor     Learner。

Client:产生议题者
Proposer :提议者
Acceptor:决策者
Learner:最终决策学习者,也就是执行者。


Proposer拿着Client的议题去向Acceptor提议,让Acceptor来决策。
Proposer提出议题,Acceptor初步接受或者Acceptor初步不接受。
Acceptor初步接受则Proposer再次向Acceptor确认是否最终接受。
Acceptor最终接受或者Acceptor最终不接受。

Learner最终学习的目标是向所有Acceptor学习,如果有多数派个Acceptor最终接受了某提议,那就得到了最终的结果,算法的目的就达到了。


最基本的Message flow: Basic Paxos演示图如下图所示,其他情况可以参考百科。



图解:

A1,,A2和A3就是Acceptor。

P1,p2和p3就是Proposer。浅色的P1和P2说明是进行提议,深色的P1和P2说明是拿到表决。

圆圈123表明是每次提议序号,递增即可。黑色的图表示被黑了,也就是否决。方块表示投票结果,绿方块表示投票通过,红色菱形表示最终的投票结果。

整个事件是按照时间线从左到右发展。


事件发展:

第一个框代表第一阶段--提议

1.p2最先找到A2,P2提议序号是2,A2记录下,因为之前没有其他的序号所以成功了,然后返回标志给p2;

2.p1找到A1,P1提议序号是1,A1记录下,因为之前没有其他的序号所以成功了,然后返回标志给p1;

3.p1找到A3,P1提议序号是1,A3记录下,因为之前没有其他的序号所以成功了,然后返回标志给p1;

问题来了

4.p1找到A2,P1提议序号是1,A2已经记录下提议序号2,2>1,所以不成功;

5.p2找到A1,P2提议序号是2,A1已经记录下提议序号1,1>2,所以成功;,然后返回标志给p2;

6.p2找到A3,P2提议序号是2,A3已经记录下提议序号1,1>2,所以成功;,然后返回标志给p2;


第二个框代表第二阶段--确认提议(投票)

7.p1找到A1,P1确认序号是1,A1已经记录下提议序号2,1<2,所以不确认,然后p1继续提议序号是3,周而复始...;

8.p2找到A2,P2确认序号是2,A2已经记录下提议序号2,2=2,所以确认成功;,然后返回投票标志给p2;

9.p2找到A3,P2确认序号是2,A3已经记录下提议序号2,2=2,所以确认成功;,然后返回投票标志给p2;

10.p2找到A1,P2确认序号是2,A1已经记录下提议序号3,2<3,所以不确认,;然后p2继续提议序号是4,周而复始...;
问题来了

11.p1找到A2,P1确认序号是1,A1已经记录下确认序号2,1<2,所以不确认,然后返回确认序号2;

12.p1找到A3,P1确认序号是1,A3已经记录下确认序号2,1<2,所以不确认,然后返回确认序号2;

13.p1和p2都得到确认也就是投票结果是2。

14.所有的Learner最终学习的目标是2。


Paxos过程结束了,这样,一致性得到了保证,算法运行到最后所有的proposer都投“2”所有的acceptor都接受这个议题,也就是说在最初的第二阶段,议题是先入为主的,谁先占了先机,后面的proposer在第一阶段就会学习到这个议题而修改自己本身的议题,才能让一致性得到保证,这就是paxos算法的一个过程。该算法就是为了追求结果的一致性。


相关文章:

显示界面的普通仓库

实际脚本如下 procedure xianshi_PTCK(Npc: TNormNpc; Player: TPlayObject);procedure CWPRPTCK_QWP(Npc: TNormNpc; Player: TPlayObject; Args: TArgs); beginplayer.TakebackStorageItem(Args.Int[0]);cangku.xianshi_PTCK(npc,player); end; procedure xianshi_PTCK(Np…

【CTF】实验吧 围在栅栏中的爱

对摩斯密码进行解码&#xff1a;kiqlwtfcqgnsoo QWE是键盘上的前三个&#xff0c;ABC是26个字母的前三个。所以&#xff0c;二者有这样的对应关系。 #include <stdio.h> #include <string.h> int main () {char zc[]"abcdefghijklmnopqrstuvwxyz"; cha…

nginx tomcat https

1.首先确保机器上安装了openssl和openssl-devel #yum install openssl #yum install openssl-devel2. server {listen 443 ssl;server_name vota.swmmotors.com.cn;ssl_certificate cert/vota.swmmotors.com.cn_bundle.crt; #当前conf/目录下ssl_certificate_…

Spring4实战学习笔记

《Spring4实战 第4版》2016年4月新出版的&#xff0c;之前的第三版看起来还是不错的&#xff0c;所以看到新版就直接买下来。 英文版源码地址&#xff1a;Spring in Action, Fourth Edition Covers Spring 4 1.IOC装配Bean 参考【Spring实战4 2.2】&#xff0c;作者提倡无XML…

vmstat 命令

2019独角兽企业重金招聘Python工程师标准>>> 1.用法 vmstat [-a] [-n] [-S unit] [delay [ count]] vmstat [-s] [-n] [-S unit] vmstat [-m] [-n] [delay [ count]] vmstat [-d] [-n] [delay [ count]] vmstat [-p disk partition] [-n] [delay [ count]] vmstat […

【CTF】实验吧 疑惑的汉字

考察的是当铺密码&#xff1a; 王夫 井工 夫口 由中人 井中 夫夫 由中大&#xff1a;67 84 70 123 82 77 125 当铺密码就是一种将中文和数字进行转化的密码&#xff0c;算法相当简单:当前汉字有多少笔画出头&#xff0c;就是转化成数字几。

Date PHP

转载于:https://www.cnblogs.com/liuliang389897172/p/10087895.html

Java多线程的11种创建方式以及纠正网上流传很久的一个谬误

创建线程比较传统的方式是继承Thread类和实现Runnable&#xff0c;也可以用内部类&#xff0c;Lambda表达式&#xff0c;线程池&#xff0c;FutureTask等。 经常面试会问到继承Thread类和实现Runnable的区别&#xff0c;然后网上会流传如下这样的说法&#xff0c;这是错误的。…

【CTF】实验吧 古典密码

一共是35个字符分成5*7或者7*5 最终选择5行7列 首先变动第一行的位置&#xff0c;然后根据第一行变动的位置&#xff0c;依次变动下面的行 OCU{CFT ELXOUYD ECTNGAH OHRNFIE NM}IOTA CTF{COU LTYOUEX CHANGET HEINFOR MATION} CTF{COULTYOUEXCHANGETHEINFORMATION}

对比React Native、dcloud、LuaView三个框架技术(内部)

转载自&#xff1a;http://www.jianshu.com/p/ee1cdb33db8d主要对比React Native和5SDK&#xff08;就是dcloud的SDK&#xff09;两个&#xff1a; 开发语言&#xff1a;三个都是用其他语言来统一开发IOS、android应用的框架技术&#xff0c;其中&#xff0c;React Native是使用…

spring boot 临时文件过期

2019独角兽企业重金招聘Python工程师标准>>> 第一种方案&#xff1a;-Djava.io.tmpdir /xxx 第二种方案&#xff1a; 线上的系统中不能上传文件了&#xff0c;出现如下错误&#xff1a; org.springframework.web.multipart.MultipartException: Could not parse mu…

ASP.NET MVC+Bootstrap个人博客之打造清新分页Helper(三)

0. 没有找到一款中意的分页插件&#xff0c;又不想使用现成的(丑到爆)&#xff0c;所以自己动手造一个吧 先看下效果(其实也不咋滴...)&#xff1a; 有点另类&#xff0c;分页直接是在后台拼接好html&#xff0c;然后发送到前台的&#xff1a; 1. 分页容器&#xff1a; <di…

支撑Java框架的基础技术:泛型,反射,动态代理,cglib

以Spring为例要想看明白他的源码需要彻底理解Java的一些基础技术泛型&#xff0c;反射同时对于一些高级技术例如动态代理&#xff0c;cglib和字节码技术也需要掌握&#xff0c;下面就按章节来一一说清楚这些技术的核心部分&#xff0c;最后手写一个简单的Spring框架。 一.静态代…

【CTF】实验吧 困在栅栏里的凯撒

题目先提到栅栏&#xff0c;再提到凯撒&#xff0c;按照顺序先栅栏解码&#xff0c;再凯撒解码。 一般密码的开头不是flag就是key或者ctf 所以选择“6栏”&#xff0c;在进行凯撒解码 在所有组合中&#xff0c;发现CTF即为flag

经典算法书籍推荐以及算法书排行【算法四库全书】

经典算法书籍推荐以及算法书排行【算法四库全书】 作者&#xff1a;霞落满天 https://linuxstyle.blog.csdn.net/ https://blog.csdn.net/21aspnet 行文方式&#xff1a;类似《四库全书》截取经典算法书目录和精华篇章 版权说明&#xff1a;本文于2019年5月5日首发于CS…

【CTF】实验吧 Fair-Play

它的标题就是题解的提示&#xff1a;Play-Fair Playfair解密算法首先将密钥填写在一个5*5的矩阵中&#xff08;去Q留Z&#xff09;&#xff0c;矩阵中其它未用到的字母按顺序填在矩阵剩余位置中&#xff0c;根据替换矩阵由密文得到明文。 对密文解密规则如下&#xff1a; 1 若c…

【DAY23】JVM与反射的学习笔记

JVM:-----------------1.JVM: java virtual machine.2.class file *.class3.ClassLoader4.runtime data area运行时数据区。1.Method area : 方法区.(shared)供所有线程共享.2.heap(shared):供所有线程共享.3.java stack(栈区)独占的。4.native method stack(本地方法栈)独占5.…

BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)

Description 小A和小B又想到了一个新的游戏。这个游戏是在一个1*n的棋盘上进行的&#xff0c;棋盘上有k个棋子&#xff0c;一半是黑色&#xff0c;一半是白色。最左边是白色棋子&#xff0c;最右边是黑色棋子&#xff0c;相邻的棋子颜色不同。小A可以移动白色棋子&#xff0c;小…

高性能微服务架构设计模式@霞落满天

高性能微服务架构设计模式 主讲&#xff1a;霞落满天 现在企业开发都是微服务架构&#xff0c;但是有很多问题&#xff0c;比如分布式定义&#xff0c;分布式的微服务怎么拆分&#xff0c;什么时候拆分&#xff0c;怎么做到高性能&#xff0c;中台怎么设计&#xff0c;读写分…

【数据结构】顺序栈的实现(C语言)

栈的基本概念及其描述 栈是一种特殊的线性表&#xff0c;规定它的插入运算和删除运算均在线性表的同一端进行&#xff0c;进行插入操作和删除操作的那一端称为栈顶&#xff0c;另一端称为栈底。 栈的插入操作和删除操作分别称为进栈和出栈。 FILO&#xff08;First In Last …

iOS绘制图片与文字

2019独角兽企业重金招聘Python工程师标准>>> #####绘制图片与文字 #####1.绘制图片&#xff0c;直接代码说明 加载图片 #pragma mark - 小黄人 -(void) drawImage:(CGRect) rect{UIImage *image[UIImage imageNamed:"黄人"];//图片有可能显示不全&#xf…

php-fpm慢执行日志

vim /usr/local/php-fpm/etc/php-fpm.d/www.conf//加入如下内容request_slowlog_timeout 1slowlog /usr/local/php-fpm/var/log/www-slow.log 测试&#xff1a;/usr/local/php-fpm/sbin/php-fpm -t/etc/init.d/php-fpm reloadls ../../var/log/ //生成日志php-fpm.log www-sl…

spring springboot springcloud常用注解

SpringBootApplication 组合注解&#xff0c;用在启动类上&#xff0c;源码&#xff1a; Retention(RetentionPolicy.RUNTIME) SpringBootConfiguration EnableAutoConfiguration ComponentScan public interface SpringBootApplication SpringBootConfiguration Configurat…

解决eclipse ctrl+鼠标左键不能用

选择【Window】菜单 Preferences ——>General——>Editors——>Text Editors——>Hyperlinking 把勾都点上,然后确定KEY 值为 crtl

【数据结构】顺序队列的实现(C语言)

队列的基本概念及其描述 队列是一种特殊的线性表&#xff0c;它的特殊性在于队列的插入和删除操作分别在表的两端进行。 插入的那一端称为队尾&#xff0c;删除的那一端称为队首。队列的插入操作和删除操作分别称为进队和出队。 先进先出&#xff08;First In First Out&…

ethereumjs/ethereumjs-vm-2-API文档

https://github.com/ethereumjs/ethereumjs-vm/blob/master/docs/index.md vm.runBlockchain Processes blocks and adds them to the blockchain 处理区块并将其添加到区块链中 Parameters输入参数 blockchain Blockchain A blockchain that to process 一个处理的区块链cb Fu…

qt 拖拽 修改大小(二)

最近项目需要实现windows下橡皮筋的效果&#xff0c;所以对此做了一些了解&#xff0c;特此记录。 首先windows系统是支持橡皮筋效果的&#xff0c;需要使用win32方 法&#xff1a;SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, showFullWindow, NULL, 0);showFullWindow是一个…

互联网大厂技术面试内幕@霞落满天

很多求职者往往并非因为技术不好&#xff0c;而是没有掌握面试的技巧导致不能把握机会&#xff0c;本课程的目的就是本课程先通过比较真实的好简历和不好的简历让大家明白自己的简历有哪些问题&#xff0c;事实上简历是大厂的敲门砖&#xff0c;非常重要&#xff0c;很多人得不…

【数据结构】顺序表的应用(1)(C语言)

问题&#xff1a; 1.将顺序表(a1,a2,…,an)重新排列以a1为界的两部分&#xff1a;a1前面的值均比a1小&#xff0c;a1后面的值均比a1大&#xff08;这里假设数据元素的类型具有可比性&#xff0c;不妨设为整型&#xff09;。 头文件与该头文件一样&#xff1a;【数据结构】顺序…

比特币寒冬中,你更应该关注企业区块链!

公众对区块链的认识也许限于比特币或以太坊&#xff0c;但很多却不知道 Hyperledger&#xff08;超级账本&#xff09;。Hyperledger Fabric&#xff0c;是由 IBM 带头发起的一个联盟链项目&#xff0c;2015 年末移交给 Linux 基金会&#xff0c;成为开源项目。Linux 基金会孵化…