基于自转式事务负载和确定性分析查询的HTAP数据库查询一致性验证方法、系统及应用

文档序号:37846145发布日期:2024-05-07 19:20阅读:16来源:国知局
基于自转式事务负载和确定性分析查询的HTAP数据库查询一致性验证方法、系统及应用

本发明属于数据库查询验证,涉及一种基于自转式事务负载和确定性分析查询的htap数据库查询一致性验证方法、系统及应用。


背景技术:

1、40多年来,事务处理和分析查询是数据库系统提供的两大关键性服务。随着应用对实时数据分析查询的需求增强,例如,欺诈侦测[3,4]、商业智能[5]和医疗健康[6]等应用,htap数据库系统(混合负载处理系统)应运而生,即同时支持事务负载和分析查询处理的数据库系统。在htap数据库系统中,为了使得分析查询具有实时性,分析查询被赋予了acid属性,从而打破了事务负载处理和分析查询处理之间的壁垒。然而,混合了事务处理和分析查询处理之后,htap数据库系统内部组件之间的依赖关系更加复杂,这种复杂性更容易隐藏微妙的代码缺陷。举例来说,tidb[2]为了在可能存在各种故障的条件下实现同时处理事务负载和实时查询分析,在两类完全不同的存储引擎上实现了两阶段提交、一致性共识协议和大规模并行处理等一系列机制,任务处理将涉及到由多台远程机器构成的复杂组合体,因此容易导致一些隐晦的代码缺陷。另外,htap数据库系统负责将oltp工作负载产生的新鲜数据传输给olap工作负载用于实时数据分析,尽可能早地发现新鲜数据中存在的价值。如果htap数据库系统的实时分析查询执行结果存在代码缺陷,这可能会给应用提供错误的分析结果,在生产上造成严重的后果。因此,针对htap数据库系统的实时分析查询执行结果进行正确性验证是一个非常重要的任务。

2、现有许多相关工作致力于生成分析查询测试数据库查询执行的正确性。然而,这些方法不适合用来测试htap数据库在处理实时分析查询的正确性。原因在于这些工作只能生成小数量、静态的数据库,相比之下,在真实的htap工作负载中,数据库往往是大数据量,并且数据状态是随着oltp工作负载的执行而动态变化的。例如,sqlsmith[1]通过随机拼凑sql表达式生成大量的分析查询以检查数据库系统是否会崩溃,sqlsmith不会生成修改数据库状态的更新操作,这意味着在sqlsmith的测试环境中数据库是静态不变的。sqlancer[2]约束一个查询必须访问一行目标数据作为查询正确性验证的前提条件,然而,与sqlsmith相似,sqlancer也不会生成修改数据库状态的更新操作,并且所有操作都是单线程串行执行的,因此,sqlancer也不适合于用来测试htap数据库系统的隔离级别。cobra[8]提出使用smt解算器和硬件加速来验证键值存储的可串行性。为了提高验证效率,它将栅栏事务注入到应用程序工作负载中,这限制了使用场景,并增加巨大的验证成本。elle[9]专门设计一些短的负载来推断历史版本顺序,从而验证事务处理的正确性。然而,它也无法支持对任意应用负载的验证。isodiff[10]通过只搜索代表性子集来降低检测循环的成本,从而帮助开发人员调试弱隔离级别引起的异常,但它会存在误报的情况。

3、验证htap数据库处理实时分析查询的执行正确性存在诸多难点问题,本发明总结了存在的三个关键挑战。第一,为了追求极致的性能和良好的交互性,主流数据库系统的事务处理具有不确定性调度的特点。具体来说,即使在给定相同的输入负载条件下,最终的数据库状态也可能是不同的;进一步地,由于分析查询的执行结果是依赖于查询发起时的数据库状态,那么分析查询的查询结果也具有不确定性,这导致传统的对比测试方法不再适用于验证数据库系统事务处理功能的正确性。因此,第一个关键挑战是:如何在数据库状态不确定性迁移的条件下验证一个分析查询的执行正确性;第二,由于分析决策业务场景的特殊需求,实时分析查询往往需要访问海量的数据,例如,一个分析查询可能需要访问大量历史订单数据服务于企业决策。因此,第二个关键挑战是:如何在访问海量数据的条件下以一种高效的方式验证一个分析查询的正确性;第三,分析查询往往具有多样复杂的语义,包括各种逻辑运算(与、或、非等)和各种算子(连接、聚合、排序等)。因此,第三个关键挑战是:如何找到一种通用的方法对具有不同语义的分析查询进行执行结果正确性验证。


技术实现思路

1、本发明中,通过设计一个面向htap数据库系统的隔离级别测试工具,提供一种用于htap工作负载中查询执行结果一致性验证的方法。本发明的目的可概括为:对htap数据库的分析查询结果进行一致性校验,从而尽早地发现htap数据库中可能存在的问题。关键问题主要有:在事务型负载和分析型负载交错执行的条件下,如何对于htap数据库的分析查询结果进行一致性校验。

