注册
DMDPC如何确定分布式事务的数据可见性
技术分享/ 文章详情 /

DMDPC如何确定分布式事务的数据可见性

纯手工老虎 2024/06/27 970 2 0

1.引言

在现代数据库系统中,尤其是在分布式数据库领域,确保事务的ACID属性(原子性、一致性、隔离性、持久性)是系统设计的核心。达梦数据库(DMDPC)分布式数据库,其分布式架构设计中对分布式事务的处理尤为关键。本文将深入探讨达梦数据库在分布式事务中数据的可见性与一致性保障机制,分析其技术实现,并提出一些思考。

2.全局时钟系统(GTS)

在分布式数据库系统中,事务跨越多个节点进行操作时,如何保证事务的隔离性和数据的一致性成为了一个技术难题。由于网络分区、节点故障等问题,分布式事务的操作正确性,顺序的保障难度远比单体数据库高,需要引入更加复杂和健壮的机制来确保数据操作的正确性,即满足数据库运行过程中的ACID原则。

为了解决分布式事务中的一致性和隔离性问题,达梦数据库引入了全局时钟系统(GTS)。GTS通过一个全局唯一的时钟值来帮助各个节点判断事务操作的数据可见性,该全局时钟值可以类比zookeeper中的zid,在每一次事务的操作过程中,都会向mp节点申请一个唯一的时钟值,用来标识和区分事务的前后顺序,确保在事务运行过程中,能做到全局的顺序一致性,也实现了后文中将提到的全局数据可见性的基础。

3.分布式事务的数据可见性

3.1 CA和MCA数组

  • CA(Current Array):BP节点用来存放当前事务信息的数组,记录了事务号TID、事务状态和全局时钟值。事务状态包括预提交和提交两种。任意一个bp节点提交操作时均会向 MP 申请当前的全局时钟值。然后,BP 将执行操作时的事务号 TID、事务状态和时钟值登记在数组 CA 中。事务状态分为预提交和提交两种,分别表示一阶段预提交和二阶段提交。事务的 TID 和时钟值一样,是全局唯一且不变的。当事务从预提交状态进入提交状态,CA 中的事务状态和时钟值会进行同步更新。
  • image.png
  • MCA(Majority Commit Array):MCA则是MP节点用来存放已经提交的事务信息,当事务执行提交操作过程中向 MP 申请全局时钟值时,MP 会将该事务的 TID 和当前时钟值登记在 MCA 中。MCA 中登记的事务均为已经执行过提交操作的事务。
    image.png

3.2 事务信息登记流程

  1. 事务对数据进行修改时,在日志记录中登记修改数据的事务号TID。
  2. 事务执行一阶段的预提交时,在CA中登记TID、预提交状态和预提交时的时钟值。
  3. 事务执行二阶段提交,即正式提交时,在MCA中会登记正式提交时的TID和时钟值,并将该信息同步更新到CA中,将上一步中记录的预提交信息覆盖。

3.3 数据可见性判断

根据前文所说,在任何事务操作的过程中,bp节点都会向mp节点申请当前的全局时钟值,因此,全局时钟值可以作为一个trxid或者说lsn来看待,只要是早于该时钟值的已修改数据,多数情况是可见的。

在BP判断某一数据是否可见时,还需要按照如下流程查询,首先是找出修改该数据的事务tid,之后,再根据该tid,确定在ca数组中查询该事务的事务状态和时钟值。根据事务状态和时钟值的差异,可以衍生出多种情况。

3.3.1 事务时钟值小于当前时钟值,且状态为已经提交

该数据当下肯定已经完整写入,视为可见

3.3.2 事务时钟值大于当前时钟值

该事务迟于当前事务发起,且数据无法保证能够成功写入,视为不可见

3.3.3 事务时钟值小于当前时钟值,且状态为预提交

事务状态在ca中仅为预提交,无法保证是否确实提交,需要进一步进入mca中查询。此处又出现两种情况:

1、如果 MCA 中找到了对应的 TID 和时钟值 ,且mca中的时钟值小于当前时钟值,由于mca仅保存成功提交的数据,则证明该已经成功提交,该数据视为可见

2、如果MCA 中没有找到对应的 TID 和时钟值,则证明该数据仍未成功提交,视为不可见。

3、如果 MCA 中找到了对应的 TID 和时钟值 ,但mca中的时钟值大于当前时钟值,说明该数据虽成功提交,但提交时间在当前事务之后,仍是视为不可见。

总结上述流程,在dpc中,事务判断数据的可见性,有一套较为完善且逻辑严密的判断流程,简单而言即是,时钟值小于当前时钟值,且状态确定为提交,满足这两个条件,即数据视为可见。
具体判断流程逻辑可见下图:
mermaiddiagram20240624145448.png

结论

在dpc中,通过引入GTS机制,有效地解决了分布式环境下的数据可见性问题,其实现依赖于全局时钟的精确推进和节点间的紧密协作。当前多数分布式系统均采用引入类似的全局唯一值,作为数据可见性、一致性及集群主节点选举的依据,但在实际应用中,可能会由于网络波动、节点性能差异等多方因素都可能造成GTS的取值有误,以及频繁的取值、逻辑判断是否会对性能造成一定的损耗,还需要在更多的实践过程中学习及验证。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服