一种通过引脚桥接实现全局事务分布式处理方法与流程

文档序号:19081728发布日期:2019-11-08 22:41阅读:338来源:国知局
一种通过引脚桥接实现全局事务分布式处理方法与流程

本发明涉及一种分布式数据库系统的事务一致性实现方法,尤其是涉及一种通过引脚桥接实现全局事务分布式处理方法。



背景技术:

关系型的数据库系统必须支持事务的acid特性,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。对一个分布式的数据库而言,系统是由多个数据库节点组成,一个事务可能需要在多个节点上执行,这种事务被称为全局事务;在节点本地执行的事务叫本地事务。全局性事务的原子性和一致性要求事务涉及到数据库节点要么全部执行成功,要么全部不执行。但是,一个节点在执行本地事务的时候无法知道其他节点的本地事务执行结果,因此也就不知道本次全局事务究竟是否全部成功还是需要回滚。

为了解决这一问题,x/open组织定义分布式事务处理模型,引入了事务管理器(tx),定义了事务管理器和数据库之间的接口规范,用来保证分布式事务的开始、结束以及提交、回滚等。xa接口函数由数据库厂商自己实现和提供。

x/a规范虽然解决了全局事务的一致性问题,但是传统的实现方法存在两个问题:

1)事务的访问需要经过事务管理器(tx)来进行,那么在高并发、大数据量的情况下事务管理器(tx)容易成为整个分布式数据库系统的瓶颈所在;

2)数据库访问多了一层事务管理器处理,延时更高,性能更低,整体效率变低了。



技术实现要素:

本发明提供了一种通过引脚桥接实现全局事务分布式处理方法,用于解决上述提到的高并发及大数据量情况下事务管理器(tx)瓶颈问题以及数据库访问效率低的问题,通过优化的x/a规范实现方法,可以降低事务管理器(tx)的访问压力,同时提高分布式数据库的访问效率。其技术方案如下所述:

一种通过引脚桥接实现全局事务分布式处理方法,包括下列步骤:

s1:执行一个分布式全局事务语句时,客户端通过客户端驱动器生成一个全局唯一的事务引脚,然后将语句发给协调器做分布式语句解析,同时会带上此引脚信息;

s2:协调器对语句进行解析,如果语句解析正确,协调器根据自己管理的节点信息和数据分布信息对语句进一步分析,制定出该语句的分布式执行计划,并将此分布式执行计划反馈给客户端驱动器,同时协调器也会记录本次事务的引脚信息以及本次分布式执行计划;

s3:客户端驱动器获得分布式执行计划后,知道了语句需要在哪些数据库节点执行,并行访问这些数据库节点要求执行事务语句,同时会附带上本次事务的引脚信息;

s4:节点数据库收到客户端驱动器的数据库访问请求后,把本次请求当作一个本地事务,按照本地事务的处理过程进行数据库操作处理,同时会记录下引脚信息,使得全局事务变成在多个数据库节点上独立执行的本地事务,但记录有相同的引脚信息;

s5:在节点数据库上执行完毕,如果有任何一个节点执行报错,客户端收到报错信息后在每个节点都进行事务回滚,本次事务失败,事务结束;如果没有执行报错,客户端通过客户端驱动器获得本次全局事务在数据库节点上都正确执行的消息后,整个分布式事务进入下一个步骤,即事务提交步骤,在这个阶段的开始,客户端向协调器发起提交请求;

s6:协调器收到客户端驱动器的全局事务提交请求,根据附带的引脚信息检索全局事务的分布式执行计划信息,知道本次全局事务有哪些数据库节点参加以及所作的工作;

s7:协调器构建一个保持事务管理器和事务相关数据库节点之间一致性的全局唯一事务id,然后按照x/a规范定义的两阶段提交或三阶段提交标准处理和数据库节点间的提交过程;

s8:协调器和数据库节点之间的提交完成后,协调器根据引脚信息返回结果给客户端驱动器,客户端驱动器进一步反馈给客户端应用程序,全局事务过程结束。

进一步的,步骤s1中,如果一个事务包含多条语句,需要在多个不同分布式数据库节点上执行,这些语句都使用相同的引脚信息。

进一步的,步骤s2中,协调器对语句进行解析,看是否是一个符合sql语句规范分布式数据库语句,如果不是则返回错误信息给客户端驱动器,客户端捕捉并处理错误信息,全局事务中止。

