远方的灯塔 - 专注于服务端技术分享 远方的灯塔 - 专注于服务端技术分享
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)

Terwer Green

一个后端老菜鸟
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)
  • JavaSE

  • 开源框架

  • Linux

  • Struts2

  • Hibernate

  • Webservice

  • 分布式

    • RPC架构设计及IO模型
    • NIO编程及其三大核心原理
    • NIO三大核心之缓冲区(Buffer)
    • NIO三大核心之通道(Channel)
    • NIO三大核心之选择器(Selector)
    • Netty核心原理
    • 线程模型以及传统IO阻塞模型
    • Reactor模型
    • Netty线程模型
    • Netty核心API介绍
    • Netty入门与异步模型
    • Netty高级进阶之Netty编解码器
    • Netty高级进阶之基于Netty的群聊天室案例
    • Netty高级进阶之基于Netty的HTTP服务器开发
    • Netty高级进阶之基于Netty的Websocket开发网页聊天室
    • Netty高级进阶之Netty中的粘包和拆包的解决方案
    • Nety源码剖析
    • 自定义RPC框架之分布式架构网络通信理论
    • 自定义RPC框架之基于Netty实现RPC框架
    • 分布式架构理论
    • 分布式理论之数据一致性
    • 分布式理论之CAP定理
    • 分布式理论之BASE定理
    • 分布式一致性协议之两阶段提交协议(2PC)
    • 分布式一致性协议之三阶段提交协议(3PC)
      • 分布式一致性协议之NWR协议
      • 分布式一致性协议之Gossip协议
      • 分布式一致性协议之Paxos协议
      • 分布式一致性协议之Raft协议
      • 分布式一致性协议之Lease机制
      • 分布式系统设计策略之心跳检测
      • 分布式系统设计策略之高可用
      • 分布式系统设计策略之容错性
      • 分布式系统设计策略之负载均衡
      • 分布式架构服务调用
      • 分布式服务治理之服务协调
      • 分布式服务治理之服务削峰
      • 分布式服务治理之服务降级
      • 分布式服务治理之服务限流
      • 分布式服务治理之服务熔断
      • 分布式服务治理之服务链路追踪
      • 架构设计基本原则之开闭原则(OCP)
      • 架构设计基本原则之单一职责原则(SRP)
      • 架构设计基本原则之接口隔离原则(ISP)
      • 架构设计基本原则之里式替换原则(LSP)
      • 架构设计基本原则之依赖倒置原则(DIP)
      • 架构设计基本原则知识扩展
      • 分布式架构知识拓展与总结
    • 分布式框架

    • 后端开发
    • 分布式
    terwer
    2022-05-04
    目录

    分布式一致性协议之三阶段提交协议(3PC)

    # 三阶段提交协议(3PC)

    三阶段提交协议出现的背景:一致性协议中设计出了二阶段提交协议,但是2PC设计存在缺陷,于是有了三阶段提交协议。

    # 三阶段提交协议

    3PC,全称为“Three phase commit”,是2PC的改进版,将2PC的“事务提交过程”一分为二,并形成了canCommit、preCommit和doCommit三个阶段组成的事务处理协议。

    image-20220320223801310

    三阶段提交升级点(基于二阶段):

    • 三阶段提交协议引入了超时机制

    • 在第一阶段和第二阶段中,引入了一个准备阶段。保证最后提交之前,各个节点之间数据一致性。

      简单地说:除了引入超时机制外,3PC把2PC的准备阶段再次一分为二,这样三阶段提交就有,CanCommit、

      preCommit、doCommit三个阶段。

    # 三阶段详解

    • 第一阶段(canCommit)

      类似于2PC的准备阶段(preCommit)。

      协调者向参与者发送Commit请求,参与者如果可以提交就发生yes响应,否则返回No响应。

      • 事务询问

        协调者向参与者发送canCommit请求。询问是否可以进行事务提交操作,然后开始等待参与者的响应。

      • 响应反馈

        参与者接收到canCommit请求之后,正常情况下,如果自身可以执行事务,则返回Yes响应,并进入预备状态。否则反馈No

    • 第二阶段(preCommit)

      协调者根据参与者的反应情况,来决定是否可以执行事务的preCommit操作。根据响应情况,有以下两种可能:

      • Yes

        (1)发送预提交请求

        协调者向参与者发送preCommit请求,并进入prepared阶段。

        (2)事务预提交

        参与者接收到preCommit请求之后,会执行事务操作,并将undo信息和redo信息记录到事务日志中。

        (3)响应反馈

        如果参与者成功执行了事务操作,则返回ACK响应,并且开始等待最终指令。

      • No

        假设任何一个向协调者发送了No响应,或者等待超时之后,协调者都没有接收到参与者的响应,那么就执行事务的中断。

        (1)发送中断请求

        协调者向参与者发送abort请求

        (2)中断事务

        参与者收到来着协调者的abort请求之后(或者超时仍未收到协调者的请求),执行事务的中断

    • 第三阶段(doCommit)

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

      • 执行成功

        (1)发送提交请求

        协调者接收到参与者发送的ACK响应,那么它从预提交状态进入到提交状态。并向所有参与者发送doCommit请求。

        (2)事务提交

        参与者接收到doCommit请求之后,执行正式的事务提交。并在完成事务提交之后释放所有的事务资源。

        (3)响应反馈

        事务提交完之后,向协调者发送ACK响应。

        (4)完成事务

        协调者接收到所有参与者的ACK响应之后,完成事务。

      • 中断事务

        (1)发送中断请求

        协调者向所有参与者发送abort请求

        (2)事务回滚

        参与者接收到abort请求之后,利用在阶段二记录的undo信息来执行事务的回滚操作,并在完成回滚之后释放所有的事务资源。

        (3)反馈结果

        参与者完成事务回滚之后,想协调者发送ACK消息

        (4)中断事务

        协调者接收到所有参与者的ACk消息之后,进行事务的中断

        一旦进入阶段三,可能会有两种故障

        (1)协调者出现问题

        (2)协调者和参与者之间的网络故障

    image-20220327152939588

    如果出现了任何一种情况,都可能出现参与者无法收到doCommit请求或者abort请求,参与者都会在等待超时之后进行事务提交。
    

    # 3PC和2PC对比

    对于协调者和参与者都设置了超时协议(在2PC中,只有协调者有超时机制,如果在一定时间内没有收到参与者的消息默认失败)。主要避免了参与者长时间无法与协调者节点通讯的情况下(或者协调者挂掉),无法释放资源的问题。因为参与者自身有超时机制,会在超时后,自动进行本地commit而释放资源。这种机制从侧面降低了整个事务的阻塞时间和范围。

    通过canCommit、preCommit、doCommit三个阶段设计,相对于2PC而言,多设置了一个缓冲阶段,保证了最后提交阶段之前各个参与节点的状态一致。

    preCommit是一个缓冲,保证了最后提交节点之前,各个节点的状态是一致的。

    3PC没有完全解决数据一致性的问题。

    编辑 (opens new window)
    #rpc#3pc
    上次更新: 2023/02/13, 17:01:26
    分布式一致性协议之两阶段提交协议(2PC)
    分布式一致性协议之NWR协议

    ← 分布式一致性协议之两阶段提交协议(2PC) 分布式一致性协议之NWR协议→

    最近更新
    01
    解决css部分border被圆角切掉之后圆角的边框消失问题
    03-18
    02
    使用TypeScript开发一个自定义的Node-js前端开发脚手架
    03-08
    03
    Github-Actions使用release-please实现自动发版
    03-06
    更多文章>
    Theme by Vdoing | Copyright © 2011-2023 Terwer Green | MIT License | 粤ICP备2022020721号-1 | 百度统计
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式