在分布式系统中,一个事务可能涉及到集群中的多个节点。单个节点很容易知道自己执行的事务成功还是失败,但因为网络不可靠难以了解其它节点的执行状态(可能事务执行成功但网络访问超时)。

若部分节点事务执行失败进行回滚,而其它节点完成事务提交,则事务会处于部分完成的不一致状态。为了避免错误,分布式系统需要使用分布式一致性协议来保证分布式事务的执行。

2PC

两阶段提交(2-Phase Commit, 2PC)是一种比较简单的分布式一致性协议。

2PC协议中,每个事务需要一个协调者来协调各个参与者。每个事务分为两步执行。

  1. 阶段一: 事务请求

    1. 协调者向所有参与者发送事务内容,询问是否可以执行事务操作。
    2. 各参与者执行事务,写事务日志但不进行提交。 各参与者锁定事务相关的资源,保证事务可以正常提交。
    3. 各参与者向协调者返回响应,YES表示可以提交,NO表示不可以提交。若协调者收到所有参与者的YES回复,则准备进行事务提交。若有参与者回复NO或者超时,则准备回滚事务。
  2. 阶段二: 提交事务
    1. 协调者向所有参与者发送提交请求
    2. 参与者正式提交事务,并在完成后释放相关资源。
    3. 参与者协调者回复ACK,协调者收到所有参与者的ACK后认为事务提交成功。
  3. 回滚事务
    1. 在事务请求阶段若有参与者回复NO或者超时,协调者向所有参与者发出回滚请求
    2. 各参与者执行事务回滚,并在完成后释放相关资源。
    3. 参与者协调者回复ACK,协调者收到所有参与者的ACK后认为事务回滚成功。

2PC是一种简单的一致性协议,它存在一些问题:

  • 单点服务: 若协调者突然崩溃则事务流程无法继续进行或者造成状态不一致
  • 无法保证一致性: 若协调者第二阶段发送提交请求时崩溃,可能部分参与者受到COMMIT请求提交了事务,而另一部分参与者未受到请求而放弃事务造成不一致现象。
  • 阻塞: 为了保证事务完成提交,各参与者在完成第一阶段事务执行后必须锁定相关资源直到正式提交,影响系统的吞吐量。

参与者在完成阶段一的事务执行后等待协调者的下一个请求,若协调者超时则可以自行放弃事务。

这种方案仍然有无法保证一致性的缺点,但并不会出现某些资料所述一直锁定资源,无法继续的情况。

3PC

三阶段提交协议(3-Phase Commit, 3PC)进一步将事务请求分为两个阶段,可以解决2PC协议阻塞的问题但无法解决单点服务和不一致的问题。

3PC协议下事务分三步提交:

  1. CanCommit

    1. 协调者向所有参与者发送CanCommit请求
    2. 各参与者判断是否可以完成事务提交,但不执行事务也不锁定资源
    3. 各参与者根据是否可以完成事务向协调者回复YES或NO
  2. PreCommit
    1. 协调者向所有参与者发送PreCommit请求,执行事务预提交
    2. 各参与者执行事务,写事务日志但不进行提交。 各参与者锁定事务相关的资源,保证事务可以正常提交。
    3. 各参与者向协调者返回响应。若协调者收到所有参与者的YES回复,则准备进行事务提交。若有参与者回复NO或者超时,则放弃事务。
  3. DoCommit
    1. 协调者向所有参与者发送提交请求
    2. 参与者正式提交事务,并在完成后释放相关资源。
    3. 参与者协调者回复ACK,协调者收到所有参与者的ACK后认为事务提交成功。若有参与者回复NO或者超时,则回滚事务。
    4. 参与者进入 PreCommit 状态后,若始终未收到协调者的 DoCommit 请求则会超时后自动执行提交。

三阶段提交协议在CanCommit阶段不锁定资源,解决了阻塞降低吞吐量的问题。

若某个参与者进入 PreCommit 后始终未收到协调者的进一步指令则会自动提交,该策略一定程度上避免协调者单点服务问题。

但是 3PC 仍然无法解决数据不一致问题。

Paxos

Paxos 算法的目的在于使分布式系统对于某个值达成一致,比如 Master 选举过程中保证最终所有节点对 Master 身份达成共识。

作者认为 Paxos 解决的分布式共识问题与分布式事务有着较大不同。

Paxos 认为信道可能丢失数据但是不会篡改数据(即不存在拜占庭将军问题),实际上我们也很容易通过校验检查数据是否被篡改。

