Zookeeper系列(2)--2PC、3PC及其应用
在上一篇中,我们介绍了为什么使用分布式,为什么会出现分布式数据一致性问题,以及相关分布式理论:CAP/BASE理论,这些是我们进行后边介绍的分布式一致性算法的基础,正是由于在系统的可用性和数据一致性之间反复的权衡,于是出现了一系列的一致性协议,如2PC,3PC,paxos算法等。本篇就介绍两个最常见的分布式一致性算法:两阶段提交(2PC),三阶段提交(3PC)以及它们的相关应用。
其实我觉得这些分布式一致性算法其实应该叫分布式共识(distributed consensus)算法,不同的一致性上下文含义不同。共识系统则很清晰, 就是多个参与者针对某一个议题达成一致意见,如经典的具有高度容错的基于消息传递的paxos算法,而2pc,3pc无法容错,太过保守。而不是针对使副本数据都一致。这是我的一点看法,其实我看这个的概念的时候也很迷糊,到现在还是在头脑中争议很大,但我觉得,对于这些概念的理解应该放在固定的业务场景中,看在业务中解决了什么问题,而不是转牛角尖非要把这些算法分门别类。
另外,我自己的理解,这些分布式一致性算法的目的并不是达到了副本数据的强一致性,因为CAP理论告诉我们,这是不可能的,而是在可用性和一致性的均衡处理上,用这些算法可以达到BASE状态,确保我们的分布式系统正确运行,那些数据副本的同步问题并不是一致性算法所要解决的,因为副本的同步不管是Mysql主从同步,还是其他master-slave集群的同步都是异步的,所以不可能达到强一致性,所以这些一致性算法是用来保证分布式系统的可用--一致的算法。例如,我们可以将paxos算法看做是分布式共识算法,它的目的就是怎么样对某个值(决议)在集群中达成一致,所以这可以用于集群中的leader选举,写数据过程。而2pc,3pc就是解决分布式事务(参与事务的事务管理器,参与者位于不同的节点)的原子性,一致性问题,而且这些算法并不是只能单一的应用于某个问题上,有很多问题都可以转化为用这些算法解决。
2PC、3PC的基本概念
2PC
- 协调者节点向所有参与者节点询问是否可以执行提交操作(vote),并开始等待各参与者节点的响应。
- 参与者节点执行询问发起为止的所有事务操作,并将Undo信息和Redo信息写入日志。(注意:若成功这里其实每个参与者已经执行了事务操作)
- 各参与者节点响应协调者节点发起的询问。如果参与者节点的事务操作实际执行成功,则它返回一个”同意”消息;如果参与者节点的事务操作实际执行失败,则它返回一个”中止”消息。
- 协调者节点向所有参与者节点发出”正式提交(commit)”的请求。
- 参与者节点正式完成操作,并释放在整个事务期间内占用的资源。
- 参与者节点向协调者节点发送”完成”消息。
- 协调者节点受到所有参与者节点反馈的”完成”消息后,完成事务。
如下图所示:
- 协调者节点向所有参与者节点发出”回滚操作(rollback)”的请求。
- 参与者节点利用之前写入的Undo信息执行回滚,并释放在整个事务期间内占用的资源。
- 参与者节点向协调者节点发送”回滚完成”消息。
- 协调者节点受到所有参与者节点反馈的”回滚完成”消息后,取消事务。
如下图所示:
2PC的优缺点
- 1、同步阻塞问题。执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态,各个参与者在等待协调者发出提交或中断请求时,会一直阻塞,而协调者的发出时间要依赖于所有参与者的响应时间,如果协调者宕机了(单点),那么他就一直阻塞在这,而且无法达成一致(3PC引入了超时提交解决)。
- 2、单点故障。由于协调者的重要性,一旦协调者发生故障。参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。(如果是协调者挂掉,可以重新选举一个协调者,但是无法解决因为协调者宕机导致的参与者处于阻塞状态的问题)
- 3、数据不一致。出现分区,或者网络故障。在二阶段提交的阶段二中,当协调者向参与者发送commit请求之后,发生了局部网络异常或者在发送commit请求过程中协调者发生了故障,这回导致只有一部分参与者接受到了commit请求。而在这部分参与者接到commit请求之后就会执行commit操作。但是其他部分未接到commit请求的机器则无法执行事务提交。于是整个分布式系统便出现了数据部一致性的现象。
- 4、太过保守:2pc没有设计相应的容错机制,当任意一个参与者节点宕机,那么协调者超时没收到响应,就会导致整个事务回滚失败。
- 5、二阶段无法解决的问题:协调者(在第二阶段)发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了。那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。
3PC
与两阶段提交不同的是,三阶段提交有两个改动点。
1、引入超时机制。(超时提交策略,当第三阶段参与者等待协调者超时后会提交事务,解决参与者同步阻塞问题,同时能在发生单点故障时,继续达成一致)
2、在第一阶段和第二阶段中插入一个准备阶段。(也是为了减少同步阻塞的发生范围)
CanCommit阶段
3PC的CanCommit阶段其实和2PC的准备阶段很像。协调者向参与者发送commit请求,参与者如果可以提交就返回Yes响应,否则返回No响应。
- 1.事务询问 协调者向参与者发送CanCommit请求。询问是否可以执行事务提交操作。然后开始等待参与者的响应。
- 2.响应反馈 参与者接到CanCommit请求之后,正常情况下,如果其自身认为可以顺利执行事务,则返回Yes响应,并进入预备状态。否则反馈No
PreCommit阶段
协调者根据参与者的反应情况来决定是否可以记性事务的PreCommit操作。根据响应情况,有以下两种可能。
假如协调者从所有的参与者获得的反馈都是Yes响应,那么就会执行事务的预执行。
- 1.发送预提交请求 协调者向参与者发送PreCommit请求,并进入Prepared阶段。
- 2.事务预提交 参与者接收到PreCommit请求后,会执行事务操作,并将undo和redo信息记录到事务日志中。
- 3.响应反馈 如果参与者成功的执行了事务操作,则返回ACK响应,同时开始等待最终指令。
假如有任何一个参与者向协调者发送了No响应,或者等待超时之后,协调者都没有接到参与者的响应,那么就执行事务的中断。
- 1.发送中断请求 协调者向所有参与者发送abort请求。
- 2.中断事务 参与者收到来自协调者的abort请求之后(或超时之后,仍未收到协调者的请求),执行事务的中断。
doCommit阶段
该阶段进行真正的事务提交,也可以分为以下两种情况。
执行提交
1.发送提交请求 协调接收到参与者发送的ACK响应,那么他将从预提交状态进入到提交状态。并向所有参与者发送doCommit请求。
2.事务提交 参与者接收到doCommit请求之后,执行正式的事务提交。并在完成事务提交之后释放所有事务资源。
3.响应反馈 事务提交完之后,向协调者发送Ack响应。
4.完成事务 协调者接收到所有参与者的ack响应之后,完成事务。
中断事务 协调者没有接收到参与者发送的ACK响应(可能是接受者发送的不是ACK响应,也可能响应超时),那么就会执行中断事务。
1.发送中断请求 协调者向所有参与者发送abort请求
2.事务回滚 参与者接收到abort请求之后,利用其在阶段二记录的undo信息来执行事务的回滚操作,并在完成回滚之后释放所有的事务资源。
3.反馈结果 参与者完成事务回滚之后,向协调者发送ACK消息
4.中断事务 协调者接收到参与者反馈的ACK消息之后,执行事务的中断。
3PC解决的问题:
2PC,3PC的应用
MySQL的主从同步复制原理
(1) 数据分布 (Data distribution )
(2) 负载平衡(load balancing)
(3) 备份(Backups)
(4) 高可用性和容错行 High availability and failover
整体上来说,复制有3个步骤:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将改变反映它自己的数据。
下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中 继日志。
SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数 据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制 过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。
Zookeeper系列(2)--2PC、3PC及其应用相关推荐
- 【分布式事务】内容较多CAP/BASE/2PC/3PC/TCC/Sega等等等等~,一次性捋清楚
分布式事务 概述 什么是分布式事务 分布式事务就是指事务的资源分别位于分布式系统的不同节点之上的事务 分布式事务产生的原因 数据库分库分表 当业务数据量达到单库单表的极限时,就需要考虑分库分表,跨多个 ...
- Zookeeper系列(二)、核心原理
上一篇我们介绍了Zookeeper的一些基础知识,本篇来讲解zk内部的一些核心原理,帮助我们更好的理解zk的工作机制. 目录 选举机制 Leader选举流程 Leader选举原理 Watch机制 会话 ...
- 事务 | Spring Cloud 分布式事务管理(二)2pc/3pc
Spring Cloud 分布式事务管理(二)2pc/3pc 上一篇 Spring Cloud 分布式事务管理 上一章,讲到了微服务带来的优点和缺点以及分布式事务的不确定性.这节说一下2pc/3pc ...
- ZooKeeper系列(4):ZooKeeper的配置文件详解
ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk zkServer.sh读取的默认配置文件是$ZOOKEEPER_ ...
- 精通Zookeeper系列开篇:进大厂不得不学的分布式协同利器!
最近,有很多小伙伴让我更新一些Zookeeper的文章,正好也趁着清明假期把之前自己工作过程当中总结的Zookeeper知识点梳理了一番,打算写一个[精通Zookeeper系列],希望能够帮助小伙伴们 ...
- zookeeper系列(二)实战master选举
2019独角兽企业重金招聘Python工程师标准>>> master选举 考虑7*24小时向外提供服务的系统,不能有单点故障,于是我们使用集群,采用的是Master+Slave.集群 ...
- Zookeeper系列四:Zookeeper实现分布式锁、Zookeeper实现配置中心
一.Zookeeper实现分布式锁 分布式锁主要用于在分布式环境中保证数据的一致性. 包括跨进程.跨机器.跨网络导致共享资源不一致的问题. 1. 分布式锁的实现思路 说明: 这种实现会有一个缺点,即当 ...
- ZooKeeper系列(3):znode说明和znode状态
ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk 1.znode znode的官方说明:http://zookee ...
- 有关2pc, 3pc,Tcc 的理解
对于分布式事务的概念,可能还会有很多同学不理解或者理解得不是很深刻的地方,在这篇文章中,作者打算重点给大家先介绍下分布式事务相关的基本概念,诸如2PC.3PC.TCC之类的基本问题. 1. 二阶段提交 ...
最新文章
- MD5算法了解(JAVA实现)
- java $.getjson_JQuery 获取json数据$.getJSON方法的实例代码
- UPS技术的“前世今生”【基础篇.PPT】
- 移动端material风格日期时间选择器
- MVC4验证用户登录特性实现方法
- SAP Commerce Cloud (电商云) UI 的懒加载功能
- Java常用类(5)--不可变的任意精度BigInteger、BigDecimal类
- 时间即财富:创业者浪费精力的八个错误
- Vue 学习笔记(2)Vue 生命周期、组件
- 深入学习 Intellij IDEA 调试技巧
- Nmap扫描机器开放的端口
- 汽车行业营销案例(共13份)
- 新一代数据仓库:Snowflake 弹性数仓介绍
- 四川300家旅游企业上“云端”转型信息化
- mysql键值_如何在MySQL中存储键值对?
- hbase snappy 安装_hbase 支持snappy压缩 | 墨荷琼林官网-连载教程
- springboot+vue新生宿舍管理系统(源码+说明文档),一款优秀的毕业设计
- 节日贺卡使用python编写
- org.quartz
- 微信企业邮箱,手机邮箱格式地址怎么写?
热门文章
- div内容居中(div块内容居中)
- 电脑便签怎么设置常驻保存桌面
- 微信小程序startLocationUpdateBackground()简单实现骑手配送位置
- python 条形图指定颜色_python – 如何给一个熊猫/ matplotlib条形图自定义颜色
- python loads_Python中的dump() 和load()以及dumps()和loads()
- oracle应用开发实例,oracle 数据库开发应用实例,招生录取系统,oracle与plsql教程打包下载...
- android相机曝光度调节,Android OpenGL ES - 反相、曝光、对比度、饱和度、色调滤镜...
- 广东海洋大学 计算机二级证书领取,广东海洋大学2018年3月全国计算机二级考试报名通知...
- Canvas小demo(直线和曲线绘制出一个星空,月亮,绿地)
- Java 读写文件工具类