Multi Paxos [2]

通过basic paxos 以上步骤分布式系统已经能确定一个值,“只确定一个值有什么用?这可解决不了我面临的问题。” 你心中可能有这样的疑问。

原simple paxos论文里有提到一连串个instance of paxos [4] 但没有multi paxos的概念. 实际上multi paxos是由谷歌提出的[3].  zk和raft也都是multi paxos.

simple paxos论文的实现很复杂,虽然有leader,但每次还是basic paxos. 但zk,raft中的实现是对basic paxos又一次创造性优化,各个instances复用了prepare阶段的半数约束(即leader的产生是通过prepare的半数约束产生的). 详细讲解见下文

正常的存储系统其实不断地进行“确定一个值”的过程、再为每个过程编上序号,就能得到具有全序关系(total order)的系列值,进而能应用在数据库副本存储等很多场景。我们把单次“确定一个值”的过程称为实例(instance),它由proposer/acceptor/learner组成,下图说明了A/B/C三机上的实例:

不同序号的实例之间互相不影响,A/B/C三机输入相同、过程实质等同于执行相同序列的状态机(state machine)指令 ,因而将得到一致的结果。

如何实现?(by phil)

1. 方法一,比较差的.延续basic paxos的思路.

每个分布式存储server接受到client请求后,就提出议案. 有可能别人也在提. 那就各自抢,看谁的议案先被通过. 通过后如果没有新的client请求,就不提案了.其他机器接着提"提案". 这里"提案"就是客户端请求的"命令". 这样命令之间的顺序就确认了.

2. 方案二, 上面那个方案性能太差了.

缺点:

1. 每次请求都有可能互相争抢

2.有些请求明明可以并发的也不能并发了.例如对不同的key修改值.

改进:

增加一个leader,把所有的命令都提交给leader,然后leader再进行提案申请. 如果leader不能排他, 提案仍旧需要进行basic paxos. 而且也无法知道是否操作的是相同的key. 不能并发.

核心问题: leader是否是排他的?

再改进:

做不到leader排他,但是可以将"leader选举结果"作为所有后面提案basic paxos的共同"prepare 部分". 这样及时有一个leader最终变成了假leader,即basic paxos的加锁失败. 问题也不大. 其提案的值也不会被认可.

这就是zk的zab 和 ltcd的raft 使用的方案.

不过他们选举leader的方式不太一致. 并且zk是通过队列保证一致的. raft是通过连续的序号保持一致的.类似 simple paxos里的例子.[1]

note: leader的选举不一定要是paxos完整paxos协议. 不一定严格排他的. 毕竟你认为已经大多数是历史时刻的,有可能会改变.

proposer leader在Multi Paxos中还有助于提升性能,常态下统一由leader发起提议,可节省prepare步骤(leader不用问询acceptor曾接受过的ID最大的提议、只有leader提议也不需要acceptor进行promise)直至发生leader宕机、重新选主。

小结

以上介绍了Paxos的推演过程、如何在Basic Paxos的基础上通过状态机构建Multi Paxos。Paxos协议比较“艰深晦涩”,但多读几遍论文一般能理解其内涵,更难的是如何将Paxos真正应用到工程实践。

微信后台开发同学实现并开源了一套基于Paxos协议的多机状态拷贝类库PhxPaxos,PhxPaxos用于将单机服务扩展到多机,其经过线上系统验证并在一致性保证、性能等方面作了很多考量。

[1] Paxos算法与Zookeeper分析,raft协议,ltcd 8. 与Galera及MySQL Group replication的比较 https://www.cnblogs.com/fei33423/p/7888503.html

[2] 分布式系统理论进阶 - Paxos 和multi paxos 大部分摘抄自这里

[3] Blockchain的鱼和熊掌系列(9)Multi-Paxos协议 http://blog.csdn.net/Canhui_WANG/article/details/54981593

[4]  第三节第二段 we implement a sequence of separate instances of the Paxosconsensus algorithm  https://www.microsoft.com/en-us/research/wp-content/uploads/2016/12/paxos-simple-Copy.pdf

