用于全链路追踪事务的方法及原生分布式数据库转让专利

申请号 : CN202210418566.0

文献号 : CN114547208B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 杨志丰

申请人 : 北京奥星贝斯科技有限公司

摘要 :

本说明书实施例提供了用于全链路追踪事务的方法及原生分布式数据库。其中,分布式数据库中的事务由至少一个SQL构成,每个SQL的执行计划包括至少一个DFO,每个DFO包括至少一个算子。在该方法中,在待追踪事务的执行过程中,确定当前执行动作所属的当前执行阶段;将当前执行阶段所属的Span对应的Span信息记录在本地;在待追踪事务执行完成后,采集待追踪事务所包括的各个执行阶段的Span信息;以及根据所采集的各个Span信息来确定待追踪事务的全链路执行过程。

权利要求 :

1.一种用于对分布式数据库中的事务进行全链路追踪的方法,其中,所述分布式数据库中的事务由至少一个SQL构成,每个SQL的执行计划包括至少一个DFO,每个DFO是所属SQL的执行计划中的一个子计划,每个DFO包括至少一个算子,所述方法包括:

在待追踪事务的执行过程中,确定当前执行动作所属的当前执行阶段,其中,所述执行过程传递的信息包括所述待追踪事务的Trace ID以及所述执行过程包括的已执行的各个执行阶段所属的Span对应的Span ID,其中,所述Span是具有开始时间和执行时长的逻辑单元,所述Span ID是对应Span的标识,所述Trace ID是所述待追踪事务对应的标识;

将所述当前执行阶段所属的Span对应的Span信息记录在本地,其中,所述Span具有的语义是根据所述分布式数据库中的事务执行逻辑定义的,每个Span信息用于确定对应的Span与所属同一事务中的其他Span之间的引用关系;

在所述待追踪事务执行完成后,采集所述待追踪事务所包括的各个执行阶段的Span信息;以及根据所采集的各个Span信息来确定所述待追踪事务的全链路执行过程,

其中,将所述当前执行阶段所属的Span对应的Span信息记录在本地包括:

在所述当前执行阶段对应的执行粒度大于执行粒度阈值时,将所述当前执行阶段所属的Span对应的Span信息记录在本地,其中,执行粒度根据事务执行逻辑来划分,每个执行阶段所属的Span对应一种执行粒度。

2.如权利要求1所述的方法,其中,所划分的执行粒度包括SQL粒度、DFO粒度以及算子粒度。

3.如权利要求1所述的方法,还包括:

对所述分布式数据库中待执行的各个事务进行采样;以及

将采样得到的事务确定为待追踪事务。

4.如权利要求1所述的方法,其中,根据所采集的各个Span信息来确定所述待追踪事务的全链路执行过程包括:根据所采集的各个Span信息所确定的各个Span之间的引用关系,将该各个Span信息对应的执行阶段在时间维度上进行排布,以展示所述待追踪事务的全链路执行过程。

5.如权利要求1所述的方法,其中,所述分布式数据库与代理服务器通信连接,所述代理服务器用于将部署在客户端中的驱动发起的事务请求转发至所述分布式数据库,每个事务的执行过程分别经过所述驱动、所述代理服务器以及所述分布式数据库。

6.如权利要求5所述的方法,还包括:

在所述驱动处,为待执行事务生成一个对应的Trace ID;以及

在所述驱动处,将本地生成的包括有所述Trace ID的Span信息发送给所述代理服务器,以使所述代理服务器将该Span信息记录在所述代理服务器中。

7.如权利要求6所述的方法,其中,在所述驱动处,将本地生成的包括有所述Trace ID的Span信息发送给所述代理服务器包括:在所述驱动处,将本地生成的包括有所述Trace ID的Span信息以piggyback方式发送给所述代理服务器。

8.如权利要求1所述的方法,其中,所述分布式数据库包括原生分布式数据库,所述原生分布式数据库包括OceanBase数据库。

9.一种用于对分布式数据库中的事务进行全链路追踪的方法,所述方法由所述分布式数据库包括的存储节点来执行,所述存储节点中的事务由至少一个SQL构成,每个SQL的执行计划包括至少一个DFO,每个DFO是所属SQL的执行计划中的一个子计划,每个DFO包括至少一个算子,所述方法包括:

在待追踪事务在所述存储节点中的执行过程中,确定当前执行动作所属的当前执行阶段,其中,所述执行过程传递的信息包括所述待追踪事务的Trace ID以及已执行的各个执行阶段所属的Span对应的Span ID,其中,所述Span是具有开始时间和执行时长的逻辑单元,所述Span ID是对应Span的标识,所述Trace ID是所述待追踪事务对应的标识;以及将所述当前执行阶段所属的Span对应的Span信息记录在本地,以使采集设备从所述存储节点中采集所述待追踪事务在所述存储节点中所执行的各个执行阶段的Span信息,并根据所采集的所述待追踪事务的各个Span信息来确定所述待追踪事务的全链路执行过程,其中,各个执行节点所属的Span具有的语义是根据所述分布式数据库中的事务执行逻辑定义的,每个Span信息用于确定对应的Span与所属同一事务中的其他Span之间的引用关系,其中,将所述当前执行阶段所属的Span对应的Span信息记录在本地包括:

在所述当前执行阶段对应的执行粒度大于执行粒度阈值时,将所述当前执行阶段所属的Span对应的Span信息记录在本地,其中,执行粒度根据事务执行逻辑来划分,每个执行阶段所属的Span对应一种执行粒度。

