03 | ACID理论:CAP的酸,追求一致性
03 | ACID理论:CAP的酸,追求一致性
讲述:于航
时长12:09大小9.74M
二阶段提交协议
TCC(Try-Confirm-Cancel)
内容小结
课堂思考
赞 18
提建议
精选留言(51)
- Joe Black2020-02-17在两阶段提交协议中,如果一个节点在第一阶段确认可以提交,然后崩溃了怎么办?第二阶段它实际没法真正应用自己那部分事务。这个看起来没法处理啊
作者回复: 需要将提交相关信息保存到持久存储上,新进程启动后,恢复到之前的状态。
共 19 条评论34 - Undefined2020-02-20真正理解2PC和TCC的使用场景之后就不会分不清这两个东西,老师可以增加使用真实场景,希望老师在后面的讲解中加上相关分布式协议思想的真实场景,要不仅凭叙述理解起来确实麻烦 2PC用在集群间一致性数据同步,所有参与者完成的是同一件事,可以理解为它们在一个start transaction--commit里面,具有强一致性 TCC是对业务过程的拆分,一致性弱于2PC展开
作者回复: 在TCC中,数据是最终一致。分布式事务和各算法场景,会在加餐篇做补充。
26 - yes2020-06-152pc: 两阶段提交 优点:尽量保证了数据的强一致性 缺点:1、单点故障问题,协调者挂了,尤其在第二阶段的时候参与者资源都锁着时候影响更大。 2、同步阻塞,所有节点在执行时是同步阻塞的 3、数据不一致问题,例如网络分区,部分节点接受不到提交的请求。或是当协调者在第二阶段发送提交命令后挂了,此时有个节点接受到命令执行后也挂了。其他节点都没接受过命令。如果通过选择得出新的协调者,上线后该提交还是回滚都有可能和之前挂了的节点不一致。 3pc:三阶段提交 优点:1、参与者超时机制,不会再傻等。 2、增加询问阶段不会直接锁资源 3、解决协调者和个别参与者一起挂了之后,选择上线不知该提交还是回滚的问题 缺点:1、多了一步、耗时更多 2、网络分区情况下还是有数据不一致问题 TCC:基于两阶段的业务层面的分布式事务。 优点:1、基于业务,不需要占用阻塞数据库宝贵资源 2、基于业务也更加灵活 缺点:1、业务侵入性大 2、实现比较麻烦 3、需要保证cc的幂等展开共 1 条评论20
- 一步2020-02-17文中说到 两阶段提交的弊端:在提交请求阶段,需要预留资源,在资源预留期间,其他人不能操作 利用 TCC 可以解决,这里不是很明白,在 TCC中不是也有预留请求,同样预留资源的,难道在这期间其他事务可以使用这部分资源呢? 如果能使用预留资源,那么在执行Confirm确定操作的时候,之前预留的资源发生了变化,这样会不会有问题?展开
作者回复: TCC是在业务服务中实现的,更灵活。
共 8 条评论17 - 沉淀的梦想2020-02-17老师在"二阶段提交存在的问题"中说 "数据库是独立的系统",是表达的什么意思?
作者回复: 相比业务,数据库是独立的,也就是说,数据库是独立的第三方软件,咱们可以编程或修改业务代码,但,很少会修改数据库核心代码,更不会根据业务需求,修改实现不同的数据库代码逻辑。
共 5 条评论14 - 云学2020-02-22分享下我的理解,望指正:二阶段提交是保证不同系统/模块的逻辑结果一致,要么都成功,要么都失败,这些系统的物理数据是完全不相关的; 而Raft是保证多个系统的数据物理一致,举例1: 对于3副本存储系统,上传数据时肯定要保证这3个副本的数据物理一致, 举例2:对于一笔交易,需要通过2PC保证订单系统和库存系统的逻辑结果一致,但订单系统和库存系统的物理数据是完全不同的; 如果把2PC协商过程应用在同一个程序的不同进程,那就可以实现Raft效果了展开
作者回复: 二阶段提交协议,是个原子提交协议,能实现事务,保证所有操作,要么全部执行,要么全部不执行。Raft是个共识算法,保证达成了共识的值,就不会再变了,基于Raft算法,能实现强一致性,也就是线性一致性。用途不同,可以简单这么理解,比如处理一个订单,需要执行A、B、C三个操作,二阶段提交协议,能保证3个操作要么全部执行,要么全部不执行。Raft能做到,你执行了A操作后,你就一致能读到A操作执行后的结果。
共 2 条评论12 - 张克菲2020-04-07老师,在一次面试中被问到一个问题,如果一个transaction的rollback失败了,应该怎么办?回来后这个问题一直没有找到合适的答案,想看您能否分享一下您的思路?
作者回复: 我的理解,可以考虑这几种方式或根据场景特点结合起来使用,1. 直接重试;2. 触发告警,然后人工根据日志记录进行修复;3. 设计异步回滚流程,也就是说在一个异步流程中对账、回滚,避免因重试耗时而拖慢整体性能。
共 2 条评论12 - 时彬斌2020-02-21关于一致性有些疑问,强一致性、最终一致性的区别不是很清晰,之前学习raft的时候看到,raft的leader在收到集群内一半以上的数据节点确认操作后就认为事务完成,这时有些节点的数据并没有更新完成,此时理解应该为最终一致性,为什么说raft是强一致性呢?raft强一致性难道仅仅体现在所有请求的处理都是在leader节点处理吗?
作者回复: 强一致性,是指基于Raft能实现线性一致性,线性一致性通常被称为强一致性。你提到的这个情况是存在的,“大多数”原则导致的。可以这么理解,Raft是共识算法,Raft自身的数据是最终一致的(大多数原则决定的),但是基于Raft(加上客户端协议),我们能实现强一致性系统,比如强一致性KV存储系统。而我们通常说,Raft是强一致性,其实指的是,我们基于Raft这个算法实现的系统是强一致性的。
共 4 条评论10 - 一步2020-02-17感觉 TCC 也采用了两阶段提交的思想,是不是 TCC 是两阶段提交思想的一种实现? 在看文中的图,是代表 TCC 中,是客户端直接通知所有的节点吗?没有所谓的协作者了?
作者回复: 加一颗星:),客户端在扮演协调者的角色。
8 - 峰2020-02-17一直有个问题,两阶段协议解决的是分布式事务问题,而raft 这些解决的是分布式数据共识问题,即数据在主从副本的条件下保持数据对外始终一样。为什么这两个总混在一起说是解决一致性的呢???
作者回复: 常被误解的一个概念,在中文语义中,Consensus和Consistency都被翻译为了一致性。后面,会做个加餐篇,具体说说:)。
共 8 条评论9 - 张高2020-02-17文中只说明了预留阶段出错了如何撤销,却没有说明:如果确认阶段出错了,该怎么处理。
作者回复: 通过预留阶段的确认,保证确认阶段执行不会出错。
共 4 条评论6 - 侧耳倾听2020-04-13既然说的是事务型分布式事务,首先要关注到分布式关键字,最好的事务控制永远是单机模式,但是问题是对于并发特别高的系统来说,读写的压力都会增加,系统可用性降低,会出现延迟不可访问等问题,所以将一些写入频繁的功能从系统中剥离出来,横向扩展,降低系统压力,提高可用性。由此而带来了新的问题,事务。通过文中叙述的协议解决分布式事务问题的数据不一致性,但是因为是分阶段的确认提交,在确认提交的过程中,增加了数据库记录锁的时间,对于用户私有数据来说,这影响不大,对于公有数据而言,分布式事务和单机事务区别不大,都需要排队等待。如果牺牲一致性,选择分区容错性,允许节点数据短暂不一致,提高了系统可用性,但是数据库之间的主从关系,复制备份等问题又随之而来,又将问题进一步扩大和转移。总之,当性能还说的过去的前提下,尽量不要向分布式发展。一入此门深似海。展开
作者回复: 加一颗星:),系统设计是根据实际场景权衡折中的结果,需要妥协,架构越简单越好。将简单问题复杂化、为了技术而技术,是在工作中,需要极力避免的。曾经历一个产品,技术和架构,在理论是无懈可击、极其先进,但实现复杂度极高,迭代多个版本,耗时多年,始终无法稳定落地,而且维护工作量极其大,最终产品没落,丧失了十几亿美刀的市场。
5 - 超能力先生2020-02-17TCC try阶段的时候应该是直接commit了事务,confirm做确认,不然就撤销。这样才能达到减少资源锁定时间。感觉图里第一部预留资源的说法有点歧义。
作者回复: 在confirm阶段执行的:),TCC也是二阶段提交。
共 3 条评论5 - Gopher2020-07-11老师请教一个问题:TCC 在请求阶段,各个节点不需要保留资源么?为何能解决2pc 需要释放资源后才能处理的问题
作者回复: 加一颗星:),TCC是在业务层实现的,不会锁定数据库资源,比如,实现一个更新(UPDATE)操作,在预留阶段,可以将值更新到一个额外字段,然后在确认阶段,再将额外字段的值更新到原计划更新的字段。
共 3 条评论4 - 周龙亭2020-04-18在2PC中的提交执行阶段,协调者发送给参与者的确认执行消息丢失,怎么办?
作者回复: 加一颗星:),比如,可以发送消息时,设置超时检测,然后重传。
3 - 高志强2020-02-19想问一下老师,分布式事物,在不同节点不基于数据库的实现,是不是难度很大。如果使用mysql实现事物,多个节点是不是就无法使用了
作者回复: 一般而言,是用数据库就可以了,自己实现的复杂度比较高,如果没有很硬的需求,不推荐自己实现。事务的原子性,要求要么全部提交、要么全部不提交,也就是说,当有分区错误或节点故障时,都无法提交,需要是注意的是,旧数据是一致的,是能读的,只是新数据无法写入。
3 - 陈2020-02-19事务型分布式系统的缺点是在并发情况下的资源锁定,优点是保证一致性。
作者回复: 加一颗星:)
2 - 施耀南2020-02-17谢谢韩老师的讲解,通过学习我的理解是:事务型分布式系统 优点:就是最强一致性,保证所有节点都一致。 缺点:复杂带来的开销,节点增加业务规模增加可能导致延迟。
作者回复: 加一颗星:)
2 - heyman2020-07-03看完以后,感觉跟mysql的redo log和binlog的两阶段提交不是同一个东西...老师可以指教一下吗?
作者回复: 加一颗星:),这里介绍的是标准的二阶段提交协议。
共 2 条评论2 - coldwalker2020-04-27请问”如果不是必须,尽量不要实现事务,可以考虑采用强一致性或最终一致性。“这句话怎么理解,这里的事务是指满足ACID的意思吗?分布式事务,ACID,强一致性,最终一致性之间是怎么的关系?
作者回复: 加一颗星:),分布式事务是具有ACID特性的操作。强一致性,有多种含义,比如,线性一致性被称为强一致性;能保证每次读都能读取到新数据,也被称为强一致性;ACID(或者说ACID的C)也被称为强一致性。最终一致性,也有多种含义,比如,最初(在BASE理论提出时),指数据副本的最终一致,现在也指读操作最终能读取更新后的数据。我后面会补充和梳理下各种一致性的含义。另外,这句话,已修正,更确切的说,是“如果不是必须,尽量不要实现事务,可以考虑采用最终一致性”。
1