目录

  • Basic Paxos
    • 三个角色
    • 达成共识的方法
    • 对于Basic Paxos的总结
  • Multi-Paxos
    • 领导者
    • 优化 Basic Paxos 执行
  • reference

Paxos 算法包含 2 个部分:
1、Basic Paxos : 描述多节点之间如何就某个值达成共识
2、Multi-Paxos : 描述执行多个Basic Paxos实例,对一系列值达成共识

Basic Paxos

三个角色

该算法中存在三个角色:提议者接受者学习者,关系如下:

提议者:提议一个值,用于投票表决。在大多数场景中,往往是集群中收到客户端请求的节点时提议者。这样对于业务代码就没有侵入性,不需要再业务代码中实现算法逻辑。
接受者:对每个提议的值进行投票,并存储接受的值。一般来说,集群中的所有节点都是接受者,参与共识协商,并接受和存储数据
注意:一个节点可以担任多个角色,如下:

学习者:被告知投票的结果,接受达成共识的值,存储保存,不参与投票的过程。一般来说,学习者是数据备份节点,比如“Master - Slave”模型中的Slave,被动接受数据,容灾备份。
三个角色代表三种功能:

  • 1、提议者代表接入和协调功能,收到客户端请求后,发起二阶段提交,进行共识协商
  • 2、接受者代表协商和存储数据,对提议的值进行投票,并接受达成共识的值,存储保存
  • 3、学习者代表存储数据,不参与共识协商,只接受达成共识的值,存储保存

达成共识的方法

分为准备阶段和接受阶段。
这里假设两个客户端作为提议者和3个节点作为接受者,
客户端1的想要对节点中的Key为X的数据将Value设置为3,客户端2的想要对节点中的Key为X的数据将Value设置为5。
提议者发送给接受者的信息我们称为提案,结构为[n,v],n为提案编号(相当于事务ID,后发起的提案编号越大),v为提议值(写入db的值)
准备阶段
在准备阶段,两个提议者分别向所三个接受者发送包含提案编号的准备请求,准备请求中只包含提案编号。并假设接受者节点收到准备请求的时序图如下:

接下来是各个接受者节点对于先收到的准备请求的响应。由于之前没有通过任何提案,A,B,C都会返回“尚无提案”的响应。
但是有所不同的是,A,B会告诉提议者,不再响应提案编号 <= 1的准备请求,C会告诉提议者,不再响应提案编号 <= 5的准备请求.
也就是说每个节点之后接受比当前提案编号大的请求。

接下来是各个接受者第二次收到准备请求的响应。
A,B收到的请求,编号为5 >= 1 ,并且此时两个节点没有通过任何提案,所以返回“尚无提案”响应,并不再响应提案编号 <= 5的准备请求.
C收到的请求,编号为1 < 5 ,所以丢弃该准备请求,不做响应。

接受阶段
两个提议者节点在收到大多数节点的准备响应之后,会分别发送接受请求
对于客户端1来说,根据响应中提案编号最大的提案的值,设置接受请求中的值。(客户端1只有来自A,B的准备响应),因为响应均为”尚无提案“,所以客户端1会将自己的提议值:3,作为提案值,然后发送接受请求[n, v] : [1,3];
对于客户端2来说,根据响应中提案编号最大的提案的值,设置接受请求中的值。(客户端2来自A,B,C的准备响应),因为响应均为”尚无提案“,所以客户端1会将自己的提议值:7,作为提案值,然后发送接受请求[n, v] : [5,7];

三个接受者节点收到两个提议者的接受请求,会进行处理:
对于A,B,C节点来说,它们对于请求[1,3],都不会接受,因为提案编号 < 5(最小提案编号)。
它们对于请求[5,7]都会接受,因为提案编号 >= 5,通过提案之后,将提案值:7作为X的Value。

对于Basic Paxos的总结

根据提案编号的大小,接受者保证三个承诺,具体来说:

  1. 如果准备请求的提案编号,小于等于接受者已经响应的准备请求的提案编号,那么接受者将承诺不响应这个准备请求;
  2. 如果接受请求的提案编号,小于接受者已经响应的准备请求的提案编号,那么接受者将承诺不通过这个提案;
  3. 如果接受者之前有通过提案,那么接受者将承诺,会在准备请求的响应中,包含已经通过的最大编号的提案信息。

Multi-Paxos

Basic Paxos 只能就单个值(Value)达成共识,一旦遇到为一系列的值实现共识的时候,它就不管用了。
它具有两个缺点:
1、如果多个提议者同时提交提案,可能出现因为提案编号冲突,在准备阶段没有提议者接收到大多数准备响应,协商失败,需要重新协商
2、2 轮 RPC 通讯(准备阶段和接受阶段)往返消息多、耗性能、延迟大。

可以通过通过引入领导者优化 Basic Paxos 执行来解决这两个问题。

领导者

领导者节点作为唯一提议者,就不会存在多个提议者同时提交提案的情况,也就不存在提案冲突了。
模型结构如下:

如何选举领导者需要我们在Multi-Paxos自己实现。
Chubby中,主节点是通过执行 Basic Paxos 算法,进行投票选举产生的,并且在运行过程中,主节点会通过不断续租的方式来延长租期(Lease)。比如在实际场景中,几天内都是同一个节点作为主节点。如果主节点故障了,那么其他的节点又会投票选举出新的主节点,也就是说主节点是一直存在的,而且是唯一的。
所有的读请求和写请求都由主节点来处理。当主节点从客户端接收到写请求后,作为提议者,执行 Basic Paxos 实例,将数据发送给所有的节点,并且在大多数的服务器接受了这个写请求之后,再响应给客户端成功:

当主节点接收到读请求后,处理就比较简单了,主节点只需要查询本地数据,然后返回给客户端就可以了:

缺点就是所有写请求都在主节点处理,限制了集群处理写请求的并发能力,约等于单机。

优化 Basic Paxos 执行

下面两个图是 Basic Paxos 以及有领导者的优化执行。

图1 Basic Paxos 图2 优化之后

可以看到,当领导者处于稳定状态时,省掉准备阶段,直接进入接受阶段。这是因为领导者节点上的命令时最新的,不需要通过准备请求来发现之前被大多数节点通过的提案,领导者可以独立指定提案中的值。 如何理解领导者处于稳定状态?领导者节点上,序列中的命令是最新的,不再需要通过准备请求来发现之前被大多数节点通过的提案,领导者可以独立指定提案中的值。准备阶段的意义,是发现接受者节点上,已经通过的提案的值。如果在所有接受者节点上,都没有已经通过的提案了,这时,领导者就可以自己指定提案的值了,那么,准备阶段就没有意义了,也就是可以省掉了。

本质上而言,“当领导者处于稳定状态时,省掉准备阶段,直接进入接受阶段”这个优化机制,是通过减少非必须的协商步骤来提升性能的。这种方法非常常用,也很有效。比如,Google 设计的 QUIC 协议,是通过减少 TCP、TLS 的协商步骤,优化 HTTPS 性能。

reference

《分布式协议与算法实战.韩健》

Paxos算法(Basic Paxos 与 Multi-Paxos思想)相关推荐

  1. Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法。

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

  2. Paxos 算法浅析

    Paxos 算法浅析  xiewen 关注 2016.07.19 17:24* 字数 3613 阅读 3740评论 0喜欢 22 持续更新 如何浅显易懂地解说 Paxos 的算法? 参考资料 #8:知 ...

  3. 分布式系列文章——Paxos算法原理与推导

    Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...

  4. raft算法与paxos算法相比有什么优势,使用场景有什么差异?

    Raft协议比paxos的优点是 容易理解,容易实现.它强化了leader的地位,把整个协议可以清楚的分割成两个部分,并利用日志的连续性做了一些简化:(1)Leader在时.由Leader向Follo ...

  5. 区块链共识之Paxos算法理解与实战

    0.前言 本文记录笔者学习和理解区块链共识算法Paxos的点滴,文章比较长,需要耐心来细细琢磨,笔者也是苦战了一个周末才对此有那么一点初步了解,有问题的地方请不吝斧正! 1.初始是阅读本文后续内容的基 ...

  6. 03 如何透彻理解 Paxos 算法?

    文章目录 03 如何透彻理解 Paxos 算法? Quorum 机制 Quorum 定义 Quorum 的应用 Paxos 节点的角色和交互 Paxos 的节点角色 Proposer 提案者 Acce ...

  7. 【Raft】分布式一致性算法Raft和zab、paxos

    目录 前言 Raft算法 Raft动画教程 Raft手动设置模拟 Raft协议说明 Raft和zab区别 paxos算法 前言 开发面试Zookeeper肯定要问,Zab协议逃不掉,那么和 Raft ...

  8. 如何完美实现Paxos算法成员组变更

    Paxos算法在分布式系统中至关重要,凡是多个过程需要达成某种一致的场景都使用该算法,比如,一台机器多个进程数据一致:分布式文件系统或分布式数据库中多客户端并发读写:分布式存储多个副本响应读写请求等. ...

  9. 深入浅出Zookeeper特性以及Paxos算法

    Zookeeper 1. Zookeeper基本概念 1.1 Zookeeper概述 1.2 Zookeeper集群角色 1.3 Zookeeper特性 2. Zookeeper 数据类型 2.1 Z ...

  10. 分布式之Paxos算法

    在了解Quorum机制之前,先回顾一下数据一致性 强一致性:在任意时刻,从任意不同副本取出的值都是一样的. 弱一致性:有时泛指最终一致性,是指在任意时刻,可能由于网络延迟或者设备异常等原因,不同副本中 ...

最新文章

  1. 给Chrome“捉虫”16000个,Google开源bug自检工具
  2. CF1038D Slime 构造
  3. MFC中将CBitmap画到cdc上
  4. Dotnet Core应用跨框架版本运行
  5. 计算机硬件课题,课题:计算机硬件结构介绍
  6. java 查找链表中间元素_java查找链表中间元素_如何通过Java单次查找链表的中间元素...
  7. python的作用域 gbel_[ python ] 全局和局部作用域变量的引用
  8. centos7解压安装mysql_CentOS7 安装Mysql5.7 解压缩版
  9. flex 左右布局_移动端开发常用布局:前端弹性布局总结
  10. java.lang.ClassNotFoundException: com.sun.xml.ws.spi.ProviderImpl解决办法
  11. 获取客户端登录ip地址
  12. centos-5.5安装vmvare tools
  13. 全志平台ov2710 sensor驱动调试记录
  14. Java程序员简历这么写,还过不了筛选算我输
  15. 管理信息系统重要知识点整理
  16. proteus仿真电路连线
  17. Android Binder 机制详解
  18. mysql查询各科成绩前三名_mysql巧用连表查询各科成绩前三名
  19. 关于Holder不等式等号成立的条件的理解
  20. kubernetes 系列之 - 暴露运行的服务端口

热门文章

  1. 前端渲染与后端渲染之间的区别?
  2. nsct matlab,图像融合 NSCT算法 matlab
  3. Python 文件读写
  4. VUE 入门基础(3)
  5. python 内置标准库socketserver模块的思考
  6. 对 Vue 的理解(一)
  7. 在vue中使用SockJS实现webSocket通信
  8. vue安装概要以及vue测试工具
  9. vue 简单实用的elementUI表格封装
  10. 设计撑百万并发的数据库架构