2、本发明提出一种基于自转式事务负载和确定性分析查询的htap数据库查询一致性验证方法,流程图如图1所示,所述方法包括如下步骤:

3、步骤一、识别分析验证htap数据库处理实时分析查询执行一致性存在的问题,包括数据状态不确定性迁移、海量的数据和多样的查询语义。

4、步骤二、为了解决数据库状态不确定性迁移给验证任务带来的挑战,通过自转式事务负载,使得数据库状态可以定期恢复到初始状态。

5、步骤三、采用函数式数据生成方法生成数据集,通过定义确定性分析查询,模拟数据库系统内部查询执行逻辑,以处理和统一化不同的查询语义;具体地,为了解决海量数据给验证任务带来的挑战,提出函数式数据生成方法,一种利用现代高速cpu计算数据库初始数据的数据生成方法,从而快速地生成海量数据;另一方面,为了解决多样查询语义带来的挑战,提出确定性分析查询,确定性分析查询基于函数式数据生成方法,并通过模拟数据库系统内部查询的执行逻辑应对各种不同语义的查询算子,从而计算得到一个分析查询理想的查询结果,如果数据库系统实际的查询结果与理想的查询结果不一致,那么该数据库系统的查询执行引擎存在代码缺陷。

6、步骤四、通过结合自转式事务负载和确定性分析查询,在每次数据库状态恢复到初始状态时发起确定性分析查询,对每次查询的实际结果与预期的理想结果或多个相同语义之间的查询结果进行比较,完成查询一致性验证。步骤四中可以构造oltp和olap工作负载并行执行的htap工作负载,并且其中的olap工作负载是查询执行结果可验证的确定性分析查询。

7、步骤一中,所述问题包括三个方面。第一,给定相同的输入负载条件,数据库状态和分析查询结果具有不确定性:为了追求极致的性能和良好的交互性,主流数据库系统的事务处理具有不确定性调度的特点。具体来说,即使在给定相同的输入负载条件下,最终的数据库状态也可能是不同的;进一步地,由于分析查询的执行结果是依赖于查询发起时的数据库状态,那么分析查询的查询结果也具有不确定性,这导致传统的对比测试方法不再适用于验证数据库系统事务处理功能的正确性。因此,数据库状态变迁的不确定性和验证一个分析查询结果的一致性是一组矛盾。第二,无法快速验证分析查询读取的每一个数据的一致性:由于分析决策业务场景的特殊需求,实时分析查询往往需要访问海量的数据,这使得快速地验证一个分析查询所读取的每一个数据的一致性变得非常困难。例如,一个分析查询可能需要访问大量历史订单数据服务于企业决策。第三,不同逻辑运算和/或不同算子组合生成不同语义:分析查询往往具有多样复杂的语义,包括各种逻辑运算(与、或、非等)和/或各种算子(连接、聚合、排序等),这使得以一种通用的方法验证不同语义的分析查询变得非常困难。

8、步骤二中,所述自转式事务负载的实现机制包括:首先收集原始的oltp工作负载中事务的写集合,再根据数据库的初始状态生成若干个恢复写集合的倒放事务,最后将这些倒放事务插入到原始的oltp工作负载中,从而将数据库状态恢复到初始状态。

9、步骤二中,所述自转式事务负载的获得包括如下子步骤:

10、步骤2.1、将原始的事务型负载w切分为若干个时间上互不相交的子负载,然后将每一个子负载wi加入到自转式事务负载wr中。

11、步骤2.2、收集每个子负载中非倒放事务产生的写集合及其初始记录值集合φ。具体来说,令集合φ用于保存记录的初始值,逐一检查子负载wi中每一个已提交的事务t,并判断事务t是否是上一轮子负载wi-1产生的倒放事务;如果事务t是倒放事务,由于倒放事务是用于恢复上一轮子负载wi-1修改的数据库状态,其写集合无需加入记录初始值集合φ中;否则,如果事务t不是倒放事务,那么需要收集该事务中每一个写操作w,对于写操作w的写集合ws中的每一条记录γ,从初始数据库中获取记录γ的初始值,保存于记录初始值集合φ中。

12、步骤1.3、将记录初始值集合φ切分为若干个子集合,即φ0,φ1,…φi。

13、步骤1.4、将基于记录初始值子集合φi生成倒放事务ξ(φi)加入到下一个子负载wi+1中。

14、步骤三中,所述函数式数据生成方法为:对于记录γ,其主键为γ.k,非键值属性为γ.v,函数式数据生成定义为γ.v=f(γ.k),f是给定的一元函数,函数式数据生成可以通过主键属性γ.k确定性计算得到非主键属性γ.v。

