最近研究paxos算法,看了许多相关的文章,概念仍是很模糊,以为仍是没有掌握paxos算法的精髓,因此花了3天时间分析了libpaxos3的全部代码,此代码能够从https://bitbucket.org/sciascid/libpaxos 下载。对paxos算法有初步了解以后,再看此文的效果会更好;若是你也想分析libpaxos3的话,此文应该会对你有不小帮助;关于paxos的历史这里很少作介绍,关于描述paxos算法写的最好的一篇文章应该就是维基百科了,地址戳这里:http://zh.wikipedia.org/zh-cn/Paxos%E7%AE%97%E6%B3%95node
在paxos算法中,分为4种角色:算法
Proposer :提议者服务器
Acceptor:决策者多线程
Client:产生议题者并发
Learner:最终决策学习者分布式
上面4种角色中,提议者和决策者是很重要的,其余的2个角色在整个算法中应该算作打酱油的,Proposer就像Client的使者,由Proposer使者拿着Client的议题去向Acceptor提议,让Acceptor来决策。这里上面出现了个新名词:最终决策。如今来系统的介绍一下paxos算法中全部的行为:学习
上面Learner最终学习的目标是Acceptor们最终接受了什么议题?注意,这里是向全部Acceptor学习,若是有多数派个Acceptor最终接受了某提议,那就获得了最终的结果,算法的目的就达到了。画一幅图来更加直观:spa
为何须要3个Acceptor?由于Acceptor必须是最少大于等于3个,而且必须是奇数个,由于要造成多数派嘛,若是是偶数个,好比4个,2个接受2个不接受,互不相让,无法搞下去了。线程
为何是3个Proposer? 其实无所谓是多少个了,1~n 均可以的;若是是1个proposer,毫无竞争压力,很顺利的完成2阶段提交,Acceptor们最终批准了事。若是是多个proposer就比较复杂了,请继续看。blog
上面的图中是画了不少节点的,每一个节点须要一台机器么?答案是不须要的,上面的图是逻辑图,物理中,能够将Acceptor和Proposer以及Client放到一台机器上,只是使用了不一样的端口号罢了,Acceptor们启动不一样端口的TCP监听,Proposer来主动链接便可;彻底能够将Client、Proposer、Acceptor、Learner合并到一个程序里面;这里举一个例子:好比开发一个JOB程序,JOB程序部署在多台服务器上(数量为奇数),这些JOB有可能同时处理一项任务,如今使用paxos算法让这些JOB本身来商量由谁(哪台机器)来处理这项任务,这样JOB程序里就须要包含Client、Proposer、Acceptor、Learner这4大功能,而且须要配置其余JOB服务器的IP地址。
再举一个例子,zookeeper经常用来作分布式事务锁。Zookeeper所使用的zad协议也是相似paxos协议的。全部分布式自协商一致性算法都是paxos算法的简化或者变种。Client是使用zookeeper服务的机器,Zookeeper自身包含了Acceptor, Proposer, Learner。Zookeeper领导选举就是paxos过程,还有Client对Zookeeper写Znode时,也是要进行Paxos过程的,由于不一样Client可能链接不一样的Zookeeper服务器来写Znode,到底哪一个Client才能写成功?须要依靠Zookeeper的paxos保证一致性,写成功Znode的Client天然就是被最终接受了,Znode包含了写入Client的IP与端口,其余的Client也能够读取到这个Znode来进行Learner。也就是说在Zookeeper自身包含了Learner(由于Zookeeper为了保证自身的一致性而会进行领导选举,因此须要有Learner的内部机制,多个Zookeeper服务器之间须要知道如今谁是领导了),Client端也能够Learner,Learner是广义的。
如今经过一则故事来学习paxos的算法的流程(2阶段提交),有2个Client(老板,老板之间是竞争关系)和3个Acceptor(政府官员):
这个过程保证了在某一时刻,某一个proposer的议题会造成一个多数派进行初步支持;
===============华丽的分割线,第一阶段结束================
5. 如今进入第二阶段提交,如今proposer-1小姐使用分身术(多线程并发)分了3个本身分别去找3位官员,最早找到了1号官员签合同,遭到了1号官员的鄙视,1号官员告诉他proposer-2先生给了他11比特币,由于上一条规则的性质proposer-1小姐知道proposer-2第一阶段在她以后又造成了多数派(至少有2位官员的赃款被更新了);此时她赶忙去提款准备从新贿赂这3个官员(从新进入第一阶段),每人20比特币。刚给1号官员20比特币, 1号官员很高兴初步接受了议题,还没来得及见到2,3号官员的时候
这时proposer-2先生也使用分身术分别找3位官员(注意这里是proposer-2的第二阶段),被第1号官员拒绝了告诉他收到了20比特币,第2,3号官员顺利签了合同,这时2,3号官员记录client-2老板用了11比特币中标,由于造成了多数派,因此最终接受了Client2老板中标这个议题,对于proposer-2先生已经出色的完成了工做;
这时proposer-1小姐找到了2号官员,官员告诉她合同已经签了,将合同给她看,proposer-1小姐是一个没有什么职业操守的聪明人,以为跟Client1老板混没什么前途,因此将本身的议题修改成“Client2老板中标”,而且给了2号官员20比特币,这样造成了一个多数派。顺利的再次进入第二阶段。因为此时没有人竞争了,顺利的找3位官员签合同,3位官员看到议题与上次一次的合同是一致的,因此最终接受了,造成了多数派,proposer-1小姐跳槽到Client2老板的公司去了。
===============华丽的分割线,第二阶段结束===============
Paxos过程结束了,这样,一致性获得了保证,算法运行到最后全部的proposer都投“client2中标”全部的acceptor都接受这个议题,也就是说在最初的第二阶段,议题是先入为主的,谁先占了先机,后面的proposer在第一阶段就会学习到这个议题而修改本身自己的议题,由于这样没职业操守,才能让一致性获得保证,这就是paxos算法的一个过程。原来paxos算法里的角色都是这样的不靠谱,不过不要紧,结果靠谱就能够了。该算法就是为了追求结果的一致性。