进一步的,步骤s2中,当事务包含多条语句时,协调器对每条语句都会做解析,解析正确,则根据自己管理的节点信息和数据分布信息对语句进一步分析,制定出该语句的分布式执行计划,并将此分布式执行计划反馈给客户端驱动器,同时协调器也会记录本次事务的引脚信息以及本次分布式执行计划。

进一步的,步骤s5中的进行回滚操作如下:任何一个数据库节点上的本地事务,如果执行发生错误被客户端驱动器捕捉并反馈给上层应用程序后,如果客户端执行回滚操作,那么客户端驱动器会向本次全局事务相关的所有执行节点,所有执行语句下达回滚指令,业务终止;

如果客户端通过客户端驱动器收到全局事务相关的每个数据库节点上的本地事务语句都执行成功的反馈,客户端会向协调器发起全局事务提交操作,同时会附带上本次事务的引脚信息。

并且,如果一个事务是由相同的语句重复执行,只是每次执行操作的数据对象不同构成时,为了提高效率,会采取批量执行一次提交的模式,这些语句每次重复执行都是使用同一个分布式执行计划,在批量操作结束前客户端不会再去请求协调器解析,批量操作变成了客户端驱动器和数据节点间的直接交互过程。在这种模式下无论语句重复执行多少次,客户端只会和协调器发生一次交互解析,提高了效率,降低了协调器的压力。

协调器支持双活或者多活,功能保持一致,互相之间进行数据同步,事务的引脚信息在多个协调器里同时保存,当一台协调器出现故障后客户端驱动器可以切换到另外一台进行访问,应用程序没有感知。

所述引脚为数据库内部标注分布式事务唯一id,和两阶段提交时候为保持事务一致性生成xid不同,引脚在事务一开始即产生(xid在事务提交时候才生成),贯穿事务开始到结束的始终,并且在客户端、协调器,分布式数据库节点上都会保存,如同在每个设备节点上都装上一个针脚并在逻辑互相连接起来,这样无论在那个设备上都能识别出大家是否来自同一个事务。

所述通过引脚桥接实现全局事务分布式处理方法具有以下优点:

1)在分布式数据库全局事务的处理过程中,除了第一次需要获得节点数据分布信息外,客户端驱动器对本地事务的访问请求不经过事务管理器(本发明中为协调器)而是直接访问节点数据库,降低了对事务管理器(tx)的访问压力;当全局事务提交的时候事务管理器(tx)再继续参与;

2)因为客户端应用通过驱动器可以直接访问数据库节点,语句交互效率大幅提升;

3)特别地,当一个全局事务涉及到批量操作一次提交的时候也只需要从事务管理器(本发明中为协调器)获得一次节点数据分布信息,在全局事务提交之前,批量操作的每一步都是客户端驱动器和数据库节点之间的直接访问,可以更加显著地降低事务管理器的压力和提升系统效率。

附图说明

图1是分布式数据库关系图;

图2是全局事务语句分析及执行关系图;

图3是全局事务提交关系图;

图4是通过引脚桥接后的完整关系图。

具体实施方式

本发明提供了一种通过引脚桥接实现全局事务分布式处理方法,其运行架构包括以下几部分:

客户端和客户端驱动器:客户端即数据库应用访问程序,按照客户端驱动器提供的数据库访问接口访问数据库;客户端驱动器为客户端的数据库应用访问程序屏蔽了数据库访问细节,提供和协调器的交互以及和分布式数据库节点的交互,生成唯一的全局事务引脚;

协调器:除了具有事务管理功能外,还具有对分布式数据库节点的管理功能,存储数据分布信息。除了能够处理来自客户端的访问请求,此外还具有分布式语句的解析功能,分布式语句的优化功能等;

分布式数据库节点:至少设置有两个,节点运行有完整的关系型数据库实例,提供相关的数据库服务以及接受来自协调器的管理指令。

本发明将一个分布式数据库全局事务的完成过程分解为由客户端发起的语句分析及执行,以及事务提交两个过程,并且通过由客户端驱动器创建唯一的事务引脚将两个过程桥接起来,逻辑上构成一个完整的过程。这样做的目的是尽量减少事务管理器(本专利中由协调器提供事务管理的功能)在整个事务过程中的参与,而尽量让客户端和分布式数据库节点直接交互。这样一方面降低了事务处理器的压力,同时也缩短了语句执行路径,提升了对数据库的访问效率。

所述引脚为数据库内部标注分布式事务唯一id,和两阶段提交时候为保持事务一致性生成xid不同,引脚在事务一开始即产生(xid在事务提交时候才生成),贯穿事务开始到结束的始终,并且在客户端、协调器,分布式数据库节点上都会保存,如同在每个设备节点上都装上一个针脚并在逻辑互相连接起来,这样无论在那个设备上都能识别出大家是否来自同一个事务。

