分布式基础,啥是两阶段提交?

简介: 给自己定了一个目标,用通俗的语言把Paxos讲懂。

分布式事务为什么难?

在分布式环境下,每个节点都可以知晓自己操作的成功或者失败,却无法知道其他节点操作的成功或失败。当一个分布式事务跨多个节点时,保持事务的原子性与一致性,是非常困难的。

什么是两阶段提交?

二阶段提交2PC(Two phase Commit)是一种,在分布式环境下,所有节点进行事务提交,保持一致性的算法。

它通过引入一个协调者(Coordinator)来统一掌控所有参与者(Participant)的操作结果,并指示它们是否要把操作结果进行真正的提交(commit)或者回滚(rollback)。

为什么叫两阶段提交?

顾名思义,2PC分为两个阶段:

投票阶段(voting phase):参与者通知协调者,协调者反馈结果;

画外音:可以理解为单机事务的trx.exec()。

提交阶段(commit phase):收到参与者的反馈后,协调者再向参与者发出通知,根据反馈情况决定各参与者是否要提交还是回滚;

画外音:可以理解为单机事务的trx.commit() 或者 trx.rollback()。

举个栗子:

甲乙丙丁四人要组织一个会议,需要确定会议时间,不妨设甲是协调者,乙丙丁是参与者。

投票阶段

(1)甲发邮件给乙丙丁,通知明天十点开会,询问是否有时间;
(2)乙回复有时间;
(3)丙回复有时间;
(4)丁迟迟不回复,此时对于这个事务,甲乙丙均处于阻塞状态,算法无法继续进行;

提交阶段

(1)协调者甲将收集到的结果通知给乙丙丁;

画外音:什么时候通知,以及反馈结果如何,在此例中取决与丁的时间与决定,

假设丁回复有时间,则通知commit;

假设丁回复没有时间,则通知rollback;
(2)乙收到通知,并ack协调者;
(3)丙收到通知,并ack协调者;
(4)丁收到通知,并ack协调者;

画外音:如果甲没有收到所有ack,则分布式事务迟迟不会结束,下一轮投票则迟迟不会开展。

两阶段提交的缺陷?

2PC在执行过程中,所有节点都处于阻塞状态,所有节点所持有的资源(例如数据库数据,本地文件等)都处于封锁状态。

典型情况为:

(1)某一个参与者回复消息之前,所有参与者以及协调者都处于阻塞状态;

(2)在协调者发出消息之前,所有参与者都处于阻塞状态;

另外,如有协调者或者某个参与者出现了崩溃,为了避免整个算法处于一个完全阻塞状态,往往需要借助超时机制来将算法继续向前推进。

总的来说,2PC是一种比较保守并且低效的算法,分布式事务真的很难做。

思路比结论重要。

image.png
架构师之路-分享可落地的技术文章

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
机器学习/深度学习 传感器 算法
【微电网优化】基于粒子群实现含分布式电源日前两阶段优化调度模型附matlab代码
【微电网优化】基于粒子群实现含分布式电源日前两阶段优化调度模型附matlab代码
【微电网优化】基于粒子群实现含分布式电源日前两阶段优化调度模型附matlab代码
分布式学习六:三阶段提交(3PC)
分布式学习六:三阶段提交(3PC)
228 0
|
缓存 运维 负载均衡
架构动静分离和分布式阶段——阿里云 MVP乔锐杰
乔锐杰,上海驻云运维总监,江湖人称“乔帮主”。本文是乔帮主在阿里云的直播中分享《阿里云千万级架构的构建——架构的成长演变之路》的第三部分。
2249 1
架构动静分离和分布式阶段——阿里云 MVP乔锐杰
|
4月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
371 2
|
4月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
324 6
|
5月前
|
存储 缓存 NoSQL
Redis核心数据结构与分布式锁实现详解
Redis 是高性能键值数据库,支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,广泛用于缓存、消息队列和实时数据处理。本文详解其核心数据结构及分布式锁实现,帮助开发者提升系统性能与并发控制能力。
|
9月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
955 0
分布式爬虫框架Scrapy-Redis实战指南
|
3月前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
255 0
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)