Multi Paxos的更多相关文章

  1. 从 Basic Paxos 到 Multi Paxos 到 Raft

    在朴素Paxos算法中, 各个节点经过 Prepare 和 Accept 阶段, 会达成一个值, 这个值一旦达成, 就不能被修改, 如下例子: 图示1 上面的操作几乎没有任何实用价值, 于是演变成下面 ...

  2. 分布式系统理论进阶 - Paxos

    引言 <分布式系统理论基础 - 一致性.2PC和3PC>一文介绍了一致性.达成一致性需要面临的各种问题以及2PC.3PC模型,Paxos协议在节点宕机恢复.消息无序或丢失.网络分化的场景下 ...

  3. 分布式系统理论进阶 - Paxos变种和优化

    引言 <分布式系统理论进阶 - Paxos>中我们了解了Basic Paxos.Multi Paxos的基本原理,但如果想把Paxos应用于工程实践,了解基本原理还不够. 有很多基于Pax ...

  4. 分布式一致性算法--Paxos

    Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法.Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致.在工程实践意义上来说, ...

  5. Paxos变种和优化

    分布式系统理论进阶 - Paxos变种和优化 引言 <分布式系统理论进阶 - Paxos>中我们了解了Basic Paxos.Multi Paxos的基本原理,但如果想把Paxos应用于工 ...

  6. 【转载】架构师需要了解的Paxos原理、历程及实战

    原文链接,请参见:http://weibo.com/ttarticle/p/show?id=2309403952892003376258 数据库高可用性难题 数据库的数据一致和持续可用对电子商务和互联 ...

  7. 一致性算法--Paxos

    分布式一致性算法--Paxos Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法.Paxos算法解决的问题是一个分布式系统如何就某个值(决议) ...

  8. 底层算法系列:Paxos算法

    关于算法,面太广.本系列只研究实际应用中遇到的核心算法.了解这些算法和应用,对java码农进阶是很有必要的. 对于Paxos学习论证过程中,证实一句话:有史以来学习paxos最好的地方wiki:Pax ...

  9. 分布式一致性的基石---Paxos算法(1)

    分布式一致性的基石---Paxos算法(1) Paxos算法是由微软的工程师Lamport提出,Lamport依靠Paxos算法获得图灵奖: Paxos算法旨在解决相互信任的分布式系统中,多个节点能快 ...

随机推荐

  1. CodeForces660B【模拟—水】

    感觉模拟题用函数分块写比较清晰~传参的话,字符串要么直接全局,或者指针也是容易操作,总之思路清晰,然后分块清晰,模拟wa的少吧. 这题水题,不说了. #include <bits/stdc++. ...

  2. TRANSFORM_TEX

    Shader "Custom/Exam1" { Properties { _MainTex ("Texture", 2D) = "white" ...

  3. Node.js 使用Stream的pipe(管道)方法实现文件复制

    Stream模块有一个pipe方法,可以将两个流串起来,实现所有的数据自动从Readable流进入Writable流 "use strict"; const fs = requir ...

  4. sql注入教学

    新手入坑sql注入,以下是笔记 首先本人存在这么一个mysql数据库 爆库 方法一: 先猜有几列 ,,, 数字依次增加,发现有四列,然后通过database()来爆表名 ,,  方法二: 通过构造一个 ...

  5. for(;;)

    for(;;)就是一个for循环,只是循环的条件没有写到for语句当中,退出条件在for循环体内,要不就是死循环.

  6. C# 特性之事件

    事件的本质---特殊的多路广播委托 定义事件: 事件访问修饰符一般为public 定义为公共类型可以使事件对其他类可见 事件定义中还包括委托类型,既可以是自定义委托类型也可以是EventHandler ...

  7. 命令行视频下载工具 you-get 和 youtube-dl

    you-get 和 youtube-dl 都是基于 Python 的命令行媒体文件下载工具,完全开源免费跨平台.用户只需使用简单命令并提供在线视频的网页地址即可让程序自动进行嗅探.下载.合并.命名和清 ...

  8. Python开发 第01课 Python 简介

    一.Python 介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  9. linux ln -s 软链接

     一.创建 ln -s 源文件 目标文件 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln ...

  10. ubuntu触摸板关闭开启

    sudo rmmod psmouse          #用来禁用触摸板 sudo modprobe psmouse     #用来启用触摸板