微信公众号:小林玩大数据
作者:林中鸟
如果你觉得此篇文章对你有帮助,欢迎点赞!
一致性协议概述
在分布式系统中,每一个机器节点虽然都能明确地知道自己在进行事务过程中的结果是成功或失败,但却无法获得其它节点的操作结果。因此,为了保持事务处理的 ACID 特性,就需要引入一个称为“协调者”的组件来统一调度所有分布式节点的执行逻辑,这些被调度的分布式节点被称为“参与者”。协调者负责调度参与者的行为,并最终决定这些参与者把事务真正进行提交。
Two-Phase-Commit(2PC)
二阶段提交协议是将事务的提交过程分成了两个阶段来进行处理,其执行流程如下:
- 阶段一:提交事务请求
- 事务询问
协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应 - 执行事务
各参与者节点执行事务操作,并将 Undo 和 Redo 信息记入事务日志中。 - 各参与者向协调者反馈事务询问的响应
如果参与者成功执行了事务操作,那么就反馈给协调者 Yes 响应,表示事务可以执行;如果参与者没有成功执行事务那么就反馈给协调者 No 响应,表示事务不可以执行。
注:二阶段提交协议阶段一被称为“投票阶段”,即各参与者投票表明是否要继续执行接下去的事务提交操作。
- 阶段二:执行事务提交
在阶段二中,协调者会根据参与者的反馈情况来最终决定是否可以进行事务提交操作,正常情况下,包含以下两种可能:
-执行事务提交
假如协调者从所有的参与者获得的反馈都是 Yes 响应,那么就会执行事务提交,即事务请求成功。
- 发送提交请求
协调者向所有参与者节点发出 Commit 请求。 - 事务提交
参与者接收到 Commit 请求后,会正式执行事务提交操作,并在完成提交之后释放在整个事务执行期间占用的事务资源。 - 反馈事务提交结果
参与者在完成事务提交之后,向协调者发送 Ack 消息。 - 完成事务
协调者接收到所有参与者反馈的 Ack 消息后,完成事务
-中断事务
假如任何一个参与者向协调者反馈了 No 响应,或者在等待超时之后,协调者尚无法接收到所有参与的反馈响应,那么就会中断事务。
- 发送回滚请求
协调者向所有参与者节点发出 Rollback 请求。 - 事务回滚
参与者接收到 Rollback 请求后,会利用其在阶段一中记录的 Undo 信息来执行事务回滚操作,并在完成回滚之后释放在整个事务执行期间占用的资源。 - 反馈事务回滚结果
参与者在完成事务回滚之后,向协调者发送 Ack 消息。 - 中断事务
协调者接收到所有参与者反馈的 Ack 消息后,完成事务中断。
注:总的来说,二阶段提交将一个事务的处理过程分为了投票和执行两个阶段,其核心是对每个事务都采用先尝试后提交的处理方式,因此二阶段提交看作一个强一致性的算法。
时间最擅长不辞而别,一转眼,初夏的5月打马而过!5月再见啦,6月,希望林中鸟儿们遇见阳光且温柔的自己!如果本文对你有帮助,请扫一扫关注!
小林玩大数据