你可能不知道的平时在用的一致性协议2PC、3PC?

  在分布式系统中,当一个事务操作需要跨越多个分布式节点时,为了保持事务的ACID特性,就出现了“协调者(Coordinator)”来统一调度所有分布式节点的执行逻辑,而被调度的分布式节点则被称为“参与者(Cohort)”。协调者(Coordinator)负责调度参与者(Cohort)的行为,并最终决定这些参与者(Cohort)是否把事务真正进行提交。基于这个思想,衍生出2PC3PC两种协议。

一. 2PC (Two-Phase Commit)

  2PC(Two-Phase Commit)为二阶段提交,为了分布式系统下所有节点操作事务能够保存原子性和一致性而设计的一种算法。主要应用在关系型数据库来完成分布式事务处理,利用该协议可以方便地利用协调者(Coordinator)进行统一的事务提交和回滚,从而能够有效的保证分布式数据一致性。

2PC的两阶段

阶段一(提交请求阶段)

各参与者(Cohort)投票表明是否要继续执行接下来的事务提交操作:

  1. 协调者(Coordinator)节点向所有参与者(Cohort)节点询问是否可以执行提交操作,并开始等待各参与者(Cohort)节点的响应。
  2. 参与者(Cohort)节点执行询问发起为止的所有事务操作,并将Undo信息和Redo信息写入日志。
  3. 各参与者(Cohort)节点响应协调者(Coordinator)节点发起的询问。如果参与者(Cohort)节点的事务操作实际执行成功,则它返回一个"同意"消息;如果参与者(Cohort)节点的事务操作实际执行失败,则它返回一个"中止"消息。

阶段二(提交执行阶段)

协调者(Coordinator)会根据参与者(Cohort)的反馈情况来决定是否可以进行事务提交操作,可分为事务提交以及事务中断两种情况 。

事务提交:

当协调者(Coordinator)节点从所有参与者(Cohort)节点获得的对应的消息都为"Yes"时:

  1. 协调者(Coordinator)节点向所有参与者(Cohort)节点发出"Commit"的请求。
  2. 参与者(Cohort)节点收到Commit请求后,正式执行事务操作,并释放在整个事务期间内占用的资源。
  3. 参与者(Cohort)节点向协调者(Coordinator)节点发送"Ack"消息,确认完成。
  4. 协调者(Coordinator)节点收到所有参与者(Cohort)节点反馈的"Ack"完成消息后,完成事务。


    image

事务中断:
如果任一参与者(Cohort)节点在第一阶段返回的响应消息为"No",或者协调者(Coordinator)节点在第一阶段的询问超时之前无法获取所有参与者(Cohort)节点的响应消息时:

  1. 协调者(Coordinator)节点向所有参与者(Cohort)节点发出"Rollback"请求。
  2. 参与者(Cohort)节点接收到"Rollback"请求,利用之前写入的Undo信息执行回滚,并释放在整个事务期间内占用的资源。
  3. 参与者(Cohort)节点向协调者(Coordinator)节点发送"Ack"回滚完成消息。
  4. 协调者(Coordinator)节点收到所有参与者(Cohort)节点反馈的"Ack"回滚完成消息后,取消事务。
image

缺点

  1. 同步阻塞问题:执行过程中,所有参与者(Cohort)节点都是事务阻塞型。各个参与者(Cohort)在等待其他参与者响应的过程中,将无法进行其他任务操作;

  2. 单点故障:由于协调者(Coordinator)的重要性,一旦协调者(Coordinator)发生故障,参与者(Cohort)会一直阻塞下去。特别是在阶段二中,协调者(Coordinator)发生故障,那么所有的参与者(Cohort)还都处于锁定事务资源的状态中,而无法继续完成事务操作。

  3. 数据不一致:在阶段二中,当协调者(Coordinator)向参与者(Cohort)发送commit请求之后,发生了局部网络异常或者在发送commit请求过程中协调者(Coordinator)出现问题,将导致只有一部分参与者(Cohort)收到commit请求,以至于这部分参与者(Cohort)接到commit请求之后就会执行commit操作,而其他部分未接到commit请求的参与者(Cohort)则无法执行事务提交。于是整个分布式系统便出现了数据部一致性的现象。

  4. 不具备完善容错机制:任意一个节点的失败都会导致整个事务的失败。参与者(Cohort)宕机或者超时,都需要协调者(Coordinator)自身机制去判断或者协调者(Coordinator)在发出commit消息之后宕机,而唯一接收到这条消息的参与者(Cohort)同时也宕机了。那么即使协调者(Coordinator)通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。

二. 3PC (Three-Phase Commit)

  3PC (Three-Phase Commit)为了改进2PC中出现的同步阻塞、单点问题、脑裂以及保守的容错机制缺陷提出的三阶段提交协议,分为CanCommitPreCommitdoCommit三阶段进行事务处理协议。如下图:

