集中式是指一台或多台计算机组成中心节点,数据集中存储于这个中心节点中。集中式系统的最大特点是部署结构简单,不需要考虑多个节点之间的分布式协作问题。
分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。
分布式系统有以下几个特征:
隔离级别 | 脏读 | 可重复读 | 幻读 |
---|---|---|---|
未授权读取 | 存在 | 不可以 | 存在 |
授权读取 | 不存在 | 不可以 | 存在 |
可重复读取 | 不存在 | 可以 | 存在 |
串行化 | 不存在 | 可以 | 不存在 |
分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于分布式系统的不同节点之上。
为了构建一个兼顾可用性与一致性的分布式系统,出现了诸如CAP和BASE这样的分布式经典理论。
CAP理论告诉我们,一个分布式系统不可能同时满足一致性(C: Consistency)、可用性(A: Availability)和分区容错性(P: Partition tolerance)这三个基本需求,最多只能同时满足其中的两项。
BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写。核心思想是即使无法做到强一致性,也可以采用适当的方式使系统达到最终一致性。
分布式系统中引入了“协调者(Coordinator)”组件来统一调度所有分布式节点的执行逻辑,这些被调度的分布式节点被称为“参与者(Participant)”。
二阶段提交协议分为投票和执行两个阶段。
投票阶段:协调者向所有参与者发送事务内容,询问是否可以执行,各参与者执行事务,并将Undo和Redo信息记入事务日志中,然后给协调者返回响应。
执行阶段:如果所有参与者都返回yes响应就会执行事务提交。协调者向所有参与者发送Commit请求,参与者完成事务提交并释放资源后向协调者发送Ack消息,协调者收到所有ack消息后完成事务。
中断事务:如果协调者收到了no响应,或者等待超时,就会中断事务。协调者向所有参与者发送Rollback请求,参与者利用Undo信息执行回滚,并向协调者发送Ack,协调者收到所有ack消息后完成事务中断。
二阶段提交的方式存在下面几个问题:
1、同步阻塞。参与者在等待其他参与者响应的过程无法进行其他操作。
2、单点问题。一旦协调者出现问题,就无法继续完成事务操作。
3、数据不一致。在阶段二也就是执行阶段,如果发生局部网络异常,部分参与者可能没有完成Commit。
4、太过保守。没有容错机制,任何一个节点的失败都会导致整个事务的失败。
三阶段提交协议将二阶段提交协议的“提交事务请求”过程一分为二,形成了由CanCommit、PreCommit、do Commit三个阶段组成的事务处理协议。
阶段一:CanCommit。协调者向所有参与者发送事务内容的CanCommit请求,参与者返回是否能够执行的响应。
阶段二:PreCommit。这一阶段分为两种情况。一是所有的参与者都返回yes,就会执行事务预提交。协调者向所有参与者发送PreCommit请求,参与者执行事务操作并将Undo和Redo信息记录到事务日志中,参与者成果执行就返回ack消息并等待最终指令:提交(commit)或终止(abort)。二是如果有参与者返回no或者协调者等待超时,进入事务中断流程。协调者向所有参与者发送abort请求,参与者收到abort请求或者等待超时就会中断事务。
阶段三:do Commit。这一阶段也有两种情况。一是协调者正常工作并且收到所有参与者的ack消息,就会从“预提交”状态转换到“提交”状态,并向所有的参与者发送“doCommit”请求。然后就是参与者执行事务,发送ack,协调者完成事务。二是有参与者发送no或者等待超时,协调者会向所有参与者发送abort请求,参与者利用Undo执行回滚然后发送ack,最后完成事务中断。
阶段三可能会出现协调者出现问题或者网络故障,这时参与者会在等待超时后继续进行事务提交。
三阶段提交协议优点:降低了参与者阻塞范围,能够在出现单点故障后继续达成一致。
缺点:参与者收到PreCommit消息后,如果出现网络分区,参与者依然会进行事务提交,这种情况会出现数据不一致。
Paxos算法是基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一。
算法原理参考:Paxos算法原理与推导