本发明具体应用的描述如下:

s1:首先,当执行一个分布式全局事务语句时,客户端通过客户端驱动器会生成一个全局唯一的事务引脚,然后将语句发给协调器做分布式语句解析,同时会带上此引脚信息,如果一个事务包含多条语句需要在多个不同分布式数据库节点上执行,这些语句都使用相同的引脚信息。

s2:协调器首先对语句进行解析,看是否是一个合法的,也就是符合sql语法规范分布式数据库语句,如果不是则返回错误信息给客户端驱动器,客户端捕捉并处理错误信息,全局事务中止。如果语句解析正确,协调器根据自己管理的节点信息和数据分布信息对语句进一步分析,制定出该语句的分布式执行计划,即该语句需要在哪些节点上执行,并将此分布式执行计划反馈给客户端驱动器,同时协调器也会记录本次事务的引脚信息以及本次分布式执行计划。当事务包含多条语句时,协调器对每条语句都会做此分析过程并记录。

s3:客户端驱动器获得分布式执行计划后,知道了语句需要在哪些节点执行,会并行访问这些数据库节点要求执行事务语句,同时会附带上本次事务的引脚信息。

s4:节点数据库收到客户端驱动器的数据库访问请求后,会把本次请求当作一个本地事务,按照本地事务的处理过程进行数据库操作处理,同时会记录下引脚信息,这样全局事务就变成了在多个数据库节点上独立执行的本地事务,但记录有相同的引脚信息。

s5:任何一个数据库节点上的本地事务,如果执行发生错误被客户端驱动器捕捉并反馈给上层应用程序后,如果客户端执行回滚操作,那么客户端驱动器会向本次全局事务相关的所有执行节点,所有执行语句下达回滚指令,业务终止。

如果客户端通过客户端驱动器收到全局事务相关的每个数据库节点上的本地事务语句都执行成功的反馈,客户端会向协调器发起全局事务提交操作,同时会附带上本次事务的引脚信息。

s6:协调器收到客户端驱动器的全局事务提交请求,根据附带的引脚信息检索全局事务的分布式执行计划等信息,知道本次全局事务有哪些数据库节点参加以及所作的工作。

协调器此时会担当事务管理器的角色,构建一个保持事务管理器和事务相关数据库节点之间一致性的全局唯一事务id:xid,然后按照x/a规范定义的两阶段提交(2pc)或三阶段提交(3pc)标准处理和数据库节点间的提交过程。此过程参照标准x/a规范,不在本专利描述范围。

协调器和数据库节点之间的提交完成后协调器会根据引脚信息返回结果给客户端驱动器,客户端驱动器进一步反馈给客户端应用程序,全局事务过程结束。

除了以上的操作过程,对于其他情况的处理方式,如下所述:

一、当全局事务是由多条sql语句组成的话,客户端也会依次按照s2到s5步骤执行,一次按照上面两段的过程执行,过程中使用和第一条语句相同的引脚信息。

二、如果一个事务是由相同的语句重复执行只是每次执行操作的数据对象不同构成,为了提高效率,会采取批量执行一次提交的模式,这些重复执行的语句都是使用同一个分布式执行计划,在批量操作结束前客户端不会再去请求协调器解析,批量操作变成了客户端驱动器和数据节点间的直接交互过程,极大地提高了效率,降低了对协调器的访问压力。

下面通过实施例对本专利做进一步描述,本发明是将一个分布式数据库系统中的全局事务完整执行过程划分为两个相对独立过程:由客户端发起的语句分析及执行过程和由客户端发起的事务提交过程,然后通过唯一的全局事务引脚将两个过程衔接起来。

如图1所示,本例中,一套分布式数据库系统会包含2个数据库节点,由节点管理器负责统一管理,节点管理器和节点之间有连接关系,如图中虚线所示。对客户端应用程序而言,各节点数据库是透明的,客户端并不关心数据库节点是如何分布的,逻辑上只和节点管理器打交道。

如图2所示,客户端所有的数据库相关操作都是调用客户端驱动程序来实现的,当客户端应用程序执行一条分布式数据库事务语句的时候,客户端驱动器针对该事务创建一个唯一的事务引脚,将引脚信息以及语句发送到协调器,如果一个事务包含多个语句,他们的引脚是一样的。

