具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
本发明实施例涉及的数据库存储有多个数据表,每个数据表可以用于存储元组,元组可以有一个或多个版本。其中,该数据库可以为基于MVCC(Multi-VersionConcurrency Control,多版本并发控制)的任一类型的数据库。在本发明实施例中,对该数据库的类型不作具体限定。需要说明的是,上述数据库中的数据基于状态属性,可以包括三种状态:当前态、过渡态和历史态,该三种状态合称为“数据的全态”,简称全态数据,全态数据中的各个不同状态属性,可以用于标识数据在其生命周期轨迹中所处的状态。
当前态(Current State):元组的最新版本的数据,是处于当前阶段的数据。处于当前阶段的数据的状态,称为当前态。
过渡态(Transitional State):不是元组的最新的版本也不是历史态版本,处于从当前态向历史态转变的过程中,处于过渡态的数据,称为半衰数据。
历史态(Historical state):元组在历史上的一个状态,其值是旧值,不是当前值。处于历史阶段的数据的状态,称为历史态。一个元组的历史态,可以有多个,反映了数据的状态变迁的过程。处于历史态的数据,只能被读取而不能被修改或删除。
需要说明的是,在MVCC机制下,数据的上述三种状态均存在,在非MVCC机制下,数据可以只存在历史态和当前态。在MVCC或封锁并发访问控制机制下,事务提交后的数据的新值处于当前态。以MVCC机制为例,当前活跃事务列表中最小的事务之前的事务生成的数据,其状态处于历史态。在封锁并发访问控制机制下,事务提交后,提交前的数据的值变为历史态的值,即元组的旧值处于历史态。而被读取的版本上尚有活跃事务(非最新相关事务)在使用,而由于最新相关事务修改了元组的值,其最新值已经处于一个当前态,被读取到的值相对当前态已经处于一个历史状态,因此,其数据状态介于当前态和历史态之间,所以称为过渡态。
例如,MVCC机制下,User表的A账户余额从10元充值变为20元,然后消费了15元变为5元,此时金融B机构读取数据做检查事务一直进行中,A之后又充值20元变为25元,则25元为当前态数据,B正在读取到的5元为过渡态,其余的两个值20、10是历史上存在过的状态,都是历史态数据。
图1是本发明实施例提供的一种数据读取方法的实施环境示意图。参见图1,该图1所提供的实施环境可以为分布式数据库系统,该系统中可以包括网关服务器、全局事务标识生成集群以及分布式存储集群,其中,分布式存储集群可以包括多个节点设备,且该分布式存储集群可以采用主备结构。在一些实施例中,该网关服务器可以与分布式存储集群中的任一个节点设备合并在同一个物理机上,也即是,让某个参与读操作的节点设备充当网关服务器。
其中,网关服务器用于接收读写请求,并基于读写请求所对应的读事务或写事务是否为全局事务,来为该读写请求对应的读事务或写事务向全局事务标识生成集群申请唯一的全局事务标识,以保证数据读写在整个分布式数据库系统中的一致性。
全局事务标识生成集群用于生成全局事务标识,即gxid,来标识全局事务,该全局事务可以是指涉及到多个节点设备的事务,例如全局读事务可以涉及到对多个节点设备上存储数据的读取,又例如,全局写事务可以涉及到对多个节点设备上的数据写入。而采用使用集群的形式来实现该全局事务标识的生成,可以防止单点故障。当有全局事务发生的时候,可以通过网关服务器向该全局事务标识生成集群申请一个全局唯一的标识值。
进一步地,该全局事务标识生成集群还可以维护目标全局写事务标识,该目标全局写事务标识是指当前时刻的赋值最大的已提交全局事务的事务标识。全局写事务提交完成是指该全局写事务所涉及的所有节点设备都已经提交完成。当任一个全局写事务提交完成,则可以在其事务提交阶段,通过单向同步写入的方式,实现对全局事务标识生成集群的写入,通过在2PC(Two-Phase Commit,二阶段提交协议)阶段中的提交阶段来进行写入,可以保证写入的原子性。
该全局事务标识生成集群在任一全局写事务提交完成时对已存储的全局写事务标识进行更新,使得该全局事务标识生成集群所存储的目标全局写事务标识一直是最近一次提交的全局写事务的全局事务标识。例如,该全局事务标识生成集群可以采用三元组的形式来维护该目标全局写事务标识,例如,该三元组可以为{gxid,committed,prepared},其中,gxid的值为所有已经提交完成的全局事务中赋值最大的事务标识。当有任一个新的全局事务(例如全局写事务)提交完成,则更新该gxid。
对于任一个节点设备来说,由于并不是每个节点设备上都不断有全局写事务执行,上一个提交的事务有可能是局部写事务,因此,节点设备可以保留在该节点设备上执行过并已经提交过且事务完成的赋值最大的全局写事务标识,作为本节点设备向网关服务器提供的赋值最大的已提交全局写事务标识。
对于上述全局事务标识集群来说,丢失目标全局写事务标识的可能性极小,该全局事务标识集群可以采用三副本来避免单点故障。而如果需要提高可靠性,可以考虑在全局事务标识集群中部署五副本、甚至更多副本。
而对于任一个跨节点的读事务来说,由于该事务自身的事务标识对读一致性没有影响,因此,可以无需考虑全局读事务标识。
在一些实施例中,该全局事务标识生成集群可以是物理独立的,也可以和分布式存储集群(例如ZooKeeper)合并到一起,对各个网关服务器提供全局的全局事务标识生成服务。上述图1仅是提供了一种轻量级的分布式事务处理的架构图,是一种类分布式数据库系统。
图2是本发明实施例提供的一种数据读取方法的流程图。参见图2,该方法包括:
201、当读事务涉及到跨节点操作时,网关服务器将该读事务确定为全局读事务,网关服务器向全局事务标识生成集群发送生成请求。
当网关服务器接收到任一个操作语句(例如SQL语句)时,网关服务器作为数据库的高级计算层可以对该操作语句进行解析,当该读事务的操作语句携带指定关键字时,该网关服务器确定该读事务涉及到跨节点操作。例如,该指定关键字可以为“GLOBAL”,用于指示该操作语句的读取对象包括数据库系统中的所有数据,也即是覆盖数据库系统中的所有节点设备,则当该操作语句中包括“GLOBAL”,则执行步骤201。
当然,在一些实施例中,还可以根据该读事务的操作语句,确定所要读取数据是否在一个节点设备上,如果确定不在同一个节点设备上,则确定该读事务涉及到跨节点操作。具体地,根据该读事务的操作语句所要读取数据的范围以及该范围内的元数据,确定所要读取的数据是否存储于两个以上的节点设备,当确定存储于该两个以上的节点设备时,该读事务涉及到跨节点操作。由于元数据中会记载有数据目前的存储设备。例如,网关服务器可以根据元数据,为每个事务的每条操作语句(SQL(Structured Query Language,结构化查询语言))确定所访问的节点设备,网关服务器记录所确定的节点设备,当统计到被访问的不同节点设备数大于等于2时,即执行该步骤201。在上述实施例中,这种基于元数据的确定方式可以适用于单语句的SELECT语句。
上述确定是否涉及跨节点操作的过程可以总结为基于指定关键字的识别以及由网关服务器的自动识别,如果有跨节点操作(全局事务标识),则是全局事务。而如果操作语句(例如SQL语句)只涉及单个节点设备,则属于局部事务,又称为本地事务,则无需申请全局事务标识,仅为该事务分配局部事务标识即可。
以指定关键字为“GLOBAL”为例,该操作语句可以采用以下形式:
BEGIN GLOBAL;//GLOBAL表明开始一个全局事务,向“全局gxid生成集群”申请一个全局唯一的全局事务标识值gxid
SELECT…
…
END;
202、全局事务标识生成集群接收到该生成请求后,为该全局读事务生成全局事务标识,将全局事务标识发送给该网关服务器。
在本发明实施例中,该全局事务标识生成集群所生成的全局事务标识的赋值随时间单调递增,其本质上是个时间戳,全局事务标识的赋值大小可以表示该全局写事务的发生时间,全局事务标识的赋值越大,其全局写事务的发生时间在已提交的全局写事务中的时序越靠后。例如,该全局事务标识可以是数值类型或者时间类型或者字符类型等能够代表时间戳的任一种形式。
203、该网关服务器将该全局事务标识作为该全局读事务的事务标识。
对于数据库系统来说,如果支持MVCC技术,可以在元组上原先有xid域的情况下,增加一个gxid,用于代表全局事务标识,xid被改名为lxid,用于代表局部事务标识,上述格式上的区别可以参见图3和图4。其中,局部事务的事务标识和全局事务的全局事务标识的赋值可以都是单调递增的。
举例来说,假设事务T需要写两个节点设备,做转账操作,则其操作语句可以采用如下形式:
BEGIN GLOBAL;//申请一个全局的gxid,假设为20
UPDATE user_account SET my_wallet=my_wallet–10WHERE key=100;//节点1,本地lxid为18
UPDATE user_account SET my_wallet=my_wallet+10WHERE key=900;//节点2,本地lxid为22
COMMIT;
节点设备1上的key为100的元组,其元组上的事务标识为一个二元组:{gxid,lxid}={20,18}。
节点设备2上的key为900的元组,其元组上的事务标识为一个二元组:{gxid,lxid}={20,22}。
通过上述事务标识,就可以识别来自不同节点设备的数据是否是同一个全局事务操作的数据,即是否属于同一个事务。而如果节点设备1下一个事务是全局事务,则事务标识为{gxid,lxid}={21,19};再下一个事务是局部事务,则事务标识为{gxid,lxid}={0,20};再下一个事务是全局事务,则事务标识为{gxid,lxid}={22,21},依次类推。
204、当获取到全局读事务的事务标识后,网关服务器向全局事务标识生成集群发送获取请求,该获取请求用于获取目标全局写事务标识,该目标全局写事务标识为赋值最大的已提交全局写事务标识。
其中,所述数据库系统中赋值最大的已提交全局写事务标识用于指示:在所述全局读事务发生之前的历史时刻所发生的、处于已提交状态的全局写事务中,全局事务标识赋值最大的全局写事务。
在本发明实施例中,是以网关服务器先获取了全局事务标识,再通过交互流程来获取目标全局写事务标识为例进行说明的,在一些实施方式中,在网关服务器向全局事务标识生成集群发送生成请求的同时,该生成请求也可以具有获取请求的功能,也即是,可以通过该生成请求进行该目标全局写事务标识的请求,也即是,步骤201中的生成请求还用于获取目标全局写事务标识,而全局事务标识生成集群在接收到该生成请求后,可以在返回全局写事务标识时,一同返回该目标全局写事务标识,以减少数据库系统中的信令交互。
205、该全局事务标识生成集群接收到该获取请求后,向该网关服务器发送该目标全局写事务标识。
在本发明实施例中,全局事务标识生成集群接收到该获取请求后,可以从预设存储空间中获取目标全局写事务标识,以返回给网关服务器。在一些实施例中,如果全局事务标识生成集群维护了多个已提交全局写事务的事务标识,则可以获取与当前时刻的全局写事务的全局写事务标识的赋值之间的差值最小的全局写事务标识作为目标全局写事务标识。
206、网关服务器接收到该目标全局写事务标识后,向该全局读事务对应的多个节点设备发送读指令,该读指令携带该目标全局写事务标识。
该读指令用于执行该全局读事务。对于网关服务器来说,当识别到全局读事务,则可以对全局读事务进行分解,然后向所涉及的多个节点设备发送读指令(例如SQL语句),并携带该目标全局写事务标识,该目标全局写事务标识即可以看作是各个节点设备上的快照一致性点。
上述步骤204至206为本发明实施例提供的网关服务器当获取到全局读事务时,获取目标全局写事务标识的过程,通过由全局事务标识生成集群进行目标全局写事务标识的维护,能够提高目标全局写事务标识的可靠性。
207、该多个节点设备中的各个节点设备接收到该读指令后,根据该目标全局写事务标识,对至少一个目标元组进行可见性判断。
对于各个节点设备来说,该目标全局写事务标识可以看作是各个节点设备上的快照一致性点,也意味着这个快照一致性点之前每个节点设备上发生过对应的事务,则此事务一定满足一致性,因此,可以对至少一个目标元组进行可见性判断,以获知至少一个目标元组中有哪些元组对于该目标全局写事务可见。其中,该可见性判断可以按照MVCC算法实现,元组可见的条件为提交该元组的事务的事务标识小于或等于目标全局写事务标识。
对于读指令来说,其读指令可以是对某个数据表的某部分数据的读取指令,也可以是对多个数据表的数据的读取指令,而由于数据表中的数据均以元组形式存在,因此,可以先确定读指令所对应的至少一个目标元组,例如,读指令中如果携带表名,则该至少一个目标元组可以为表名对应的数据表中的所有元组,而如果该读指令除了表名以外还携带了筛选条件,则该至少一个目标元组还可以是表名对应的数据表中符合该筛选条件的元组。
208、当该至少一个目标元组包括第一元组时,该多个节点设备中的各个节点设备获取该第一元组,该第一元组包括对于目标全局写事务可见的元组。
对于任一个目标元组,其具体的可见性判断过程可以为:获取提交该目标元组的事务标识;当该事务标识小于该目标全局写事务标识时,将该元组确定为该第一元组。可选地,当该事务标识大于或等于该目标全局写事务标识时,将该目标元组确定第二元组,该第二元组为对于目标全局写事务不可见的元组。其中,获取提交该目标元组的事务标识可以包括:读取任一个元组的生命周期信息中的提交事务标识,得到提交该元组的事务标识。
209、该多个节点设备中的各个节点设备向网关服务器发送获取到的第一元组。
步骤208和步骤209是各个节点设备输出第一元组的过程,需要说明的是,本发明实施例中将任一个对于目标全局写事务可见的元组均称为第一元组,而不限定该第一元组具体在哪个节点设备上。
210、该网关服务器输出接收到的第一元组。
对于网关设备来说,由于各个节点设备所输出的均为对于该目标全局写务标识可见的元组,也即是,在该全局读事务发生时均已经提交的事务所生成的元组,因此,这些元组必然是满足全局读一致的。
在一种可能实现方式中,网关服务器可以在接收到任一个节点设备所返回的数据后,即输出已获取到的第一元组,在另一种可能实现方式中,网关服务器还可以在接收到所有节点设备所返回的数据后,再输出已获取到的第一元组,本发明实施例对此不做限定。
当然,如果有任一个节点设备超时未响应,则网关服务器也可以具有相应处理方式,例如,网关服务器在接收任一个节点设备的目标数据后即进行输出的情况下,网关服务器可以将已输出的数据标记为无效数据,又例如,网关服务器在接收所有节点设备的目标数据后才进行输出的情况下,网关服务器可以进行事务回滚。
本发明实施例提供的方法,通过找到当前全局读事务发生之前的赋值最大的已提交全局写事务标识,也即是找到了历史时刻上多个节点设备之间的、基于MVCC的、共同的具有事务一致性的点,相当于将所读取的时刻提前到一个历史时刻上,可以看作是一种提前读的过程,而在数据读取过程中,由于仅读取该已提交的全局写事务可见的数据,也就排除了可能导致事务不一致的全局写事务,使得所读取的数据具有事务一致性,实现了数据库系统对外的数据一致性,也能够实现数据读取的正确性。
需要说明的是,在上述网关服务器的任一次消息发送过程中,网关服务器可以设置超时机制,以避免影响数据库系统的正常运行。例如,如果该多个节点设备中有任一个节点设备超时未返回数据,则说明该节点设备可能出现网络问题或是宕机,则该网关服务器可以重新向该节点设备或该多个节点设备发送该读指令,以保证各个节点设备能够返回数据。当然,为了节约信令,避免资源浪费,可以为重发操作设置发送阈值,例如将重试发送操作设置为3次,当达到该发送阈值,仍然有节点设备未返回数据,则回滚该全局读事务。其中,回滚全局读事务是指将数据库系统恢复到全局读事务开始的状态,例如,数据库系统将基于该全局读事务的所有已读取到或者已输出的数据全部置为无效。
当然,在上述网关服务器的任一次消息发送过程中,均可以设置超时机制,以避免影响数据库系统的正常运行。在一些实施例中,对于只涉及只读事务的全局读事务来说,如果任一次信息发送过程发生超时,也可以不进行回滚,例如,对于只读事务,网关服务器可以从新开始获取一个GTID(Global Transaction ID,全局事务标识符)值,然后分发给各个节点设备,各个节点设备重新进行只读操作。这个机制避免了只读事务的回滚操作,能提高系统的事务吞吐量,尤其是对HTAP系统中读频繁的应用场景更有效。
对于支持MVCC技术的数据库,都需要清理脏数据,即过期的多版本数据。过期的含义是指:当前活跃事务列表中最小的活跃事务之前生成的非最新的多个版本,一定是脏数据,需要被清理。如PostgreSQL、MySQL/InnoDB的多版本的脏数据,分别使用VACUUM和PURGE操作执行清理。而为了实现上述数据读取的事务一致性,本发明实施例需要重新定义脏数据:该脏数据为节点设备上当前最小活跃事务之前的第二大历史事务之前的事务生成的数据。
其中,最小活跃事务是指活跃事务中事务标识赋值最小的事务,而一个事务在另一个事务之前是指一个事务的事务标识的赋值小于另一个事务的事务标识的赋值,历史事务是指已经提交完成的非活跃事务。
在确定脏数据时,可以根据提交任一个元组的事务标识来确定待清理的脏数据,例如,根据当前活跃事务确定最小活跃事务,再基于最小活跃事务,确定最小活跃事务之前的第二大历史事务,将第二大历史事务之前的事务生成的数据确定为待清理的脏数据。
而对于节点设备来说,为了实现上述数据读取方法,还需要对节点设备上对脏数据进行清理。以图5的示意图为例,在图5中,事务标识从左至右是赋值从小到大有序排列,也即是,当前标识赋值最大的全局或局部事务为局部事务(0,lxid3),因此,在清理脏数据时,与现有的MVCC技术的脏数据清理相比,该局部事务对应的元组不会被作为脏数据清理,且全局事务(gxid1,xid1)为非活跃事务中赋值最大的全局写事务标识,因此,在清理脏数据时,与现有的MVCC技术的脏数据清理相比,该全局事务对应的元组不会被作为脏数据清理。
而由于本发明实施例所应用的数据库系统,会对历史态数据进行转储,因此,任何数据、包括历史上曾经存在的数据,均可以被读取,也即是,针对目标全局写事务来说,在各个节点设备上均可以找到相应的、符合事务一致性的数据。
本发明实施例提供的方法还可以支持多个全局读事务并发执行。例如,当多个全局读事务之间的时间间隔小于预设时间间隔(如1秒内,可作为参数设置),且所读取的节点设备相同或是包含关系(例如前一个全局读事务所读取的节点范围包含后一个全局读事务的读取节点设备范围),则允许后一个全局读事务复用前一个目标全局写事务标识,以进一步提高整体性能。
进一步地,本发明实施例所涉及的系统架构提供了一种为分布式数据库系统提供的一个轻量的、去中心化的事务处理架构,其中,轻量特性体现在于使用了全局事务标识生成集群,该集群功能单一,可在内存中批量生成全局事务标识,效率极高。相对于一个实现了全局事务管理、冲突访问控制、MVCC机制的全局事务管理器而言,性能优势特别明显。去中心化体现在于该系统内的事务的处理所依赖的是各个节点设备,而不是全局事务管理器,因此,架构中不存在单点的、复杂而耗时的全局事务管理器,从而实现了在功能完备基础上的去中心化。
进一步地,本发明实施例还能够保证分布式数据库系统实现外部一致性的特性,也即是,发生在分布式数据库中的事件,获取数据需要按事件发生的次序,且在数据库中被查阅数据时,依旧能体现出原来的事件次序。而由于全局事务标识生成集群为类TDSQL系统提供了全局唯一的、单调递增的一个逻辑时间标识,可以有效保证外部一致性。即全局读事务之后的新事务,即使事务先于全局读事务提交,但其数据依旧对于全局读事务不可见。再者,该全局事务标识生成集群在逻辑上是一个单点,物理上只有主副本提供服务,但从副本在主副本失效后能通过类似Paxos、Raft协议完成选新主,所以全局事务标识生成集群成为单点瓶颈的机会降低。
本发明实施例适用于分布式数据库(SQL、NoSQL、NewSQL,关系型、非关系型)、基于MVCC的关系型数据库、基于MVCC的非关系型数据库、分布式大数据处理等系统等任一种支持跨节点的全局写操作的事务性数据库系统。进一步地,本发明实施例特别适合于构建分布式的HTAP数据库,尤其是海量时态分布式HTAP(Hybird Transactional/AnalyticalProcessing,事务处理/在线分析处理)数据库。由于本发明实施例为分布式事务、分析型数据库的架构在事务处理机制层面减负,使得事务处理机制简单高效。而采用MVCC的单机数据库系统作为每个节点的基线,配合去中心化的、轻量的事务处理机制,使得并发的查询受到的限制更少,且查询操作是各节点之间自治的,因而非常适合于分析系统使用。综上所述,本发明实施例为分布式混合型(事务、分析型)数据库的高性能提供了可能,在分布式数据库的架构层面,整个系统的性能提升的技术优势明显。
对于单机实现MVCC技术的数据库系统,其不同的实现方式对本发明实施例会有一定影响。例如,数据的并发访问控制技术实现了可串行化的场景下,对于依赖于TO(时间戳)+MVCC的数据库来说,例如PostgreSQL,使用SSI(spring struts ibatis)技术保证了可串行化,由于SSI技术本质上也是MVCC技术,因此不管在哪个隔离级别下,本发明实施例提供的数据读取方法可以适用。当然,跨节点的事务在每个节点设备上设置的隔离级别需要保持一致。而对于依赖基于封锁的技术的数据库来说,例如MySQL/InnoDB,使用MVCC实现了RR(Repeatable Read,可重复读隔离级别)和RC(Read_Committed,读已提交隔离级别),本发明实施例提供的数据读取方法可以适用。当然,跨节点的事务在每个节点上设置的隔离级别也需要保持一致。而对于采用SI隔离方式的数据库,本发明实施例同样适用。
需要说明的是,上述数据读取方法可以应用于备份技术中,当执行全局备份时,需要读取的对象是集群内的所有节点设备,此种情况下,该数据读取方式可能会暂停所有正在执行的写事务进行提交,(时间相对于全局事务管理器理论上更短)。但不影响新事务的启动、运行,不影响正在执行的所有子事务处于正在执行状态阶段的分布式写事务。而对于非全局的备份,由于涉及的节点数有限,对数据库系统的影响较小;采用本发明实施例提供的方法,从架构上消除了全局事务的单点瓶颈,根本上可以较大幅度提高系统整体的事务吞吐量,而由于暂停部分全局写事务的提交操作带来的性能损耗实际上非常小,不会影响整体性能,不会造成读写操作的互相阻塞。
在一些实施例中,节点设备之间可以保持心跳,一旦有任一个被读取的节点设备发生宕机等情况,而无法应答读取,则可以上报给网关服务器,由网关服务器负责事务回滚释放禁止写继续执行等禁令,处理写事务失败等事件)。而如果一些节点设备已经完成了事务,则可以通知用户返回的数据无效,当然,对于集中式返回结果的机制,则在任一节点设备发生情况时,不会向用户输出结果,也就无需进行上述对用户的通知。
在一些实施例中,每个节点集群均可能存在不同的主备架构,而在执行全局读事务时,可以基于不同的主备架构进行,该全局读事务的优先读取对象为存储有主副本的节点设备。而基于不同的主备架构,本发明实施例提供的方法的应用可以有不同的适用:
第一种方式是依靠主从逻辑复制技术,来实现高可靠性,如MySQL的主从复制是使用binglog的逻辑复制。对于第一种方式,因为写事务首先发生在主副本的节点设备上,从副本的目的只是做备份和只读服务,因此,采用本发明实施例提供的读取方法在主机(也即是用于存储主副本的节点设备)进行读操作,能够确保全局读的事务一致性。以MySQL的主从复制技术为例,由于其主从复制机制,有可能会导致在备机也即是用于存储从副本的节点设备)上,用户的SQL语句被重新执行,而由于事务标识是每个数据库引擎自动分配的,可能会造成主副本和从副本上元组上的事务标识不同,为此,主机和备机之间可以进行一定的信令交互,例如,图6提供了一种数据库系统中作为主机和备机的节点设备之间的信令交互图,参见图6所示,上述方法还可以包括:当主备结构的数据库中采用主从逻辑复制技术时,在备机接收到主机传递的全局事务的操作指令时,根据所述全局事务的全局事务标识对所述备机上执行事务的事务标识进行赋值。其中,该全局事务即可以为全局读事务也可以为全局写事务,本发明实施例对此不做限定。例如,在主机生成binglog的时候,对于每个事务,可以向备机传递全局事务的{gxid,lxid},备机收到{gxid,lxid}并执行binglog中的SQL语句时,为每个事务的gxid和lxid用收到的{gxid,lxid}赋值。如下表1,提供了MySQLBinlog格式改进的对比表。
表1
以上方式,解决了逻辑复制架构下的全局读一致性问题,而且还能够解决对于任一种跨节点事务(例如主主、主备、备备组合)情况下的全局读数据一致性问题。例如,全局读事务读取的数据,全部源自备机系统,这样不影响生成分布式数据库系统中的主机,整体性能高。
第二种方式是主从物理复制技术,来实现高可靠性,如使用REDO日志(Log)的物理复制,例如,PostgreSQL的流复制技术就是依靠REDO Log的物理复制技术。对于该第二种方式,也即是物理复制的方式,因为元组是物理级别的复制,所以不会丢失元组的事务标识,但是,不同的数据库其多版本的数据的组织方式不同,导致其恢复的过程可能不同。典型的方式有如下两种:
类PostgreSQL方式:此类方式的特点,是多版本数据存储在页面(PAGE)内,使用REDO方式恢复的时候,已经被恢复到备机,所以读取“脏”的历史数据可以被成功读取,不会影响本发明实施例的数据读取方法的应用。
类MySQL/InnoDB方式:此类方式的特点,是多版本数据存储在内存的回滚段内。基于RODO日志做恢复,缺少回滚段的信息被同时在备机恢复,为此,可以把回滚段的信息也同步到备机(如回滚段信息记入REDO Log,恢复时根据记录的回滚段信息进行内存复原),而在实施本发明实施例提供的读取方法时,读取所述备机中存储的当前态数据和所述备机的回滚段信息中的过渡态数据,也就避免了对本发明实施例的数据读取方法的应用造成影响。
第三种方式是依靠分布式一致性协议,实现逻辑或物理的多副本的数据一致性,来实现高可靠性,如以Paxos、Raft等分布式一致性协议构建的高可靠系统。对于第三种方式,可以区分逻辑的方式和物理的方式,具体可以参见上述第一种方式和第二种方式的处理。
图7是本发明实施例提供的一种数据读取装置的结构示意图,参见图7,该装置包括:
标识获取模块701,用于当获取到全局读事务时,获取目标全局写事务标识,所述目标全局写事务标识为数据库系统中赋值最大的已提交全局写事务标识;
发送模块702,用于向所述全局读事务对应的多个节点设备发送读指令,所述读指令携带所述目标全局写事务标识;
接收模块703,用于接收所述多个节点设备返回的第一元组,所述第一元组包括对于目标全局写事务可见的元组。
在一种可能实现方式中,所述发送模块还用于当获取到全局读事务时,向全局事务标识生成集群发送获取请求,所述获取请求用于获取所述目标全局写事务标识;
所述接收模块还用于接收所述全局事务标识生成集群返回的所述目标全局写事务标识,所述目标全局写事务标识为赋值最大的已提交全局写事务标识。
在一种可能实现方式中,所述目标全局写事务标识由所述全局事务标识生成集群在任一全局写事务提交完成时更新。
在一种可能实现方式中,所述装置还包括:
全局事务识别模块,用于当任一读事务涉及到跨节点操作时,将所述读事务确定为全局读事务,向全局事务标识生成集群发送生成请求;接收所述全局事务标识生成集群所返回的全局事务标识,将该全局事务标识作为该全局读事务的事务标识。
在一种可能实现方式中,所述装置还用于:
当主备结构的数据库中采用主从逻辑复制技术时,在备机接收到主机传递的全局事务的操作指令时,根据所述全局事务的全局事务标识对所述备机上执行事务的事务标识进行赋值;
当主备结构的数据库中采用主从物理复制技术时,在基于所述全局读事务进行读取的过程中,读取所述备机中存储的当前态数据和所述备机的回滚段信息中的过渡态数据。
在一种可能实现方式中,所述装置还包括:
回滚模块,用于当在目标时长内未接收到所述多个节点设备的至少一个节点设备的应答时,回滚所述全局读事务。
在一种可能实现方式中,所述数据读取装置应用于所述数据库系统中的任一个节点设备上。
上述所有可选技术方案,可以采用任意结合形成本公开的可选实施例,在此不再一一赘述。
需要说明的是:上述实施例提供的数据读取装置在数据读取时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的数据读取装置与数据读取方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
图8是本发明实施例提供的一种数据读取装置的结构示意图,参见图8,该装置包括:
接收模块801,用于接收用于执行全局读事务的读指令,所述读指令携带目标全局写事务标识,所述目标全局写事务标识为数据库系统中赋值最大的已提交全局写事务标识;
可见性判断模块802,用于根据所述目标全局写事务标识,对至少一个目标元组进行可见性判断;
输出模块803,用于当所述至少一个目标元组包括第一元组时,输出所述第一元组,所述第一元组包括对于目标全局写事务可见的元组。
在一种可能实现方式中,该可见性判断模块用于获取提交所述目标元组中任一个元组的事务标识;当所述事务标识的赋值小于所述目标全局写事务标识的赋值时,将所述元组确定为所述第一元组;当所述事务标识的赋值大于或等于所述目标全局写事务标识的赋值时,将所述元组确定第二元组,所述第二元组为对于目标全局写事务不可见的元组。
在一种可能实现方式中,所述装置还包括:
清理模块,用于对脏数据进行清理,该脏数据为节点设备上当前最小活跃事务之前的第二大历史事务之前的事务生成的数据。
需要说明的是:上述实施例提供的数据读取装置在数据读取时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的数据读取装置与数据读取方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
图9是本发明实施例提供的一种电子设备的结构示意图,该电子设备900可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(central processingunits,CPU)901和一个或一个以上的存储器902,其中,所述存储器902中存储有至少一条指令,所述至少一条指令由所述处理器901加载并执行以实现上述各个方法实施例提供的数据读取方法。当然,该电子设备还可以具有有线或无线网络接口、键盘以及输入输出接口等部件,以便进行输入输出,该电子设备还可以包括其他用于实现设备功能的部件,在此不做赘述。上述数据读取过程中所涉及到的网关服务器以及节点设备均可以采用该电子设备的硬件结构。
本发明实施例还提供了一种计算机可读存储介质,该计算机可读存储介质应用于服务器,该计算机可读存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,该指令、该程序、该代码集或该指令集由处理器加载并执行以实现上述实施例的数据读取方法中网关服务器或节点设备所执行的操作。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。