事务干货放送 细说分布式事务两阶段提交
在分布式系统中 , 读写位于多个节点的数据 , 如果依旧想保证ACID特性 , 就必须实现分布式事务 。 而其实现关键则是适当的提交协议 , 目前最简洁 , 且使用最广泛的无疑是两阶段提交协议(2PC) 。
实现分布式事务关键组件
单机系统通过事务管理器(transaction manager , TM)实现本地事务 。 分布式系统中 , 需要协调多个节点的事务管理器 , 共同提交成功或失败 , 因此需要事务协调者(transaction coordinator , TC) 。 一个分布式事务管理器 , 可以粗略地划分为这两个子系统 。 这两个子系统根据自己在事务执行中扮演的角色 , 也可称之为参与者与协调者 。
本地事务管理器负责本机事务并发控制和异常恢复等功能 , 事务协调者负责开启事务 , 将事务划分为多个子事务分发到相应的节点执行 , 并协调事务完成(一起提交成功或失败) 。 在实现中 , TM和TC可以实现在同一个进程中 , 也可以部署在不同的节点 。
经典两阶段提交协议
两阶段提交的流程比较简单 。 当分布式事务T执行完成进入提交阶段 , TC便开启两阶段提交流程 。
本文插图
Phase 1 Prepare:
1.TC写本地日志 , 并持久化 。 TC向所有参与者发送Prepare T消息 。
2.各参与者TM收到Prepare T消息 , 根据自身情况 , 决定是否提交事务 。
如果决定提交 , TM写日志并持久化 , 向TC发送Ready T消息 。
如果决定不提交 , TM写日志并持久化 , 向TC发送Abort T消息 , 本地也进入事务abort流程 。
Phase 2 Commit :
1.当TC收到所有节点的回应 , 或者等待超时 , 决定事务commit或abort 。
如果所有参与者回应Ready T , 则TC先写日志并持久化 , 再向所有参与者发送Commit T消息 。
如果收到至少一个参与者Abort T回应 , 或者在超时时间内有参与者未回应 , 则TC先写日志 , 再向所有参与者发送Abort T消息 。
2.参与者收到TC的消息后 , 写或日志并持久化 。
两阶段提交协议可以保证分布式事务执行的一个关键点:参与者在向协调者发生Ready T消息前 , 随时都可以自己决定是否abort , 一旦这个消息发送 , 那么这个事务就进入ready状态 , commit和abort完全由协调者控制 。 Ready T消息本质上是参与者向协调者发送的一个郑重的、不可逆的承诺 。
为了保证这一个承诺 , 参与者需要在发送Ready T消息前将所有必要的信息持久化 , 否则如果参与者在发送Ready T后异常宕机 , 重启后可能无法遵守以上承诺 。 在第二阶段 , 当协调者写了或日志 , 整个事务的命运就被决定了 , 不会再发生变化了 。
为了优化2PC性能 , 减少关键路径的持久化和RPC次数是关键 , 一种对经典2PC的优化思路如下:
协调者无状态 , 不再持久化日志 , 但是为了方便宕机重启后恢复事务状态 , 需要向每个参与者发送事务的参与者名单并持久化 。 这样即使协调者宕机 , 参与者也可以方便地询问其他参与者事务状态了 。 该思路相当于参与者在协调者宕机时 , 自己担当起协调者询问事务状态的任务 。
只要所有参与者prepare成功 , 事务一定会成功提交 。 因此为了减少提交延时 , 协调者可以在收到所有参与者prepare成功后就返回客户端成功 , 但如此 , 读请求可能会因为提交未完成而等待 , 从而增大读请求的延时 。 反过来 , 如果协调者确认所有参与者都提交成功才返回客户端成功 , 提交延时比较长 , 但会减少读请求延时 。
两阶段提交协议异常处理
两阶段提交协议的正常流程较为简单 , 但它还需要考虑分布式系统中各种异常问题(节点失败 , 网络分区等) 。
1.如果协调者检测到参与者失败:
推荐阅读
- 金税宝 利用不同地区税收扶持政策2、改变劳务属性,灵活用工,干货来了!社交电商如何做才能合规合法?1、擅用税收减免政策
- 杯中窥史|为何印度东北六省地区的民族分离运动最为严重?干货都在这里!
- 个体干货来了!社交电商如何做才能合规合法?1、擅用税收减免政策,利用不同地区税收扶持政策2、改变劳务属性,灵活用工
- 甜野猫|干货:2020中国智慧物流产业研究报告
- 上观新闻|直播带来满满反诈干货——上海徐汇警方开展全区财会人员防范电信诈骗系列直播宣讲活动
- 冷水|用热水还是用冷水?教你一招,干货变鲜货!泡发干鱿鱼
- 水果怎么吃|粉丝题目反馈!50条新手化妆技巧干货!
- 超极游戏|江铃福特乘用车8月清凉大放送
- 油炸小可爱 SpreadJS 前端表格技术分享,硬核干货:葡萄城
- 大白墙|【干货】硬装只刷了大白墙,软装该如何补救?