协调器会对发送过来的语句先进行语句分析,看是否是一个合法的分布式数据库语句,然后根据自己存储的数据库节点信息和数据分布信息确定该语句需要在哪些数据库节点上执行,形成一个语句的分布式执行计划,同时协调器会记录下语句的引脚信息,根据引脚信息判断语句是否来自同一个事务,在本例中,本全局事务需要在两个节点:节点1和节点2上执行。

如果语句无误,协调器将分布式执行计划等信息返回给客户端驱动器。

客户端驱动器收到语句的执行信息知道该语句需要在2个节点上执行,即根据执行计划构造两条执行语句:语句1和语句2并行访问2个节点数据库要求执行,同时传递引脚信息到对应的执行节点,执行节点收到执行语句开始在本数据库实例上构造本地事务开始执行,本例中分别对应2个独立的本地事务tx1和tx2,数据库节点同时记录下引脚信息;两个数据库节点记录的引脚信息是相同的。

两个独立的本地事务会执行关系型数据库的相关业务操作,包括数据写入回滚空间,记录redo日志等操作。

当无论那一条本地事务语句执行失败时,客户端驱动器都将向应用程序反馈错误,在回滚时对2个本地事务都进行回滚;

当客户端通过客户端驱动器获得本次全局事务在2个数据库节点上都正确执行的消息后,客户端将发起提交(commit)动作,这时进入如图3所示的提交过程。

如图3所示,客户端通过客户端驱动器向协调器发起提交请求,客户端驱动器将保存的本次事务的全局引脚也同时传递给协调器。

协调器收到事务提交请求和事务引脚信息,根据唯一的引脚信息查询此前记录下的内容,获得此前本次全局事务在协调器上的分布式执行计划。

根据执行计划,协调器知道本次全局事务需要在节点1和节点2上进行提交,并且知道分别是语句1和语句2的提交。

协调器此时充当了事务管理器的角色,会重新构造唯一的全局事务id:xid,xid专门用来作为事务管理器和数据库节点之间的一致性保证,后面的过程就可以进入x/a规定定义的两阶段提交(2pc)或3阶段提交(3pc)过程,该过程不在本案例范围内。

协调器和数据库节点按照x/a规范完成事务提交后,协调器根据引脚信息将本次全局事务的提交结果反馈给客户端驱动器,客户端驱动器进一步反馈给上层的客户端应用程序,本次全局事务过程处理完毕。

由上可见,通过将分布式数据库的全局事务处理逻辑上分解为客户端发起的两个过程--语句执行过程和提交过程,可以让事务管理器(本例中为协调器)尽量少地参与整个事务过程而让客户端尽量多的和数据库节点直接交互,这两个逻辑过程通过客户端创建的唯一事务引脚衔接起来形成一个完整的业务过程如图4所示,即保证了对x/a规范定义的分布式事务一致性支持,又避免了事务管理器的瓶颈,还提高了分布式数据库的访问效率。

此外,本发明在功能上还具有以下特点:

1、节点信息发生变化的支持

对一个分布式数据库而言,节点数据库的数量以及数据在节点上分布可能是会发生变化的,这些变化必然会给引脚信息、语句执行、事务提交带来影响。本专利支持业务运行时数据库节点信息的动态变化而不影响全局事务的提交,实现方式是当数据库节点信息变化过程中的时候挂起所有事务,当节点信息变化完成后通知客户端回滚所有涉及到节点变更的未提交事务,当客户端重新进行事务请求的时候重新生成新的事务引脚,协调器对语句重新解析和优化返回新的语句执行信息。

2、高可用的支持

本专利中支持对协调器高可用的支持,协调器支持双活或者多活,功能保持一致,互相之间进行数据同步,事务的引脚信息在多个协调器里同时保存,当一台协调器出现故障后客户端驱动器可以切换到另外一台进行访问,应用程序没有感知。

所述通过引脚桥接实现全局事务分布式处理方法具有以下优点:

1)在分布式数据库全局事务的处理过程中,除了第一次需要获得节点数据分布信息外,客户端驱动器对本地事务的访问请求不经过事务管理器(本发明中为协调器)而是直接访问节点数据库,降低了对事务管理器(tx)的访问压力;当全局事务提交的时候事务管理器(tx)再继续参与;

2)因为客户端应用通过驱动器可以直接访问数据库节点,语句交互效率大幅提升;

3)特别地,当一个全局事务涉及到批量操作一次提交的时候也只需要从事务管理器(本发明中为协调器)获得一次节点数据分布信息,在全局事务提交之前,批量操作的每一步都是客户端驱动器和数据库节点之间的直接访问,可以更加显著地降低事务管理器的压力和提升系统效率。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1