参考书籍:《从Paxos到ZooKeeper-分布式一致性原理与实践》
这两天在看paxos算法,看到很多版本的理解和比喻,今天看教程终于感觉看懂了一点,于是打算自己描述一下试试.
然而发现后面看不懂.....T^T 总之先发出来,有好心人一起交流下。
背景: 某公司组织团建活动,有3个备选去处,需要挑选出一个,上报给公司管理部门申请团建流程。
目的地:香港、东京、新加坡
决策人(Acceptor):李总、张总、杨总
投票人(Proposer):员工1,员工2,员工3.......员工n(这里的1,2,3等数字不代表投票顺序)
规则:每位员工都可以选择一个想去的地点,作为提案,微信发消息给3位决策人;决策人收到消息后,在公司的内部系统上决定 [批准] or [驳回];当半数以上的决策人都批准去某个地方时,该提案就被选定了。介于此处有3位决策人,也就是说,如果2位都批准了香港,那么团建就去香港。
以上是基础规则,然而这个规则会遇到很多问题,需要逐一补充完善;首先
[问题一]
如果所有人都选了同一个地方,但该地方又被3位决策人驳回,会导致这轮投票选不出团建地点
比如,李总不想去东京;这时他收到了来自员工1的提案[东京];于是驳回了员工1,等待有人发给他[香港]或[新加坡]。结果所有员工发给李总的都是东京,于是李总驳回了所有人的提案,啥也没批准。张总,杨总也是一样。
于是场面就十分尴尬了。。。。由于3位领导都不喜欢东京,所以都没有批准东京,但所有人都只投了东京,没有其它提案,导致本轮啥也没选出来。
[解决方法]
规则补充:决策人必须同意自己收到的第一个提案
这样,即使李总,张总,杨总都不喜欢东京,但由于收到的第一个提案是东京(不管来自哪位员工),东京会被批准;
而后续也没有再收到任何其它地点,所以最终会批准东京。
这就保证了哪怕只有一个提案被提出,也仍然可以选出一个。
[问题二]
3个人都批准了不一样的地点,等于啥也没选定
如:
张总:东京
李总:香港
杨总:新加坡
[问题三]
即使某个地点被差不多一半的人选中了,但有一个决策人故障,就会导致选不出
如:
张总:东京
李总:东京
杨总:新加坡
但周一李总没来上班,也联系不上,导致张总批准东京,杨总批准新加坡;还是等于啥都没选定
【解决方法】:
规则:允许一个决策人批准多个提案,比如
张总:东京,香港
李总:东京,新加坡
杨总:东京,新加坡
那么即使周一联系不上李总,东京仍然以2票获胜成为团建地点(李总失联,东京:香港:新加坡 = 2:1:1)。
但此时又引发了一个新问题
【问题四】
又回到了可能发生多个提案被选定的情况;由于决策人可以批准多个提案;如果批准状况如下:
张总:东京,香港
李总:东京,新加坡,香港
杨总:东京,新加坡,香港
会导致【东京】和【香港】都被选定为团建地点
【解决方法】
此处我们要引入一个【全局唯一编号】,来标识每一个被决策人批准的提案;【编号,地点(值)】
【全局唯一】的意思是指,用来表示id的数字只会出现一次,而且是全序递增的。
增加规则:虽然允许多个提案被选定,但同时也必须保证所有被选定的提案都有相同的值;注意此处的提案不等同于地点了,而是【编号,地点(值)】共同表示一个提案
即:
如果编号为M0,Value为V0的提案被选定【M0,V0】,那么所有M0编号更高的,且被选定的提案,其Value值也必须是V0。
例如:
张总:【1,东京】,【2,香港】
李总:【3,东京】,【4,新加坡】,【7,香港】
杨总:【5,东京】,【6,香港】
此时【东京】被选定,那么
我就不知道上面这句要怎么解释了!!!