15、所述确定性分析查询,相比于直接访问数据库,函数式数据生成将缺少非主键属性的记录通过计算的方式补充为完整的记录,进而通过模拟数据库系统内部查询执行逻辑的方式去计算一个算子理想的查询结果。具体来说,首先递归计算查询q根节点下游所有子查询的中间结果,即如果某个子查询是叶子节点,那么通过函数式数据生成获取完整的记录;结合查询q根节点算子的语义和子查询的中间结果,计算查询q的最终结果τq,其中,根节点算子可以是过滤算子、聚合算子、排序算子和连接算子。对于过滤算子,找到中间结果τ中满足过滤条件θ的所有记录作为理想的查询结果τ*;对于聚合算子,对中间结果τ施加相应的聚合算法θ,从而得到聚合之后理想的查询结果τ*;类似于聚合算子,排序算子将中间结果τ进行排序得到理想的查询结果τ*;对于连接算子,对若干个中间结果做笛卡尔积运算,再通过连接算子中的过滤条件θ获得满足连接条件的理想查询结果τ*。

16、步骤四中,所述自转式事务负载和确定性分析查询的结合方法,在自转式事务负载将数据库状态恢复到初始状态时,建立查询快照并发起确定性分析查询,使得确定性分析查询始终读取初始状态的数据库,这样一来,可以通过确定性计算的方式获取理想查询结果判断查询结果的一致性,和/或,在初始状态下发起一组具有相同语义的确定性分析查询,它们之间的查询结果应该保持一致。值得注意的是,由于确定性分析查询不改变数据库状态,所以确定性分析查询不会影响到自转式事务负载满足数据库状态的不变性。因此,在自转式事务负载将数据库状态恢复到初始状态时,发起确定性分析查询,可以同时满足数据库状态的不变性和查询结果的可计算性,从而可以验证htap数据库系统查询结果的一致性。

17、本发明还提供了一种分析查询一致性验证系统,如图2所示,所述分析查询一致性验证系统包括:函数式数据生成器、查询结果计算器、工作负载切分器和倒放事务生成器。

18、所述函数式数据生成器根据用户给定的配置项定义若干数学函数,这些数学函数用于建立每一条的主键属性和非主键属性之间的映射关系,并生成初始数据导入到被测试的htap数据库中。

19、所述查询结果计算器生成满足查询结果可计算性的确定性分析查询。具体来说,为了得到一个查询的理想执行结果,利用函数式数据生成器将缺少非主键属性的记录通过计算的方式补充为完整的记录,进而通过模拟数据库系统内部查询执行逻辑的方式去计算一个算子理想的查询结果。

20、所述工作负载切分器根据用户给定的配置项将原始的oltp工作负载切分为若干个互不相交的子负载。

21、所述倒放事务生成器首先搜集每一个子负载的写集合,然后调用函数式数据生成器获取写集合中每一条记录的初始值,最后生成若干个倒放事务注入到下一个子负载中,倒放事务将写集合中的记录恢复为初始状态。每一个子负载依次进行类似的处理,从而形成可以定期恢复状态的自转式事务负载。

22、本发明还提供了发现htap数据库中存在代码缺陷的方法。

23、所述发现htap数据库中存在代码缺陷的方法是将待验证htap工作负载拆分为oltp工作负载和olap工作负载,其中,oltp工作负载利用本发明所提方法将其改造为自转式事务负载,olap工作负载利用本发明所提方法将其改造为确定性分析查询,最后在自转式事务负载将数据库状态恢复到初始状态时发起确定性分析查询,使得分析查询的查询结果一致性得到验证,进而发现被数据库开发者所遗漏的代码缺陷。

24、本发明还提供了一种实现上述一致性检验方法的硬件系统,所述硬件系统包括:存储器和处理器;所述存储器上存储有计算机程序,当所述计算机程序被所述处理器执行时,实现上述的方法。

25、本发明还提供了一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时,实现上述一致性检验方法。

26、本发明还提供了上述查询一致性验证方法、验证系统、硬件系统或计算机可读存储介质在htap数据库代码缺陷检测等中的应用。

27、本发明的有益效果包括:本发明提出的基于自转式事务负载和确定性分析查询的htap数据库查询一致性验证系统及方法,能够有效地检测现今主流的htap数据库中存在的弱一致性读现象,有效地发现htap数据库中存在的代码缺陷,并且对物理机器的cpu和内存占用率均维持在较低水平。首先,本发明给出了解决这一问题的三个挑战,包括数据状态的不确定性迁移、海量的数据和多样的查询语义。然后,提出自转式事务负载使得在数据状态不确定性迁移的条件下,确定性地将数据库状态周期性地恢复为初始状态。接下来,提出函数式数据生成方法利用现代cpu的高速处理能力高效地生成海量的数据,并提出确定性分析查询通过模拟数据库内部执行查询逻辑以一种通用的方法验证语义多样的查询。最后,通过结合自转式事务负载和确定性分析查询,从而在一个系统中解决上述三个挑战。

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