image

阶段一:CanCommit

  1. 协调者(Coordinator)节点向所有参与者(Cohort)节点询问是否可以执行提交操作,并开始等待各参与者(Cohort)节点的响应。
  2. 协调者(Coordinator)向参与者(Cohort)发送commit请求,参与者(Cohort)如果可以提交就返回Yes响应进入预备状态,否则返回No响应。


阶段二:PreCommit

  协调者(Coordinator)根据参与者(Cohort)的反应情况来决定是否可以继续事务的PreCommit操作。根据响应情况,有以下两种可能执行提交中断事务

执行提交:

协调者(Coordinator)从所有的参与者(Cohort)获得的反馈都是Yes响应,那么就会进行事务的预执行:

  1. 发送预提交请求::协调者(Coordinator)向参与者(Cohort)发送PreCommit请求,并进入Prepared阶段。
  2. 事务预提交:参与者(Cohort)接收到PreCommit请求后,会执行事务操作,并将undo和redo信息记录到事务日志中。
  3. 响应反馈:如果参与者(Cohort)成功的执行了事务操作,则返回ACK响应,同时开始等待最终指令。

中断事务:

有任何一个参与者(Cohort)向协调者(Coordinator)发送了No响应,或者等待超时之后,Coordinator都没有接到参与者(Cohort)的响应,那么就中断事务:

  1. 发送中断请求:协调者(Coordinator)向所有参与者(Cohort)发送abort请求。
  2. 中断事务:参与者(Cohort)收到来自协调者(Coordinator)的abort请求之后(或超时之后,仍未收到参与者(Cohort)的请求),执行事务的中断。


阶段三:DoCommit

该阶段进行真正的事务提交,也可以分为以下两种情况执行提交中断事务:

执行提交

  1. 发送提交请求:协调者(Coordinator)接收到参与者(Cohort)t发送的ACK响应,那么他将从预提交状态进入到提交状态。并向所有参与者(Cohort)发送doCommit请求。
  2. 事务提交:参与者(Cohort)接收到doCommit请求之后,执行正式的事务提交。并在完成事务提交之后释放所有事务资源。
  3. 响应反馈:事务提交完之后,向协调者(Coordinator)发送ACK响应。
  4. 完成事务:协调者(Coordinator)接收到所有参与者(Cohort)的ACK响应之后,完成事务。

中断事务:
协调者(Coordinator)正常,接收到参与者(Cohort)发送的反馈No响应,或者没有收到到Ack响应(可能是接受者发送的不是ACK响应,也可能响应超时),那么就会执行中断事务。

  1. 发送中断请求:协调者(Coordinator)向所有参与者节点发送abort请求;
  2. 事务回滚:参与者(Cohort)接收到abort请求后,利用记录的Undo信息进行事务回滚操作,并在回滚完成后释放整个事务执行期间占用的资源。
  3. 反馈事务回滚结果:参与者(Cohort)在完成事务回滚之后,向协调者(Coordinator)发送Ack消息。
  4. 中断事务:协调者(Coordinator)接收所有参与者(Cohort)的反馈Ack消息后,中断事务。

优缺点

  • 优点: 降低参与者阻塞范围,并能够在出现单点故障后继续达成一致
  • 缺点: 引入preCommit阶段,在这个阶段如果出现网络分区,协调者无法与参与者正常通信,参与者依然会进行事务提交,造成数据不一致。

三. 总结

  无论是二阶段提交还是三阶段提交都从不同程度地解决了分布式数据一致性问题,使用范围非常广泛,但都无法彻底解决分布式的一致性问题。还有一种一致性协议Paxos算法,解决了无限期等待问题,也解决了“脑裂”问题,通俗易懂的Paxos原理可查看文章《通俗易懂的Paxos算法-基于消息传递的一致性算法》。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • CAP定理是由加州大学伯克利分校Eric Brewer教授提出来的,他指出WEB服务无法同时满足一下3个属性: 一...
    代码之尖阅读 2,193评论 0 50
  • 三阶段提交,是二阶段提交(2PC)的升级版 三阶段和二阶段提交的区别 对于协调者(Coordinator)和参与者...
    忘净空阅读 2,895评论 0 1
  • 此文知识来自于:《从Paxos到Zookeeper分布式一致性原理与实践》第二章分布式入门基础知识,由于博主对其理...
    李文文丶阅读 1,885评论 0 0
  • 一、分布式数据一致性 在分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本(replica),这些副本会...
    穆秦楚阅读 245评论 0 0
  • 不知道我是不是属于一个轻微的洁癖,干净整齐的家,对我来说影响太大了,每次回到家里,如果家里面干干净净,整整齐齐,窗...
    joy快乐开心阅读 341评论 0 0