在介绍Paxos算法之前,我们先来分析2PC(3PC)协议在分布式共识问题上的不足。

2PC(3PC)协议要求收到所有参与者的 ACK 消息后才认为提交成功,而在Master选举这类分布式共识问题上只需要过半参与者达成一致即可。

而最难以解决的问题在于协调者的单点服务问题,若协调者在过程中崩溃则集群很难继续达成共识。

因此,关键在于设计在有多个协调者的情况下仍然可以达成共识的协议。

Basic Paxos

Paxos算法中有3个角色:

  • Proposer: 负责发起提案,类似于2PC中的协调者
  • Acceptor: 负责批准提案,类似于2PC中的参与者
  • Learner: 不参与提案过程,只从其它Acceptor那里学习已通过的提案。

我们重点介绍 Proposer 和 Acceptor 参与的流程,暂时不介绍 Learner。

在集群中每个进程(节点)可能会扮演其中多个角色。

提案由编号N和值V组成记作(N, V), 每个提案都的编号N是唯一的。保证编号唯一非常简单,若集群中有k个 Proposer, 那么第i个Proposer提出的第n个提案编号为 i + k * n。

我们希望集群最终可以选中一个V,且所有节点知道集群最终选定的V值。

算法做出几个规定:

  • 只要集群中有超过半数的Accpetor批准了提案,Proposer 就可以认为集群对接受了提案
  • 在一轮投票中,Acceptor总是批准它收到的第一个提案
  • 在一轮投票中,Acceptor可以批准多个提案,但是批准提案的值V必须相同

算法分为两个阶段:

  1. prepare 阶段

    1. Proposer 选择提案N,向半数以上Acceptor发送请求Prepare(N)
    2. Acceptor 保存自己受到过的最大请求的编号 maxN 和已接受的编号最大提案 (acceptedN, acceptedV)。
      • 若 maxN > N, 那么 Acceptor 返回拒绝响应
      • 若 maxN < N, 那么 Acceptor 返回已接受的编号最大提案(acceptN, acceptV),若尚未接受过提案则返回空的成功响应。同时,Acceptor 更新 maxN, 即不会在接受编号小于N的请求
  2. accept 阶段
    1. 若 Proposer 收到过半 Acceptor 对 Prepare(N) 返回的ACK响应,那么它会从响应的提案中选出编号最大的一个(acceptN, acceptV), 若响应中不包含提案则由 Proposer 决定提案。决定提案后 Proposer 会向过半 Acceptor 发送 Accept(N, V)请求。
    2. Acceptor 收到 Accept(N, V) 请求后
      • 若 maxN > N, 那么 Acceptor 返回拒绝响应
      • 若 maxN < N, 那么 Acceptor 返回成功响应,并更新已接受的编号最大提案 (acceptedN, acceptedV)
    3. 若 Proposer 未收到过半 Acceptor 对 Accept(N, V) 请求的成功响应,则认为提案被拒绝。

若集群中存在两个 Proposer 依次提出编号递增的提案可能会使 Paxos 算法陷入死循环:

  1. Proposer1 提出提案 N1, 并收到过半Prepare(N1)响应
  2. Proposer2 提出提案 N2 (N2 > N1), 并收到过半Prepare(N2)响应
  3. Proposer1 进入第二阶段, 过半Accept(N1)请求被拒绝 (过半Acceptor 的 maxN = N2)。 Proposer1 提出提案 N3 (N3 > N2) ...

这种情况称为算法陷入活锁,在工程实践中我们通常选择一个 Proposer 作为 leader。

Paxos 算法可以在数学上证明它的正确性深入浅出Paxos算法协议

Paxos 算法实现难度和运行开销非常大,因此开发出 Raft、ZAB等协议用于生产实践。