10.一种原生分布式数据库,包括多个存储节点,各个存储节点中所执行的事务由至少一个SQL构成,每个SQL的执行计划包括至少一个DFO,每个DFO是所属SQL的执行计划中的一个子计划,每个DFO包括至少一个算子,所述各个存储节点包括执行阶段确定单元和Span信息记录单元,所述执行阶段确定单元,被配置为在待追踪事务在原生分布式数据库中的执行过程中,确定当前执行动作所属的当前执行阶段,其中,所述执行过程传递的信息包括所述待追踪事务的Trace ID以及已执行的各个执行阶段所属的Span对应的Span ID,其中,所述Span是具有开始时间和执行时长的逻辑单元,所述Span ID是对应Span的标识,所述Trace ID是所述待追踪事务对应的标识;以及所述Span信息记录单元,被配置为将所述当前执行阶段所属的Span对应的Span信息记录在本地,以使采集设备从所述Span信息记录单元所属的存储节点中采集所述待追踪事务在该存储节点中所执行的各个执行阶段的Span信息,并根据所采集的所述待追踪事务的各个Span信息来确定所述待追踪事务的全链路执行过程,其中,各个执行节点所属的Span具有的语义是根据所述分布式数据库中的事务执行逻辑定义的,每个Span信息用于确定对应的Span与所属同一事务中的其他Span之间的引用关系,所述Span信息记录单元,还被配置为在所述当前执行阶段对应的执行粒度大于执行粒度阈值时,将所述当前执行阶段所属的Span对应的Span信息记录在本地,其中,执行粒度根据事务执行逻辑来划分,每个执行阶段所属的Span对应一种执行粒度。

11.一种电子设备,包括:至少一个处理器,与所述至少一个处理器耦合的存储器,以及存储在所述存储器上的计算机程序,所述至少一个处理器执行所述计算机程序来实现如权利要求9所述的方法。

12.一种计算机可读存储介质,其存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求9所述的方法。

13.一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如权利要求9所述的方法。

说明书 :

用于全链路追踪事务的方法及原生分布式数据库

技术领域

[0001] 本说明书实施例涉及数据库技术领域,具体地,涉及用于全链路追踪事务的方法及原生分布式数据库。

背景技术

[0002] 分布式数据库由多个分布式数据存储节点构成,各个存储节点之间相互独立又相互之间通信连接。在分布式数据库中,为了执行一条SQL,各个存储节点之间可以通过RPC协议进行通信,因此,在分布式数据库中,执行一条SQL有时需要经过多个存储节点等多个组件,每个组件上执行一部分操作,SQL所经过的所有组件上所执行的操作可以构成该SQL的完整执行过程。
[0003] 目前,在传统的单机数据库中,SQL仅在一个机器上执行,因此可以通过记录该SQL的执行过程中各个动作的执行时间点便能够方便地对该SQL的执行过程进行全链路追踪。然而,对于分布式数据库而言,由于SQL的执行过程需要经过多个组件,这使得对该SQL的追踪较困难。此外,由于各个组件的时间存在差异,导致无法根据各个动作的时间点来进行全链路跟踪。因此,如何实现在分布式数据库中对事务进行全链路跟踪是亟待解决的问题。

发明内容

[0004] 鉴于上述,本说明书实施例提供了用于全链路追踪事务的方法及原生分布式数据库。通过本说明书实施例提供的技术方案,实现了对分布式数据库中的事务进行全链路追踪。
[0005] 根据本说明书实施例的一个方面,提供了一种用于对分布式数据库中的事务进行全链路追踪的方法,其中,所述分布式数据库中的事务由至少一个SQL构成,每个SQL的执行计划包括至少一个DFO,每个DFO包括至少一个算子,所述方法包括:在待追踪事务的执行过程中,确定当前执行动作所属的当前执行阶段,其中,所述执行过程传递的信息包括所述待追踪事务的Trace ID以及所述执行过程包括的已执行的各个执行阶段所属的Span对应的Span ID;将所述当前执行阶段所属的Span对应的Span信息记录在本地,其中,所述Span具有的语义是根据所述分布式数据库中的事务执行逻辑定义的,每个Span信息用于确定对应的Span与所属同一事务中的其他Span之间的引用关系;在所述待追踪事务执行完成后,采集所述待追踪事务所包括的各个执行阶段的Span信息;以及根据所采集的各个Span信息来确定所述待追踪事务的全链路执行过程。
[0006] 根据本说明书实施例的另一方面,还提供一种用于对分布式数据库中的事务进行全链路追踪的方法,所述方法由所述分布式数据库包括的存储节点来执行,所述存储节点中的事务由至少一个SQL构成,每个SQL的执行计划包括至少一个DFO,每个DFO包括至少一个算子,所述方法包括:在待追踪事务在所述存储节点中的执行过程中,确定当前执行动作所属的当前执行阶段,其中,所述执行过程传递的信息包括所述待追踪事务的Trace ID以及已执行的各个执行阶段所属的Span对应的Span ID;以及将所述当前执行阶段所属的Span对应的Span信息记录在本地,以使采集设备从所述存储节点中采集所述待追踪事务在所述存储节点中所执行的各个执行阶段的Span信息,并根据所采集的所述待追踪事务的各个Span信息来确定所述待追踪事务的全链路执行过程,其中,各个执行节点所属的Span具有的语义是根据所述分布式数据库中的事务执行逻辑定义的,每个Span信息用于确定对应的Span与所属同一事务中的其他Span之间的引用关系。
[0007] 根据本说明书实施例的另一方面,还提供一种原生分布式数据库,包括多个存储节点,各个存储节点中所执行的事务由至少一个SQL构成,每个SQL的执行计划包括至少一个DFO,每个DFO包括至少一个算子,所述各个存储节点包括执行阶段确定单元和Span信息记录单元,所述执行阶段确定单元,被配置为在待追踪事务在原生分布式数据库中的执行过程中,确定当前执行动作所属的当前执行阶段,其中,所述执行过程传递的信息包括所述待追踪事务的Trace ID以及已执行的各个执行阶段所属的Span对应的Span ID;以及所述Span信息记录单元,被配置为将所述当前执行阶段所属的Span对应的Span信息记录在本地,以使采集设备从所述Span信息记录单元所属的存储节点中采集所述待追踪事务在该存储节点中所执行的各个执行阶段的Span信息,并根据所采集的所述待追踪事务的各个Span信息来确定所述待追踪事务的全链路执行过程,其中,各个执行节点所属的Span具有的语义是根据所述分布式数据库中的事务执行逻辑定义的,每个Span信息用于确定对应的Span与所属同一事务中的其他Span之间的引用关系。
[0008] 根据本说明书实施例的另一方面,还提供一种电子设备,包括:至少一个处理器,与所述至少一个处理器耦合的存储器,以及存储在所述存储器上的计算机程序,所述至少一个处理器执行所述计算机程序来实现如上述任一所述的用于对分布式数据库中的事务进行全链路追踪的方法。
[0009] 根据本说明书实施例的另一方面,还提供一种计算机可读存储介质,其存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的用于对分布式数据库中的事务进行全链路追踪的方法。
[0010] 根据本说明书实施例的另一方面,还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上任一所述的用于对分布式数据库中的事务进行全链路追踪的方法。

