分布式系统中的数据库事务 | 青训营笔记
前言
这是我在青训营学习发布的第七篇笔记,本文将概述在分布式系统中使用的分布式数据库事务解决方案。
分布式系统的定义
分布式系统是由多个计算机程序组成的集合,利用跨多个独立计算节点的计算资源来实现共同的目标。它可以包括分布式计算、分布式存储和分布式数据库等。
在分布式系统中,由于不同节点可能维护各自的数据库,但这些数据库需要保持同步,这可能引发同步问题。
为了解决这些问题,我们引入了分布式事务的解决方案。
分布式事务
在分布式事务中,有多种处理方案可在不同程度上解决我们的问题:
二阶段提交
二阶段提交(Two-phase Commit)是为使基于分布式系统架构下的所有节点在事务提交时保持一致性而设计的一种算法。
在二阶段提交算法中,我们引入了三个假设:
引入协调者(Coordinator)和参与者(Participants)之间进行网络通信。 所有节点采用预写式日志,日志写入后保存在可靠的存储设备上。 所有节点都不会永久损坏,即使发生损坏后仍能恢复。 在这三个假设中,二阶段提交算法的工作方式如下:
协调者作为中心节点,负责处理参与者之间可能存在的冲突;参与者负责提交事务并向协调者进行通知。 当准备提交事务时,首先进入准备阶段(Prepare Phase),协调者向参与者发送询问消息,参与者执行事务但不提交,并返回自身的状态是否正常。 当所有参与者返回正常的确认信息后,进入提交阶段(Commit Phase),协调者通知参与者进行事务提交,并收到确认提交的信号。 在这个过程中可能出现以下异常情况:
协调者未宕机,但参与者宕机,在准备阶段,参与者向协调者返回错误信号;此时协调者通知所有参与者执行已进行的回滚操作,以确保数据一致性。 协调者宕机,但参与者未宕机,此时只需更换新的协调者,然后重新进行二阶段提交即可。 协调者和参与者均宕机,此时无法确认状态,需要数据库管理员介入,以防止数据库进入不一致的状态。 二阶段提交算法在一定程度上解决了分布式事务提交时数据不一致的问题,但也存在缺陷:
性能问题:二阶段提交需要多次节点间的网络通信,耗时较长,同时资源需锁定,增加了资源等待时间。 协调者单点故障问题:如果事务协调者宕机,需要选举新的协调者,否则参与者会处于中间状态无法完成事务。 网络分区引起的数据不一致问题:一部分参与者收到了提交消息,另一部分参与者未收到提交消息,导致节点间的数据不一致。
三阶段提交
三阶段提交在二阶段提交的基础上进行了优化,以解决二阶段提交中的单点故障和阻塞问题。
三阶段提交将准备阶段进一步拆分为可以进行以下三个阶段:
首先,在CanCommit阶段,协调者询问各个参与者是否能够正确执行事务,参与者根据自身情况返回一个预估值(此时并未真正执行事务)。 进入PreCommit阶段,根据CanCommit阶段的结果,协调者采取相应的操作。如果所有参与者都返回确认信息,则协调者向所有参与者发送事务执行通知,参与者收到通知后执行事务但不提交,并将事务执行结果返回给协调者;如果一个或多个参与者返回等待信息,或者协调者等待参与者返回确认信息的超时时间过长,则直接中断事务。 进入DoCommit阶段,如果在CanCommit阶段事务未被中断,则协调者根据事务执行结果决定是提交还是回滚事务。如果所有参与者都能正常执行事务,则协调者向所有参与者发送事务提交通知,参与者收到通知后执行提交操作,并将提交结果返回给协调者;如果一个或多个参与者执行事务失败,或参与者等待协调者的返回信息超时,则协调者要求所有参与者进行事务的回滚并反馈回滚结果。 在这个阶段,如果由于协调者或网络问题导致参与者无法及时接收协调者的提交或回滚请求,参与者将不会像二阶段提交中那样陷入阻塞状态,而是等待一段时间后继续执行提交操作。相对于二阶段提交,虽然减少了同步阻塞,但仍无法完全避免数据不一致的可能性。
MVCC
多版本并发控制(MVCC)是广泛使用的一种并发控制方法,用于数据库管理系统中提供并发访问,并实现事务的内存模型。 —— 来源:Wikipedia
MVCC是一种并发控制方法,通过维护数据的多个版本,使得读写操作互不干扰,既不会阻塞写操作也不会阻塞读操作。MVCC为每个修改保留一个版本,并与事务的时间戳相关联。它可以提高并发性能,并解决脏读的问题。
引用
该笔记材料主要来源于: 后端 - 字节内部课 (juejin.cn)