从2PC到Paxos的更多相关文章

  1. 分布式:2PC,3PC,Paxos,Raft,ISR [转]

    本文主要讲述2PC及3PC,以及Paxos以及Raft协议. 两类一致性(操作原子性与副本一致性) 2PC协议用于保证属于多个数据分片上的操作的原子性.这些数据分片可能分布在不同的服务器上,2PC协议 ...

  2. 2PC/3PC/Paxos

    在分布式系统中,一个事务可能涉及到集群中的多个节点.单个节点很容易知道自己执行的事务成功还是失败,但因为网络不可靠难以了解其它节点的执行状态(可能事务执行成功但网络访问超时). 若部分节点事务执行失败 ...

  3. 分布式一致性算法 2PC 3PC Paxos

    分布式一致性算法的目的是为了解决分布式系统 一致性算法可以通过共享内存(需要锁)或者消息传递实现,本文讨论后者实现的一致性算法,不仅仅是分布式系统中,凡是多个过程需要达成某种一致的场合都可以使用. 本 ...

  4. 【转】PaxosLease算法--2PC看Paxos选主

    原文请参考[[置顶] Paxos master选举--PaxosLease算法] 众所周知,为了避免Paxos算法的活锁问题,必须选举唯一的proposor.偏偏在Paxos原论文中,作者L. Lam ...

  5. [转载] 一篇文章带你了解Paxos算法

    原文: http://dockone.io/article/640 [编者的话]本文是Quora上关于Paxos算法的回答,两位答者分别从不同的角度描述Paxos算法.Vineet Gupta的回答细 ...

  6. Paxos 学习总结

    近期学习了分布式领域的重要算法Paxos,这里罗列下关键点当作总结.自己水平有限,难免存在谬误,恳请读者指正.本篇不包含Paxos的基本理论介绍.Paxos基础能够參考以下的学习资料章节. 1 Pax ...

  7. Paxos算法与Zookeeper分析,zab (zk)raft协议(etcd) 8. 与Galera及MySQL Group replication的比较

    mit 分布式论文集 https://github.com/feixiao/Distributed-Systems wiki上描述的几种都明白了就出师了 raft 和 zab 是类似的,都是1.先选举 ...

  8. NoSQL数据库笔谈(转)

    NoSQL数据库笔谈 databases , appdir , node , paper颜开 , v0.2 , 2010.2 序 思想篇 CAP 最终一致性 变体 BASE 其他 I/O的五分钟法则 ...

  9. web技术人员-推荐书籍

    学习是技术人员成长的基础,本次分享20本技术方面的书籍,这些书不是每一本都是经典,但是每一本都有其特点.以下20本大部分本人都看过,因此推荐给大家.(本次推荐的20本只是一个参考,比如像Head Fi ...

随机推荐

  1. Linux 防火墙管理及操作

    1.关闭firewall:systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止fire ...

  2. [小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10

    [小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10 各位看众朋友们,你们好,今天是2018年08月14日,星期二,农历七月初四,欢迎阅看今天的颓废联编节目 最近发生的灵异事件有 ...

  3. mac 电脑下svn

    mac点下使用的提交代码的方式是:eclipse + svn 的插件实现,总之中间遇到了很多的问题,不过还是都解决了. 前提是你已经安装了jdk. 安装的过程不再赘述直接上链接http://www.c ...

  4. XSS攻击 CSRF攻击

    XSS攻击: 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆, 故将跨站脚本攻击缩写为XSS.恶意攻击者 ...

  5. MFC常见问题总结

    1. c++中的函数前面加个LRESULT是什么意思啊?在微软vc提供的头文件中有定义在winnt.h中typedef long LONG;在windef.h中typedef LONG LRESULT ...

  6. java.exe

    进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程(例:FlashGet):就是进程中一个独立的控制单元.线程在控制着进程的执行.一个进程中 ...

  7. 前端 高级 (二十五)vue2.0项目实战一 配置简要说明、代码简要说明、Import/Export、轮播和列表例子

    一.启动服务自动打开浏览器运行 二.配置简要说明 1.node_modules 安装好的依赖文件,中间件等,所在位置 2.package.jason 配置当前项目要安装的中间件和依赖文件 { &quo ...

  8. Windows-WMI 事件 ID 10或0x80041003 死机 解药

    最近笔记本重复了好几次奇怪的现象,重启后进入桌面,然后死机,木有蓝屏. 后来在安全模式里查了事件,如下 日志名称:          Application 来源:            Micros ...

  9. <mvc:annotation-driven> 中的HttpMessageConverters 的理解

    用烂的图 配置一个或多个HttpMessageConverter类型以用于转换@RequestBody方法 参数和@ResponseBody方法返回值. 使用此配置元素是可选的.  此处提供的Http ...

  10. 【2016年终大典】i春秋一年中不可错过的安全精华

    这是一个24小时不下课的安全技术大学堂, 每分钟250条学习状态发布, 每天迎接3万求知若渴的用户, 最高同时在线人数超过2万人: 这是一个知识分享的聚宝盆, 安全技术课程208门.2138节.427 ...