附图说明

[0011] 通过参照下面的附图,可以实现对于本说明书实施例内容的本质和优点的进一步理解。在附图中,类似组件或特征可以具有相同的附图标记。
[0012] 图1示出了分布式数据库的一个示例的示意图。
[0013] 图2示出了OceanBase数据库与应用交互的一个示例的示意图。
[0014] 图3示出了根据本说明书实施例的用于对分布式数据库中的事务进行全链路追踪的方法的一个示例的流程图。
[0015] 图4示出了SQL执行计划对应的树状结构的一个示例的示意图。
[0016] 图5示出了根据本说明书实施例的展示事务的全链路执行过程的一个示例的示意图。
[0017] 图6示出了根据本说明书实施例的用于对分布式数据库中的事务进行全链路追踪的方法的一个示例的流程图。
[0018] 图7示出了根据本说明书实施例的原生分布式数据库的一个示例的方框图。
[0019] 图8示出了本说明书实施例的用于实现事务进行全链路追踪方法的电子设备的方框图。

具体实施方式

[0020] 以下将参考示例实施方式讨论本文描述的主题。应该理解,讨论这些实施方式只是为了使得本领域技术人员能够更好地理解从而实现本文描述的主题,并非是对权利要求书中所阐述的保护范围、适用性或者示例的限制。可以在不脱离本说明书实施例内容的保护范围的情况下,对所讨论的元素的功能和排列进行改变。各个示例可以根据需要,省略、替代或者添加各种过程或组件。另外,相对一些示例所描述的特征在其它例子中也可以进行组合。
[0021] 如本文中使用的,术语“包括”及其变型表示开放的术语,含义是“包括但不限于”。术语“基于”表示“至少部分地基于”。术语“一个实施例”和“一实施例”表示“至少一个实施例”。术语“另一个实施例”表示“至少一个其他实施例”。术语“第一”、“第二”等可以指代不同的或相同的对象。下面可以包括其他的定义,无论是明确的还是隐含的。除非上下文中明确地指明,否则一个术语的定义在整个说明书中是一致的。
[0022] 图1示出了分布式数据库1的一个示例的示意图。
[0023] 如图1所示,分布式数据库系统1可以包括多个存储节点10‑1到10‑4。存储节点10‑1到10‑4为分布式存储节点,每个存储节点可以独立地进行数据处理和数据存储。需要说明的是,图1示出的示例仅仅是例示性的。在其它实施例中,分布式数据库系统1可以包括更多或更少的存储节点。
[0024] 分布式数据库1例如可以采用share nothing架构,比如,OceanBase数据库。在这种分布式数据库中,数据分布式地存储在各个存储节点中。例如,数据可以被分割为多个数据分区(也可以称为数据分块),所分割出的数据分区分别存储到不同的存储节点中。每个存储节点可以存储一个或多个数据分区。每个存储节点上涉及的数据访问所需要的CPU资源和IO资源都发生在本地,由该存储节点执行。
[0025] 图2示出了OceanBase数据库与应用交互的一个示例的示意图。
[0026] 如图2所示,OceanBase数据库可以包括有多个OBServer,每个OBServer相当于一个存储节点,用于提供数据存储和数据处理。OceanBase数据库所包括的各个OBServer之间可以通过RPC协议进行通信。需要说明的是,图2中的三个OBServer仅作为示例,在其它实施例中,可以包括更多或更少的OBServer。
[0027] 应用可以通过OBProxy(OceanBase Database Proxy,ODP)来访问OceanBase数据库,OBProxy是无状态的代理服务器,OceanBase数据库可以与多个OBProxy通信连接。需要说明的是,图2中的三个OBProxy仅作为示例,在其它实施例中,可以部署更多或更少的OBProxy。
[0028] OBProxy同时连接应用和OceanBase数据库,OBProxy用于接收应用发送的SQL请求,并将SQL请求转发至目标OBServer上,并将执行结果反馈给应用。各个OBProxy之间无联系,可以通过F5/SLB组成负载均衡集群。各个OBProxy可以与OBServer部署在同一台物理机上,或者还可以部署在应用服务器上。
[0029] 图3示出了根据本说明书实施例的用于对分布式数据库中的事务进行全链路追踪的方法的一个示例300的流程图。
[0030] 在本说明书实施例中,事务(Transaction)是由事务开始和事务结束之间执行的全部操作组成。分布式数据库中的事务需要经由分布式数据库来执行,在一个示例中,分布式数据库中的事务所包括的大部分操作在分布式数据库中执行。例如,应用发起SQL请求,分布式数据库执行该SQL。
[0031] 分布式数据库中的事务可以是由一系列的SQL组成的原子执行单元,即,分布式数据库中的事务包括至少一个SQL,构成一个事务的至少一个SQL可以按序执行,形成一个完整的执行逻辑过程。
[0032] 每个SQL的执行可以相当于是一个物理执行计划,SQL可以按照对应的执行计划来执行。每个SQL的执行计划可以包括至少一个DFO(data flow object),DFO是SQL的执行计划中的一个片段,可以被单独调用执行。SQL的执行计划可以相当于多个子计划构成的DAG(Directed Acyclic Graph),每个子计划就是一个DFO。
[0033] 作为子计划的每个DFO可以包括至少一个算子(operator),每个算子所执行的操作对应的操作类型是确定的。算子是构成DFO的基本组成单元,从而也是构成SQL执行计划的基本组成单元。每个SQL的执行计划可以是由多个算子组成的状态树,状态树中的每个算子可以用来描述与具体的SQL语义对应的基础操作。比如,TABLE SCAN算子、EXCHANGE算子、JOIN算子、TABLE DELETE算子、GROUP BY算子等。
[0034] 图4示出了SQL执行计划对应的状态树的一个示例的示意图。如图4所示,状态树中的每个圆圈表示一个算子,连续的多个算子之间可以构成一个子计划,即构成一个DFO,比如,第一个算子(LIMIT)和第二个算子(OC IN SORT)可以构成一个DFO,第三个算子(OUT.1:EX10004(4))至第八个算子(IN.SORT)可以构成另一个DFO。图4所示的所有算子构成的状态树是SQL的执行计划。
[0035] 在一个示例中,本说明书实施例所针对的分布式数据库可以包括原生分布式数据库。进一步地,本说明书实施例所针对的原生分布式数据库可以包括OceanBase数据库。
[0036] 如图3所示,在310,在待追踪事务的执行过程中,可以确定当前执行动作所属的当前执行阶段。
[0037] 在本说明书实施例中,分布式数据库中可以同时并行执行多个事务。在一个示例中,在分布式数据库中执行的每个事务都可以被确定为待追踪事务。在另一个示例中,可以将分布式数据库中的部分事务确定为待追踪事务,则可以仅对分布式数据库中的部分事务进行追踪。
[0038] 在确定待追踪事务的一种方式中,可以对分布式数据库中待执行的各个事务进行采样,然后将采样得到的事务确定为待追踪事务。
[0039] 在一种采样方式中,可以在每批第一指定数量的待执行事务中采样第二指定数量的事务,第二指定数量小于第一指定数量,各个批次所包括的待执行事务各不相同。比如,可以从每批第一指定数量的待执行事务中采样一个事务。在另一种采样方式中,可以根据时间进行采样。在一个示例中,可以每隔指定时长采样一次,每次采样的事务数量可以是第三指定数量。在另一个示例中,可以在每个时间段内执行第四指定数量的采样,每次采样的事务数量可以是第五指定数量。在另一种采样方式中,可以以随机方式进行采样。
[0040] 在本说明书实施例中,事务执行过程中的每个执行阶段可以是一个持续的过程,每个执行阶段可以包括多个执行动作,该多个执行动作按序执行来形成一套执行逻辑,所形成的执行逻辑是所属执行阶段的执行逻辑。属于同一个执行阶段中的多个执行动作中可以包括起始执行动作和结束执行动作,起始执行动作可以表示所属执行阶段的开始,结束执行动作可以表示所属执行阶段的结束。例如,每个SQL的执行过程可以作为一个完整的执行阶段,每个SQL的执行阶段可以包括解析阶段、优化阶段、具体执行阶段等。每个DFO的执行过程可以作为一个执行阶段,每个算子的执行过程也可以作为一个执行阶段。
[0041] 针对每个事务,在发起该事务的同时可以生成一个Trace ID,Trace ID可以用于对事务的一次全链路跟踪过程进行标识。在事务的完整执行过程中,整个请求的调用链中始终携带Trace ID,上游服务携带Trace ID往下游服务进行传递。从而,通过Trace ID可以标记事务的完整执行路径。
[0042] 此外,在待追踪事务的执行过程中,传递的信息还可以包括已执行的各个执行阶段所属的Span对应的Span ID。
[0043] 在本说明书实施例中,Span表示具有开始时间和执行时长的逻辑单元,各个Span之间可以通过嵌套或者顺序排列建立逻辑因果关系。每个Span具有语义,Span所具有的语义可以是根据分布式数据库中的事务执行逻辑定义的。例如,一个事务的事务执行逻辑可以利用SQL、DFO以及算子等来表示,则Span具有的语义可以根据SQL、DFO以及算子等来定义,比如,针对SQL类型的Span,针对DFO类型的Span,以及针对算子类型的Span等。
[0044] 每个Span所具有的语义确定了该Span的类型,不同类型的Span所具有的语义可以不同,所起的作用也可以不同。每个类型的Span可以是经过标准化设置的,经过标准化的Span可以直接应用于分布式数据库的应用场景中。
[0045] 在Span标准化的一种方式中,可以将Span的操作名称(即,Operation Name)以及Span对应的Span Tag进行标准化设置,Span Tag可以是构成Span标签的集合,可以用于表示Span的属性。每个Span的操作名称和Span Tag可以用于表征该Span所具有的语义,在Span的操作名称和Span Tag确定后,则该Span的语义也被确定。
[0046] 在本说明书实施例中,事务执行过程包括的各个执行阶段可以设置有对应的Span,不同执行阶段可以设置不同语义的Span。每个执行阶段对应的Span的语义根据该执行阶段在事务执行逻辑中的位置确定,例如,针对SQL所包括的其中一个DFO的执行阶段,可以设置该执行阶段对应的Span是针对DFO的Span,该Span所表示的过程是DFO的执行过程。
[0047] 每个Span对应有Span ID,Span ID与Span一一对应,每个Span对应的Span ID是该Span的执行阶段生成的、用于标识该执行阶段的内部调用状况。每个执行阶段完成后,该执行阶段的Span ID与Trace ID一起传递给下游的执行阶段。从而,通过Trace ID和各个执行阶段对应的Span ID可以确定出待追踪事务的完整执行过程。
[0048] 在本说明书实施例中,确定当前执行阶段的执行主体可以是用于执行该当前执行阶段的执行设备,当待追踪事务需要经由多个设备来执行时,在不同的执行阶段,确定当前执行阶段的执行主体可以不同。
[0049] 在一个示例中,待追踪事务经由分布式数据库来执行,则可以由分布式数据库来确定当前执行阶段。例如,应用与分布式数据库通信连接,待追踪事务可以由应用发起,在分布式数据库中执行,从而由该分布式数据库来执行确定当前执行阶段的操作。
[0050] 在另一个示例中,分布式数据库可以与代理服务器通信连接,代理服务器用于将部署在客户端中的驱动发起的事务请求转发至分布式数据库中,从而每个事务的执行过程可以分别经过驱动、代理服务器以及分布式数据库。例如,在分布式数据库是OceanBase数据库时,代理服务器可以是OBProxy。
[0051] 在该示例中,待追踪事务可以是由部署在客户端中的驱动发起,在代理服务器和分布式数据库中具体执行。则在当前执行阶段是处于代理服务器中时,用于执行确定当前执行阶段的操作的执行主体可以是代理服务器。在当前执行阶段是处于分布式数据库中时,用于执行确定当前执行阶段的操作的执行主体可以是分布式数据库。
[0052] 回到图3,在320,可以将当前执行阶段所属的Span对应的Span信息记录在本地。
[0053] 在本说明书实施例中,每个Span所对应的执行阶段在执行完成后可以生成相应的Span信息,每个Span信息可以用于确定对应的Span与所属同一事务中的其他Span之间的引用关系,引用关系可以包括父子关系(Child_Of)和跟随关系(Follows_From)等。
[0054] 父子关系是指在一个Span的执行阶段中发生了另一个Span的执行阶段。例如,在一个事务请求中,被调用的一方产生的Span与发起调用的一方所产生的Span可以构成父子关系。又例如,一个 SQL Insert 操作的Span和数据库存储引擎的Insert Row方法的Span构成父子关系。
[0055] 跟随关系是指在一个Span的执行阶段之后发生了另一个Span的执行阶段,用来描述顺序执行关系。在跟随关系中,优先执行的Span对应的执行阶段不依赖于后执行的Span对应的执行阶段所生成的执行结果。
[0056] 在一个示例中,每个Span对应包括有多种状态信息:操作名称、起始时间(Start Timestamp)、结束时间(End Timestamp)、Span Tag、Span Logs、SpanContext以及References等。其中,Span Logs可以是一组Span的日志集合。SpanContext可以包括进行全链路追踪的全局上下文信息,比如,SpanContext可以包括Trace ID以及各个Span对应的Span ID。References用于表示Span之间的引用关系,References表示的引用关系可以包括父子关系和跟随关系等。
[0057] 可以按照Span的各个状态信息,获取相应的Span信息,即,每个Span的Span信息可以包括该Span的操作名称、起始时间、结束时间、Span Tag、Span Logs、SpanContext以及References等,不同Span对应的Span信息中所包括的各个状态信息可以不同。例如,针对SQL的Span与针对DFO的Span相比,Span信息中的操作名称、起始时间、结束时间等都不同。
[0058] 通过各个Span之间的引用关系,可以确定各个Span对应的执行阶段的执行顺序,进而能够确定出事务的全链路执行过程。
[0059] 在本说明书实施例中,记录Span信息的执行主体是当前执行阶段的执行设备,例如,在当前执行阶段的执行设备是OBProxy时,则由OBProxy来记录Span信息;在当前执行阶段的执行设备是分布式数据库时,则由分布式数据库来记录Span信息。在一个示例中,分布式数据库中的各个存储节点可以作为独立执行操作的执行主体,在当前执行阶段的执行设备是分布式数据库中的一个存储节点时,则由该存储节点作为执行主体来记录Span信息。
[0060] Span信息可以以日志的形式记录在本地的日志文件中。例如,在OBProxy中,可以将Span信息记录到OBProxy.log中,在OceanBase数据库包括的各个OBServer中,可以将Span信息记录到OBServer.log中。
[0061] 当前执行阶段的执行主体可以在每个会话的上下文中缓存所针对待追踪事务的多个Span对应的Span信息。例如,当一个SQL包括多个DFO且每个DFO包括多个算子时,在该SQL开始执行时,会话的上下文可以缓存该SQL的Span信息,在该SQL包括的其中一个DFO开始执行时,该上下文可以同时缓存SQL的Span信息以及DFO的Span信息,在DFO包括的其中给一个算子开始执行时,该上下文可以同时缓存SQL的Span信息、DFO的Span信息以及算子的Span信息。
[0062] 在每个执行阶段完成时,可以将该执行阶段的Span信息记录到本地中,并更新会话的上下文中的缓存。例如,在算子执行完成时,可以将算子的Span信息记录到本地中,并将会话的上下文中缓存的算子的Span信息删除。在DFO执行完成时,可以将DFO的Span信息记录到本地中,并将会话的上下文中缓存的DFO的Span信息删除。在SQL执行完成时,可以将SQL的Span信息记录到本地中,并将会话的上下文中缓存的SQL的Span信息删除。
[0063] 通过将Span信息记录在本地,避免各个执行阶段在获取到Span信息后在远程调用时将Span信息进行传递,从而减少事务执行过程中的资源开销,节省资源的同时能够提高事务的执行效率。
[0064] 在一个示例中,事务包括的各个执行阶段可以具有执行粒度的属性,执行粒度可以是根据事务执行逻辑所划分的。在一种粒度划分方式中,一个事务的事务执行逻辑可以利用SQL、DFO以及算子等来表示,则针对事务的执行粒度可以使用SQL、DFO以及算子等来表示,比如,SQL、DFO和算子可以分别表示一种执行粒度,即,所划分的执行粒度可以包括SQL粒度、DFO粒度以及算子粒度。
[0065] 不同执行粒度的粒度大小可以不同,在事务执行逻辑中,在一个执行阶段包括子执行阶段时,该执行阶段对应的执行粒度大于该子执行阶段对应的执行粒度。例如,SQL粒度大于DFO粒度,DFO粒度大于算子粒度。
[0066] 在每个执行阶段具有执行粒度的属性的情况下,每个执行阶段所属的Span也可以对应一种执行粒度,每个Span对应的执行粒度是该Span的一种执行粒度属性。在一个事务的执行过程确定的情况下,该事务包括的各个执行阶段的执行逻辑可以确定,相应地,各个执行阶段对应的Span可以确定,各个执行阶段的执行粒度属性可以确定,从而各个执行阶段对应的Span的执行粒度属性可以确定。
[0067] 在确定当前执行阶段时,可以确定该当前执行阶段对应的执行粒度。然后,可以判断当前执行阶段对应的执行粒度是否大于指定的执行粒度阈值,所指定的执行粒度阈值可以是针对事务的执行粒度中的任一种执行粒度。
[0068] 在当前执行阶段对应的执行粒度大于执行粒度阈值时,可以将该当前执行阶段所属的Span对应的Span信息记录在本地。在当前执行阶段对应的执行粒度不大于执行粒度阈值时,则可以不记录该当前执行阶段的Span信息。
[0069] 通过各个执行阶段的执行粒度,可以根据执行粒度阈值有针对性地记录部分执行阶段的Span信息,无需将事务包括的所有执行阶段的Span信息进行记录,从而避免产生用于全链路追踪的数据量太大,从而减小所产生的全链路追踪数据对分布式数据库的性能影响,以及减少了后续对Span信息进行处理时的数据处理量。
[0070] 在330,在待追踪事务执行完成后,可以采集待追踪事务所包括的各个执行阶段的Span信息。
[0071] 在一个示例中,可以使用分布式数据库外部的采集设备来采集待追踪事务所包括的各个执行阶段的Span信息。采集设备可以与待追踪事务所经过的各个设备连接,以从各个设备中采集待追踪事务的Span信息。
[0072] 例如,待追踪事务经由OBProxy和分布式数据库执行时,则在OBProxy和分布式数据库中分别存储有Span信息,采集设备可以分别从OBProxy和分布式数据库中采集待追踪事务的Span信息。
[0073] 在一个示例中,分布式数据库中的各个存储节点可以独立运行,因此,各个存储节点可以将所执行的执行阶段对应的Span信息存储在本地,从而,采集设备在与分布式数据库连接时,该采集设备可以与该分布式数据库中的各个存储节点分别连接,以便于采集设备可以从各个存储节点中分别采集所存储的Span信息。
[0074] 在一个示例中,采集设备可以是与分布式数据库相匹配的设备,则该采集设备可以识别分布式数据库中的各种语义,比如,分布式数据库中的SQL、DFO以及算子等。在该示例中,采集设备可以包括采集单元、存储单元和展示单元,采集单元将采集的Span信息发送给存储单元进行存储,展示单元可以根据从存储单元中获取Span信息对事务的全链路执行过程进行展示。比如,采集单元可以是ob_trace_agent,存储单元可以是OCP database,展示单元可以是OCP UI。
[0075] 在另一个示例中,采集设备可以是通用采集设备,通用采集设备可以识别通用代码的语义,能够应用于各种应用场景下进行数据采集。例如,通用采集设备中的采集单元可以是Jaeger Agent和Jaeger Collector,通用采集设备中的存储单元可以是Jaeger DB,通用采集设备中的展示单元可以是Jaeger UI。
[0076] 在340,可以根据所采集的各个Span信息来确定待追踪事务的全链路执行过程。
[0077] 在本说明书实施例中,可以根据每个Span信息所表征出的对应的Span与所属同一事务中的其他Span之间的引用关系,来确定各个Span之间的引用关系以及执行顺序关系,然后,根据各个Span之间的引用关系以及执行顺序关系,可以相应地确定出各个执行阶段的执行顺序,各个执行阶段按照执行顺序可以组成待追踪事务的全链路执行过程。
[0078] 在一个示例中,可以根据各个Span信息所确定的各个Span之间的引用关系,将该各个Span信息对应的执行阶段在时间维度上进行排布,以展示待追踪事务的全链路执行过程。
[0079] 在该示例中,根据每个Span信息中的起始时间和结束时间可以确定对应的执行阶段的执行时间段。当两个Span是父子关系时,子Span对应的执行时间段被包含在父Span对应的执行时间段内,即,子Span的起始时间大于父Span的起始时间,子Span的结束时间小于父Span的结束时间。当两个Span是跟随关系时,上游Span的执行时间段在下游Span的执行时间段之前。
[0080] 对于每个执行阶段,可以用时间条来表示,每个时间条可以由起始时间、结束时间以及时长来确定。在对各个执行阶段在时间维度上进行排布时,先执行的执行阶段对应的时间条排在后执行的执行阶段对应的时间条之前,针对父子关系的两个Span对应的两个执行阶段,子Span的执行阶段对应的时间条被包含在父Span的执行阶段对应的时间条内。
[0081] 图5示出了根据本说明书实施例的展示事务的全链路执行过程的一个示例的示意图。如图5所示,该事务包括3个SQL:SQL1、SQL2和SQL3,SQL1、SQL2和SQL3之间是跟随关系。SQL1包括DFO1和DFO2,SQL1与DFO1和DFO2之间均为父子关系, DFO1和DFO2之间是跟随关系。DFO2包括算子1和算子2,DFO2与算子1和算子2之间均是父子关系,算子1和算子2之间是跟随关系。SQL1、SQL2、SQL3、DFO1、DFO2、算子1以及算子2所构成的事务的全链路执行过程如图5所示。
[0082] 通过将事务的全链路执行过程进行展示,可以清楚地了解事务的各个执行阶段的耗时以及相邻的各个执行阶段之间的时间间隔,从而可以基于所展示的全链路执行过程分析事务执行过程以及分析执行过程中存在的问题,比如,耗时问题。针对耗时问题,可以根据各个执行阶段的耗时来找出事务执行耗时问题所在,从而可以有针对性地对有问题的执行阶段进行优化,进而从整体上提升事务的执行效率。
[0083] 在一个示例中,分布式数据库可以与代理服务器通信连接,代理服务器还可以与客户端通信连接。比如,分布式数据库的外部网络结构可以如图2所示。在该示例中,每个待执行的事务可以由部署在客户端中的驱动发起,从而每个事务的执行过程可以分别经过部署在客户端中的驱动、代理服务器以及分布式数据库。
[0084] 在驱动处,在发起待执行事务时,可以为该待执行事务生成一个对应的Trace ID,在该待执行事务的后续执行过程中,该Trace ID始终跟随着执行过程进行传递。在发起待执行事务后,驱动可以在执行阶段执行相应的操作,从而生成相应的Span信息,该Span信息可以包括有Trace ID。驱动可以将从本地所获取的Span信息发送给代理服务器,代理服务器将从驱动接收到的Span信息记录在代理服务器中。
[0085] 在该示例中,驱动将本地生成的Span信息不记录在本地,而记录在代理服务器中,这样在Span信息的采集阶段,可以从代理服务器中采集到客户端的Span信息,避免需要侵入到客户端的应用中才能采集客户端的Span信息。
[0086] 在一个示例中,驱动可以将本地生成的Span信息以piggyback方式发送给代理服务器。在该示例中,驱动在生成Span信息后,可以从驱动需要发送给代理服务器的其他信息中确定一个信息,将Span信息增加至所确定的信息的附加字段中。当驱动将该信息发送给代理服务器时,Span信息也随之发送给代理服务器。其中,所确定的信息是驱动必然会发送给代理服务器的信息,比如,驱动发送给代理服务器的事务请求信息。例如,驱动在生成Span信息后,可以将下一个驱动发送给代理服务器的信息确定为携带Span信息的信息。
[0087] 在该示例中,驱动以piggyback方式将Span信息发送给代理服务器,无需单独将Span信息发送给代理服务器,避免占用客户端的资源。
[0088] 图6示出了根据本说明书实施例的用于对分布式数据库中的事务进行全链路追踪的方法的一个示例600的流程图。
[0089] 图6所示的方法可以由分布式数据库所包括的存储节点来执行,存储节点中的事务由至少一个SQL构成,每个SQL的执行计划包括至少一个DFO,每个DFO包括至少一个算子。在一个示例中,分布式数据库可以是原生分布式数据库。
[0090] 如图6所示,在610,在待追踪事务在存储节点中的执行过程中,确定当前执行动作所属的当前执行阶段。
[0091] 其中,执行过程传递的信息包括待追踪事务的Trace ID以及已执行的各个执行阶段所属的Span对应的Span ID,已执行的各个执行阶段包括该存储节点中已执行的执行阶段以及其他存储节点和设备中已执行的执行阶段。
[0092] 在620,将当前执行阶段所属的Span对应的Span信息记录在本地,以使采集设备从存储节点中采集待追踪事务在存储节点中所执行的各个执行阶段的Span信息,并根据所采集的待追踪事务的各个Span信息来确定待追踪事务的全链路执行过程。
[0093] 其中,各个执行节点所属的Span具有的语义是根据分布式数据库中的事务执行逻辑定义的,每个Span信息用于确定对应的Span与所属同一事务中的其他Span之间的引用关系。
[0094] 在一个示例中,将当前执行阶段所属的Span对应的Span信息记录在本地包括:在当前执行阶段对应的执行粒度大于执行粒度阈值时,将当前执行阶段所属的Span对应的Span信息记录在本地。其中,执行粒度根据事务执行逻辑来划分,每个执行阶段所属的Span对应一种执行粒度。
[0095] 图7示出了根据本说明书实施例的原生分布式数据库700的一个示例的方框图。
[0096] 图7所示的原生分布式数据库包括有多个存储节点,各个存储节点中所执行的事务由至少一个SQL构成,每个SQL的执行计划包括至少一个DFO,每个DFO包括至少一个算子,各个存储节点包括执行阶段确定单元710和Span信息记录单元720。需要说明的是,图7所示的原生分布式数据库包括两个存储节点仅作为一个示例,在其它实施例中,原生分布式数据库可以包括更多或更少的存储节点。
[0097] 执行阶段确定单元710,可以被配置为在待追踪事务在原生分布式数据库中的执行过程中,确定当前执行动作所属的当前执行阶段。其中,执行过程传递的信息包括待追踪事务的Trace ID以及已执行的各个执行阶段所属的Span对应的Span ID。
[0098] Span信息记录单元720,可以被配置为将当前执行阶段所属的Span对应的Span信息记录在本地,以使采集设备从Span信息记录单元所属的存储节点中采集待追踪事务在该存储节点中所执行的各个执行阶段的Span信息,并根据所采集的待追踪事务的各个Span信息来确定待追踪事务的全链路执行过程。其中,各个执行节点所属的Span具有的语义是根据分布式数据库中的事务执行逻辑定义的,每个Span信息用于确定对应的Span与所属同一事务中的其他Span之间的引用关系。
[0099] 在一个示例中,Span信息记录单元720还可以被配置为:在当前执行阶段对应的执行粒度大于执行粒度阈值时,将当前执行阶段所属的Span对应的Span信息记录在本地,其中,执行粒度根据事务执行逻辑来划分,每个执行阶段所属的Span对应一种执行粒度。
[0100] 以上参照图1到图7,对根据本说明书实施例的用于对分布式数据库中的事务进行全链路追踪的方法及装置的实施例进行了描述。
[0101] 本说明书实施例的用于对分布式数据库中的事务进行全链路追踪的装置可以采用硬件实现,也可以采用软件或者硬件和软件的组合来实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的处理器将存储器中对应的计算机程序指令读取到内存中运行形成的。在本说明书实施例中,用于对分布式数据库中的事务进行全链路追踪的装置例如可以利用电子设备实现。
[0102] 图8示出了本说明书实施例的用于实现事务进行全链路追踪方法的电子设备800的方框图。
[0103] 如图8所示,电子设备800可以包括至少一个处理器810、存储器(例如,非易失性存储器)820、内存830和通信接口840,并且至少一个处理器810、存储器820、内存830和通信接口840经由总线850连接在一起。至少一个处理器810执行在存储器中存储或编码的至少一个计算机可读指令(即,上述以软件形式实现的元素)。
[0104] 在一个实施例中,在存储器中存储计算机可执行指令,其当执行时使得至少一个处理器810:在待追踪事务在存储节点中的执行过程中,确定当前执行动作所属的当前执行阶段;以及将当前执行阶段所属的Span对应的Span信息记录在本地,以使采集设备从存储节点中采集待追踪事务在存储节点中所执行的各个执行阶段的Span信息,并根据所采集的所述待追踪事务的各个Span信息来确定待追踪事务的全链路执行过程,其中,各个执行节点所属的Span具有的语义是根据分布式数据库中的事务执行逻辑定义的,每个Span信息用于确定对应的Span与所属同一事务中的其他Span之间的引用关系。
[0105] 应该理解,在存储器中存储的计算机可执行指令当执行时使得至少一个处理器810进行本说明书的各个实施例中以上结合图1‑7描述的各种操作和功能。
[0106] 根据一个实施例,提供了一种例如机器可读介质的程序产品。机器可读介质可以具有指令(即,上述以软件形式实现的元素),该指令当被机器执行时,使得机器执行本说明书的各个实施例中以上结合图1‑7描述的各种操作和功能。
[0107] 具体地,可以提供配有可读存储介质的系统或者装置,在该可读存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机或处理器读出并执行存储在该可读存储介质中的指令。
[0108] 在这种情况下,从可读介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此机器可读代码和存储机器可读代码的可读存储介质构成了本发明的一部分。
[0109] 本说明书各部分操作所需的计算机程序代码可以用任意一种或多种程序语言编写,包括面向对象编程语言,如Java、Scala、Smalltalk、Eiffel、JADE、Emerald、C++、C#、VB、NET以及Python等,常规程序化编程语言如C语言、Visual Basic 2003、Perl、COBOL 2002、PHP以及ABAP,动态编程语言如Python、Ruby和Groovy,或者其他编程语言等。该程序编码可以在用户计算机上运行,或者作为独立的软件包在用户计算机上运行,或者部分在用户计算机上运行另一部分在远程计算机运行,或者全部在远程计算机或服务器上运行。在后一种情况下,远程计算机可以通过任何网络形式与用户计算机连接,比如局域网(LAN)或广域网(WAN),或连接至外部计算机(例如通过因特网),或者在云计算环境中,或者作为服务使用,比如软件即服务(SaaS)。
[0110] 可读存储介质的实施例包括软盘、硬盘、磁光盘、光盘(如CD‑ROM、CD‑R、CD‑RW、DVD‑ROM、DVD‑RAM、DVD‑RW、DVD‑RW)、磁带、非易失性存储卡和ROM。可选择地,可以由通信网络从服务器计算机上或云上下载程序代码。
[0111] 上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0112] 上述各流程和各系统结构图中不是所有的步骤和单元都是必须的,可以根据实际的需要忽略某些步骤或单元。各步骤的执行顺序不是固定的,可以根据需要进行确定。上述各实施例中描述的装置结构可以是物理结构,也可以是逻辑结构,即,有些单元可能由同一物理实体实现,或者,有些单元可能分由多个物理实体实现,或者,可以由多个独立设备中的某些部件共同实现。
[0113] 在整个本说明书中使用的术语“示例性”意味着“用作示例、实例或例示”,并不意味着比其它实施例“优选”或“具有优势”。出于提供对所描述技术的理解的目的,具体实施方式包括具体细节。然而,可以在没有这些具体细节的情况下实施这些技术。在一些实例中,为了避免对所描述的实施例的概念造成难以理解,公知的结构和装置以框图形式示出。
[0114] 以上结合附图详细描述了本说明书的实施例的可选实施方式,但是,本说明书的实施例并不限于上述实施方式中的具体细节,在本说明书的实施例的技术构思范围内,可以对本说明书的实施例的技术方案进行多种简单变型,这些简单变型均属于本说明书的实施例的保护范围。
[0115] 本说明书内容的上述描述被提供来使得本领域任何普通技术人员能够实现或者使用本说明书内容。对于本领域普通技术人员来说,对本说明书内容进行的各种修改是显而易见的,并且,也可以在不脱离本说明书内容的保护范围的情况下,将本文所定义的一般性原理应用于其它变型。因此,本说明书内容并不限于本文所描述的示例和设计,而是与符合本文公开的原理和新颖性特征的最广范围相一致。