分布式之聊聊ACID和BASE理论
之前我们在《》文中介绍了分布式系统的CAP理论,在实际场景下,一般P是肯定存在的,因此分布式策略一般就是变成了CP和AP选择。那么ACID和BASE理论又是什么呢?
ACID由原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)组成。ACID理论是对事务特性的抽象和总结,一般可用理解为实现了ACID就实现了事务。分布式事务就是对某个操作要么所有节点都成功,要么失败。不允许存在部分成功、部分失败。常用的分布式事务协议有二阶段提交、三阶段提交协议和TCC协议。
二阶段提交协议
为了保证节点的一致性,二阶段协议(也叫2PC)引入了协调者来管理所有节点,并保证这些节点正确提交操作结果,若提交失败则放弃事务。具体分为:投票和提交两个过程。
投票为第一阶段,协调者会向事务的参与者发起执行操作的CanCommit请求并等待参与者响应,参与者收到请求后会执行请求的事务操作,记录日志信息但不提交。参与者执行成功会向协调者发送YES消息,不成功则发送NO消息,终止事务操作。当所有参与者回复了操作结果,则进入提交阶段,在提交阶段,协调者会根据结果发送DoCommit或Abort命令。
如果协调者收到全是YES,则向参与者发送DoCommit消息,参与者完成剩余的提交工作并向协调者回复HaveCommitted消息。
如果协调者收到包含NO的消息,则向所有参与者回复Abort消息。此时参与者会回滚之前的操作,然后向协调者回复HaveCommitted消息。
从上面过程可用看出,二阶段提交中协调者可能存在单点故障问题。此外,假如发生了局部网络异常,可能会造成只有部分节点提交事务,最终造成节点数据不一致问题。
三阶段提交协议
三阶段提交协议(也叫3PC)对二阶段协议进行改进,在第三阶段引入了超时机制和准备阶段。也就是3PC分为了三个阶段:CanCommit,PreCommit,DoCommit过程。
第一阶段 CanCommit,这一阶段协调者向所有节点发送请求操作,然后等待响应。参与者收到请求后回复自己是否(YES/NO)可执行事务。
第二阶段PreCommit,协调者根据参与者回复情况,决定是否执行PreCommit操作。如果所有参与者上一阶段都是回复YES,则协调者提交PreCommit请求,此时参与者收到请求后开始执行事务操作,并将Undo和Redo记录到事务日志中。如果执行成功,则回复ACK响应。如果上一阶段由协调者回复了NO,则这一阶段就中断事务,向参与者节点发送Abort命令。
第三节点DoCommit,这一阶段进入提交或中断过程。如果上一阶段所有参与者回复了ACK,则协调者发送DoCommit命令,参与者正式提交事务并返回ACK响应。如果上一阶段发送的是Abort命令,则进入中断过程,此时参与者收到Abort后根据事务日志的undo信息执行回滚操作并向协调者回复ACK。
如果在这个阶段长时间没有收到协调者的响应,则超时自动提交事务。
TCC协议
TCC分为三个操作Try(预留)、Confirm(确认)、Cancel(撤销)阶段。
首先进入预留阶段(Try),协调者向参与者发送Try消息,若参与者没有问题则回复YES。然后进入确认阶段(Confirm),若参与者正常执行,则返回YES。若预留阶段出错,则进入撤销阶段,此时协调者发送Cancel,取消此次事务。
BASE 理论
BASE理论的核心是基本可用(Basically Available)和最终一致性(Eventually consistent),中间存在过渡的软状态(Soft state)。简单的说就是保证BA(服务的可用)的前提下只能选择E(最终一致性),中间存在一个过渡状态S(软状态)。BASE理论是CAP理论在实践过程中演化而来的。
比如,在双十一促销的时候,面对大流量场景,一般对某些非核心的功能进行降级或停止部分服务。在春节12306抢票的时候,有时候也会分时间段进行释放车票,这也是为了保证高可用。在分布式系统中的限流策略也是为了保证高可用性,这些都是BASE理论的使用场景。
总 结
ACID理论追求强一致性,BASE理论追求可用性而最终一致性,它们都符合CAP理论。Raft算法和Paxos等强一致性算法也是采用了二阶段提交协议,只是在投票阶段,只要大部分节点确认即可。