这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
分布式相关理论
CAP定理
思想:一个分布式系统不可能同时满足一致性、可用性、分区容错性这三个基本需求,最多只能同时满足其中的2个
- 一致性:Consistency
解释:一致性分布式系统当中的一致性指的是所有节点的数据一致,或者说是所有副本的数据一致
示例:写入主数据库后,在向从数据库同步期间要将从数据库锁定, 等待同步完成后在释放锁
- 可用性:Availability
解释:系统一直可用,而且服务一直保持正常
示例:写入主数据库后,要向从数据库同步,数据未同步成功时,也要返回查询数据,不能返回错误和超时
- 分区容错性:Partition tolerance
解释:分区容错性系统在遇到一些节点或者网络分区故障的时候,仍然能够提供满足一致性和可用性的服务
示例:使用异步数据从主数据同步到从数据库,添加数据库节点。一个节点挂掉,从其它节点同步
BASE 理论
思想:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性
- Basically Available(基本可用)
解释:系统出现故障时,损失部分可用性,整体依然可以运行
- Soft state(软状态)
解释:允许系统中的数据存在中间状态,该状态不影响系统的整体可用性,即允许副本在不同的多个节点同步时存在延迟
- Eventually consistent(最终一致性)
解释:数据最终一定能够达到一致的状态
分布式事务
2PC
两阶段提交,将事务的提交过程分为资源准备和资源提交两个阶段,并且由事务协调者来协调所有事务参与者,如果准备阶段所有事务参与者都预留资源成功,则进行第二阶段的资源提交,否则事务协调者回滚资源
- 资源准备
- 协调者向所有参与者发送事务内容,询问是否可以提交事务,并等待答复
- 各参与者执行本地事务操作,将 undo 和 redo 信息记入事务日志中(但不提交事务)
- 如参与者执行成功,给协调者反馈同意,否则反馈中止,表示事务不可以执行
- 资源提交
-
事务提交
- 协调者节点向所有参与者节点发出正式提交的 commit 请求
- 收到协调者的 commit 请求后,参与者正式执行事务提交操作,并释放在整个事务期间内占用的资源
- 参与者完成事务提交后,向协调者节点发送ACK消息
- 协调者节点收到所有参与者节点反馈的ACK消息后,完成事务
-
事务回滚
- 协调者向所有参与者发出 rollback 回滚操作的请求
- 参与者利用阶段一写入的undo信息执行回滚,并释放在整个事务期间内占用的资源
- 参与者在完成事务回滚之后,向协调者发送回滚完成的ACK消息
- 协调者收到所有参与者反馈的ACK消息后,取消事务
- 缺点
- 性能问题:执行过程中,所有参与节点都是事务阻塞性的,当参与者占有公共资源时,其他第三方节点访问公共资源就不得不处于阻塞状态,为了数据的一致性而牺牲了可用性,对性能影响较大,不适合高并发高性能场景
- 可靠性问题:2PC非常依赖协调者,当协调者发生故障时,尤其是第二阶段,那么所有的参与者就会都处于锁定事务资源的状态中,而无法继续完成事务操作
- 数据一致性问题:在阶段二中,当协调者向参与者发送commit请求之后,发生了局部网络异常或者在发送commit请求过程中协调者发生了故障,这回导致只有一部分参与者接受到了commit请求。而在这部分参与者接到commit请求之后就会执行commit操作。但是其他部分未接到commit请求的机器则无法执行事务提交
3PC
改进点:把2PC的准备阶段拆分成CanCommit和PreCommit两个阶段,同时引入超时机制来解决2PC的同步阻塞问题
缺点:数据不一致问题依然存在
-
CanCommit 准备阶段
- 协调者向参与者发送 canCommit 请求,参与者如果可以提交就返回Yes响应,否则返回No响应
-
PreCommit 阶段
- 协调者根据参与者的反应情况来决定是否可以进行事务的 PreCommit 操作
总结
本次笔记记录部分分布式相关理论,有兴趣的同学可以自行百度