这是我参与[第五届青训营]伴学笔记创作活动的第8天
分布式
什么是分布式
分布式系统是计算机程序的集合,这些程序利用跨多个独立计算节点的计算资源来实现共同的目标。可以分为分布式计算,分布式存储,分布式数据库等。
在分布式系统中,由于不同节点可能维护各自的数据库,但是为了保持数据库的同步,就引入了分布式事务的解决方案
分布式事务
在分布式事务中,有很多方案可以解决数据库不同步的问题,比如
二阶段提交
二阶段提交是为了使基于分布式系统框架的所有节点在进行事务提交时保持一致性而设计的一种演算法,在二阶段提交算法中,我们必须引入三个假设
- 引入协调者和参与者,互相进行网络通信
- 所有节点都采用预写式日志,且日志被写入后即被保存在可靠的存储设备上
- 所有节点不会永久性损坏,即使损坏后依然可以恢复
二阶段提交算法的工作方法
- 协调者作为一个中心节点,负责处理参与者之间可能存在的冲突,参与者负责提交事务并告知协调者
- 当希望提交事务时,会先进入 Prepare 阶段,协调者向参与者发送询问信息,参与者执行事务,但不提交,返回自己当前的状态是否正常
- 当所有参与者返回正常的确认信号后,进入 Commit 阶段,协调者即可通知参与者进行事务的commit,并收到 Ack 信号确认 commit 完成
二阶段提交算法一定程度上解决了分布式事务提交数据不一致的问题,但也有一定的问题:
二阶段提交的缺点
- 性能问题。二阶段提交需要多次节点间的网络通信,耗时过大,同时资源需要进行锁定,徒增资源等待时间
- 协调者单点故障问题。如果事务协调者节点宕机,需要另起新的协调者,否则参与者处于中间状态无法完成事务
- 网络分区带来的数据不一致问题。一部分参与者收到了 commit 消息,另一部分参与者没收到commit,导致节点之间数据的不一致
所以引入了三阶段提交
三阶段提交
三阶段提交在二阶段提交的基础上进行了优化,以解决二阶段提交单点故障和阻塞的问题。
- 首先,在 CanCommit 阶段,协调者会询问各个参与者是否能够正确执行事务,参与者会根据自身状况返回一个预估值(此时并未真正执行事务)
- 进入 PreCommit 阶段,协调者根据 CanCommit 阶段的结果采取操作。如果所有参与者均返回确认信息,则向所有参与者发送事务执行通知,参与者收到通知后执行事务,但不提交,然后将事务执行情况返回给协调者;如果一个或多个参与者返回等待信息,亦或者协调者等待参与者返回确认信息超时,则会直接中断事务
- 进入 DoCommit 阶段,如果 CanCommit 阶段的事务未发生中断,则协调者会根据事务执行返回的结果来决定提交或回滚事务。如果所有的参与者都能正常执行事务,则协调者会向所有参与者发送事务 commit 通知,参与者在收到通知后会进行 commit 操作,然后向协调者返回提交结果;如果一个或多个参与者执行事务失败,或参与者等待协调者返回信息超时,则协调者会要求所有参与者 rollback 事务,并反馈 rollback 结果
这里借鉴了其他同学的笔记,可以去他的文章上看哦
作者:HikariLan贺兰星辰
链接:juejin.cn/post/719542…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
MVCC
多版本并发控制(MCC 或 MVCC)是数据库管理系统常用的一种并发控制方法,用于提供对数据库的并发访问,并以编程语言实现事务内存。 —— Wikipedia
MVCC为每个修改保存一个版本,和事物的时间戳相关联。可以提高并发性能,解决脏读的问题。