数据处理方法、装置、电子设备及可读存储介质
文献发布时间:2024-04-18 20:00:50
技术领域
本申请涉及数据库技术领域,具体而言,本申请涉及一种数据处理方法、装置、电子设备及计算机可读存储介质。
背景技术
分布式数据库通常由多个节点组成,其中包括计算节点和存储节点。计算节点负责处理SQL请求(用于进行增、删、改、查操作中至少一种的请求),而存储节点则负责存储数据行或数据行的索引。
在分布式数据库中,计算节点可以通过网络连接各个存储节点来对存储节点中的数据进行操作,计算节点从存储节点中读取数据时,索引和数据分布在不同的存储节点上,需要先读取索引,然后根据索引再读取数据,这需要多次网络交互,造成较大的时延。
发明内容
本申请实施例提供了一种数据处理方法、装置、电子设备、计算机可读存储介质及计算机程序产品,可以解决背景技术中存在的至少一个技术问题。技术方案如下:
根据本申请实施例的第一方面,提供了一种数据处理方法,应用于分布式数据库节点集群的目标存储节点,目标存储节点存储第一数据表以及第一数据表中每个数据行在各个索引列的索引;方法包括:
接收计算节点发送的第一请求,第一请求包括第一数据表中的第一数据行的行标识以及第一操作;第一请求为计算节点基于客户端发送的数据库操作语句生成的;
从各个索引列中确定第一操作影响的第一索引列,对第一数据表中的第一数据行以及第一数据行在各个第一索引列的索引进行第一操作。
根据本申请实施例的第二方面,提供了又一种数据处理方法,其特征在于,应用于分布式数据库节点集群的计算节点,方法包括:
接收客户端发送的数据库操作语句,基于数据库操作语句生成第一请求,第一请求包括第一数据表中第一数据行的行标识以及第一操作;
确定第一数据表所在的目标存储节点,向目标存储发送第一请求,以使得目标存储节点从各个索引列中确定第一操作影响的第一索引列,对第一数据表中的第一数据行以及第一数据行在各个第一索引列的索引进行第一操作;
目标存储节点存储第一数据表以及第一数据表中每个数据行在各个索引列的索引。
根据本申请实施例的第三方面,提供了另一种数据处理方法,应用于分布式数据库节点集群的管理节点,分布式数据库节点集群中包括多个存储节点;每个存储节点存储至少一个数据表以及各数据表中每个数据行在各个索引列的索引;
方法包括:
周期性接收各个存储节点发送的心跳消息;心跳消息包括相应存储节点的总存储空间和剩余存储空间;
在每个当前周期内,在每个当前周期内,对于每个存储节点,根据存储节点的总存储空间和剩余存储空间确定存储节点的剩余空间占比,从各个存储节点中确定第一存储节点和第二存储节点,若确定第一存储节点和第二存储节点的剩余空间占比的差值大于预设阈值,则将第一存储节点中的第二数据表以及第二数据表中各数据行的索引迁移至第二存储节点;;
第一存储节点的剩余空间占比为各存储节点的剩余空间占比中的最小值;第二存储节点的剩余空间占比为各存储节点的剩余空间占比中的最大值。
根据本申请实施例的第四方面,提供了一种数据处理装置,应用于分布式数据库节点集群的目标存储节点,目标存储节点存储第一数据表以及第一数据表中每个数据行在各个索引列的索引;装置包括:
第一请求接收模块,用于接收计算节点发送的第一请求,第一请求包括第一数据表中的第一数据行的行标识以及第一操作;第一请求为计算节点基于客户端发送的数据库操作语句生成的;
第一操作执行模块,用于从各个索引列中确定第一操作影响的第一索引列,对第一数据表中的第一数据行以及第一数据行在各个第一索引列的索引进行第一操作。
根据本申请实施例的第五方面,提供了一种数据处理装置,应用于分布式数据库节点集群的计算节点,装置包括:
操作语句接收模块,用于接收客户端发送的数据库操作语句,基于数据库操作语句生成第一请求,第一请求包括第一数据表中第一数据行的行标识以及第一操作;
第一请求发送模块,用于确定第一数据表所在的目标存储节点,向目标存储发送第一请求,以使得目标存储节点从各个索引列中确定第一操作影响的第一索引列,对第一数据表中的第一数据行以及第一数据行在各个第一索引列的索引进行第一操作;
目标存储节点存储第一数据表以及第一数据表中每个数据行在各个索引列的索引。
根据本申请实施例的第六方面,提供了一种数据处理装置,应用于分布式数据库节点集群的管理节点,分布式数据库节点集群中包括多个存储节点;每个存储节点存储至少一个数据表以及各数据表中每个数据行在各个索引列的索引;
装置包括:
心跳消息接收模块,用于周期性接收各个存储节点发送的心跳消息;心跳消息包括相应存储节点的总存储空间和剩余存储空间;
迁移模块,用于对于每个存储节点,根据存储节点的总存储空间和剩余存储空间确定存储节点的剩余空间占比,从各个存储节点中确定第一存储节点和第二存储节点,若确定第一存储节点和第二存储节点的剩余空间占比的差值大于预设阈值,则将第一存储节点中的第二数据表以及第二数据表中各数据行的索引迁移至第二存储节点;
第一存储节点的剩余空间占比为各存储节点的剩余空间占比中的最小值;第二存储节点的剩余空间占比为各存储节点的剩余空间占比中的最大值。
根据本申请实施例的第七方面,提供了一种电子设备,该电子设备包括存储器、处理器及存储在存储器上的计算机程序,处理器执行程序时实现如第一方面、第二方面以及第三方面中任意一方面所提供的方法的步骤。
根据本申请实施例的第八方面,提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如第一方面、第二方面以及第三方面中任意一方面所提供的方法的步骤。
根据本申请实施例的第九方面,提供了一种计算机程序产品,该计算机程序产品包括计算机指令,该计算机指令存储在计算机可读存储介质中,当计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行实现如第一方面、第二方面以及第三方面中任意一方面所提供的方法的步骤。
本申请实施例提供的技术方案带来的有益效果是:
本申请实施例目标存储节点同时存储数据表和数据表的各数据行在各索引列的索引,在接收到计算节点发送的第一操作后,确定被第一操作影响的第一索引列,由存储节点对第一数据表中的第一数据行以及第一数据行在各个第一索引列的列值共同执行第一操作,即实现在一个存储节点内部对数据行和数据行的索引执行第一操作,在一个存储节点对数据行和数据行的索引执行第一操作的执行效率远远高于数据行和索引分布在不同的存储节点上,无需跨网络执行,能够有效降低时延。另外,在同一个存储节点内部解决数据行和索引的一致性问题远比在不同存储节点上解决该问题上要容易很多。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对本申请实施例描述中所需要使用的附图作简单地介绍。
图1为本申请实施例提供的实现数据处理方法的分布式数据库系统的系统架构示意图;
图2为本申请实施例提供的一种数据处理方法的流程示意图;
图3为本申请实施例提供的在分布式数据库节点集群中执行插入操作的示意图;
图4为本申请实施例提供的在分布式数据库节点集群中进行数据查询的流程示意图;
图5为本申请实施例提供的为第一数据表中第三目标列创建索引的流程示意图;
图6为本申请实施例提供的对存储节点进行分区的示意图;
图7为本申请实施例提供的又一种数据处理方法的流程示意图;
图8为本申请实施例提供的另一种数据处理方法的流程示意图;
图9为本申请实施例所提供的一种数据重分布方法的流程示意图;
图10为本申请实施例提供的一种数据处理装置的结构示意图;
图11为本申请实施例提供的又一种数据处理装置的结构示意图;
图12为本申请实施例提供的另一种数据处理装置的结构示意图;
图13为本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
下面结合本申请中的附图描述本申请的实施例。应理解,下面结合附图所阐述的实施方式,是用于解释本申请实施例的技术方案的示例性描述,对本申请实施例的技术方案不构成限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”和“该”也可包括复数形式。应该进一步理解的是,本申请实施例所使用的术语“包括”以及“包含”是指相应特征可以实现为所呈现的特征、信息、数据、步骤、操作、元件和/或组件,但不排除实现为本技术领域所支持其他特征、信息、数据、步骤、操作、元件、组件和/或它们的组合等。应该理解,当我们称一个元件被“连接”或“耦接”到另一元件时,该一个元件可以直接连接或耦接到另一元件,也可以指该一个元件和另一元件通过中间元件建立连接关系。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的术语“和/或”指示该术语所限定的项目中的至少一个,例如“A和/或B”可以实现为“A”,或者实现为“B”,或者实现为“A和B”。
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
首先对本申请涉及的几个名词进行介绍和解释:
分布式数据库(Distributed Data Base)将数据分散存储在多台服务器上,并通过网络连接来实现数据的共享和访问。每台服务器中都可能有数据库管理系统(DatabaseManagement System,DBMS)的一份完整拷贝副本,或者部分拷贝副本,并具有自己局部的数据库,位于不同地点的许多服务器通过网络互相连接,共同组成一个完整的、全局的逻辑上集中、物理上分布的大型数据库。分布式数据库系统可以提供更高的可用性、更高的性能和更好的扩展性。
分布式数据库节点集群是分布式数据库的节点组成的集群,是将原来集中式数据库中的数据分散存储到多个通过网络连接的存储节点上,以获取更大的存储容量和更高的并发访问量。对于基于计算存储分离架构的分布式数据库,分布式数据库节点集群中包括3种节点,分别是:计算节点、存储节点以及管理节点。
计算节点负责处理相应客户端的请求并返回结果,提供计算资源,能够进行一系列的数据计算。
存储节点提供存储资源,可以存储部分数据表,同时还可以存储这些数据表的索引。
管理节点可以根据业务需求和节点集群的负载情况,对计算资源和存储资源独立扩展和管理。
在金融领域,一笔交易会涉及几十条或者几百条SQL语句,对交易时延的要求特别严格,为了降低时延,一般每条SQL语句的where条件字段都会使用索引,通过索引提高执行效率,降低时延。
在关系型数据库中,主要包含两种数据;数据行和数据行对应的索引,假设SQL语句的where条件字段的索引是数据行的主键索引,由于主键索引是建立在主键上是索引,主键是属于数据行本身的数据,那么可以直接根据该主键索引定位待操作的数据行,这种情况下,SQL语句的查询效率非常高。
然而,假设SQL语句的where条件字段的索引不是主键索引,是普通索引,那么需要根据该普通索引定位待操作的数据行的主键,再根据主键定位待操作的数据行,在分布式数据库的场景中,一张数据量较大的数据表往往需要分布在不同的存储节点中,数据行和其对应的索引必然不会在同一个存储节点上,这意味着分布式数据的计算节点需要和存储节点进行至少两次交互,包括与存储索引的存储节点之间的交互以及与存储数据行的存储节点之间的交互,和不同的存储节点进行交互都需要跨网络,会带来较大的时延。
本申请提供的数据处理方法、装置、电子设备、计算机可读存储介质以及计算机程序产品,旨在解决现有技术的如上技术问题。
下面通过对几个示例性实施方式的描述,对本申请实施例的技术方案以及本申请的技术方案产生的技术效果进行说明。需要指出的是,下述实施方式之间可以相互参考、借鉴或结合,对于不同实施方式中相同的术语、相似的特征以及相似的实施步骤等,不再重复描述。
图1为本申请实施例提供的实现数据处理方法的分布式数据库系统的系统架构示意图,可以理解的是,本申请实施例所提供的数据处理方法可以适用于但不限于如图1所示的应用场景中。
如图1所示,包括客户端110和分布式数据库节点集群120,其中,分布式数据库节点集群120包括计算节点121、多个存储节点122以及管理节点123。
客户端110是指与服务器相对应并为用户提供本地服务的程序,用户可以通过客户端对数据表中的数据行进行操作,触发客户端生成数据库语句(sql语句),数据库语句可以为数据库操作语句(insert语句、update语句以及delete语句等),也可以为数据库查询语句(select语句)。客户端110的数量可以为一个,也可以为多个。
当数据库语句为数据库操作语句时,客户端110在获得数据库操作语句后,可以向计算节点121发送该数据库操作语句。
计算节点121在接收到客户端110发送的数据库操作语句后,基于客户端发送的数据库操作语句生成第一请求。第一请求包括第一数据表的表标识、第一数据表中的第一数据行的行标识以及第一操作。
计算节点121可以从管理节点123查找路由信息,路由信息记录了每个存储节点中的数据表的表标识,查找路由信息可以从存储节点122中确定一个目标存储节点122;
计算节点121向目标存储节点122发送该第一请求;
目标存储节点122中存储第一数据表以及第一数据表中每个数据行在各个索引列的索引;
目标存储节点122接收计算节点发送的第一请求后,从各个索引列中确定第一操作影响的第一索引列,对第一数据表中的第一数据行以及第一数据行在各个第一索引列的索引进行第一操作。
当数据库语句为数据库查询语句(select语句)时,客户端110在获得数据库查询语句后,可以向计算节点121发送该数数据库查询语句。
计算节点121可以基于数据库查询语句生成执行计划,执行计划包括用于查询第一数据表中第二数据行的查询条件;向目标存储节点122发送执行计划。
目标存储节点122可以接收计算节点121发送的执行计划,并执行该执行计划以查询第一数据表中第二数据行。
本申请实施例管理节点123除了存储路由信息外,还可以进行数据重分布,具体的,管理节点123可以周期性接收各个存储节点122发送的心跳消息;心跳消息包括相应存储节点的总存储空间和剩余存储空间;
管理节点123在每个当前周期内,对于每个存储节点,根据存储节点的总存储空间和剩余存储空间确定存储节点的剩余空间占比,从各个存储节点中确定第一存储节点和第二存储节点,若确定第一存储节点和第二存储节点的剩余空间占比的差值大于预设阈值,则将第一存储节点中的第二数据表以及第二数据表中各数据行的索引迁移至第二存储节点;
第一存储节点的剩余空间占比为各存储节点的剩余空间占比中的最小值;第二存储节点的剩余空间占比为各存储节点的剩余空间占比中的最大值。
客户端与计算节点之间、计算节点与存储节点之间、存储节点与存储节点、以及计算节点与管理节点之间都是通过网络建立连接,网络可以包括但不限于:有线网络,无线网络。其中,有线网络可以包括局域网、城域网和广域网等,无线网络可以包括蓝牙、Wi-Fi及其他实现无线通信的网络。具体网络也可基于实际应用场景确定,在此不作限定。
本申请实施例中提供了一种数据处理方法,应用于分布式数据库节点集群的目标存储节点,该目标存储节点存储第一数据表以及第一数据表中每个数据行在各个索引列的索引,如图2所示,该方法包括:
步骤S201,接收计算节点发送的第一请求,第一请求包括第一数据表中的第一数据行的行标识以及第一操作;第一请求为计算节点基于客户端发送的数据库操作语句生成的。
本申请实施例分布式数据库节点集群中包括计算节点、存储节点和管理节点,在该实施例中,一种数据处理方法由分布式数据库节点集群中的目标存储节点执行。
本申请实施例计算节点可以接收客户端发送的数据库操作语句,数据库操作语句即sql操作语句,可以是插入(insert)语句、修改(update)语句以及删除(delete)语句中的任意一种。
数据库操作语句用于对第一数据表中的第一数据行进行预设操作(插入、修改和删除),数据库操作语句包括该第一数据表的表标识和第一数据行的行标识。
本申请实施例计算节点在获得数据库操作语句后,将数据库操作语句转换为第一请求,存储节点可以处理该第一请求,该第一请求用于指示对第一数据表中的第一数据行进行第一操作,或对第一数据行和第一数据行的索引进行第一操作。即若第一数据表不存在索引,该第一请求用于对数据行进行操作;若该第一数据表存在索引,该第一请求用于对第一数据行和第一数据行的索引共同进行第一操作,后续实施例在第一数据表包含索引的基础上展开。
本申请实施例分布式数据库节点集群中包括多个存储节点,假设一个数据表中存在索引,则存储节点存储该数据表以及该数据表中每个数据行在各个索引列的索引,即数据表中各数据行的索引的生成和管理由存储该数据表的存储节点进行维护,不再由计算节点进行生成和管理。假设一个数据表中不存在索引,该存储节点仅需存储该数据表中的的各个数据行,不对索引进行维护。一个存储节点可以存储多个数据表和数据表中每个数据行在各个索引列的索引。
索引列指的是建立索引的列,索引建立了索引列的列值和数据行的行标识之间的关联关系。
本申请实施例计算节点在接收到客户端发送的数据库操作语句后,还需从管理节点中获取路由信息,路由信息记录了各存储节点中的数据表的表标识,计算节点可以读取该路由信息,从多个存储节点中确定存储第一数据表的至少一个目标存储节点,并向至少一个目标存储节点分别发送该第一请求。
另外,值得注意的是,若目标存储节点中包括一个第一数据表,那么该第一请求中可以包括第一数据包中第一数据行的行标识以及第一操作,若目标存储节点中除了包括第一数据表之外,还包括其他的数据表,那么该第一请求中还包括第一数据表的表标识。
存储节点中可能包括多个数据表,为方便查找,会为每个表分配一个表标识(也称表ID),用TableID表示。表标识是一个整数,在整个分布式数据库节点集群内唯一。
行标识(也称行ID),用RowID也是一个整数,在数据表内唯一。对于行标识,如果某个数据表有整数型的主键,会使用主键的值当做这一数据行的行标识。
步骤S202,从各个索引列中确定第一操作影响的第一索引列,对第一数据表中的第一数据行以及第一数据行在各个第一索引列的索引进行第一操作。
本申请实施例存储节点在接收到该第一请求后,从各个索引列中确定第一操作影响的第一索引列,具体的,若该第一操作是插入操作或者删除操作,即插入或删除第一数据行,那么数据表中的各个索引列均为第一索引列;若该第一操作是修改操作,则需判断待修改的第一目标列是否属于索引列,若该待修改的第一目标列属于索引列,则确定该第一目标列为第一索引列。
本申请实施例存储节点在确定存在第一索引列后,由存储节点对第一数据表中的第一数据行以及第一数据行在各个第一索引列的列值共同执行第一操作,即实现在一个存储节点内部对数据行和数据行的索引执行第一操作,在一个存储节点对数据行和数据行的索引执行第一操作的执行效率远远高于数据行和索引分布在不同的存储节点上,无需跨网络执行,能够有效降低时延。另外,在同一个存储节点内部解决数据行和索引的一致性问题远比在不同存储节点上解决该问题上要容易很多。
此外,假设各个索引列中不存在被第一操作影响的第一索引列,则目标存储节点直接对第一数据表的第一数据行进行第一操作,不会对各个索引进行操作。
另外,针对数据表不包含索引的情况,存储节点仅需对数据表的数据行进行操作,无需对索引进行操作,后续实施例主要针对存在索引的数据表展开。
本申请实施例中提供了一种可能的实现方式,目标存储节点通过数据行键值对的形式存储第一数据表中的各个数据行,每个数据行键值对的键包括相应数据行的行标识,值为相应数据行中各个列的列值;
目标存储节点通过索引键值对的形式存储每个数据行在各个索引列的索引,每个索引键值对的键包括相应索引列的列标识以及相应数据行在相应索引列的列值,值包括相应数据行的行标识。
在关系型数据库中,主要包括两种数据:数据表中的各数据行和各数据行的各个索引。
本申请实施例目标存储节点通过数据键值对的形式存储第一数据表中的各个数据行,每个数据行键值对的键包括数据表的表标识和相应数据行的行标识,值为相应数据行中各个列的列值,在某一场景中,每个数据行可以按照如下规则编码为(Key,Value)键值对:
Key:tablePrefix{TableID}_recordPrefixSep{RowID},
Value:[col1,col2,col3,col4],
其中,tablePrefix和recordPrefixSep都是特定的字符串常量,用于在Key空间内区分其他数据,TableID表征表标识,RowID表征行标识,coli为数据行在第i列的列值,i=1,2,3......。
本申请实施例目标存储节点通过索引键值对的形式存储每个数据行在各个索引列的索引,每个索引键值对的键包括数据表的表标识、相应索引列的列标识以及相应数据行在相应索引列的列值,值包括相应数据行的行标识。在一场景中,假设该索引为主键索引,每个索引键值对可以按照如下规则编码为(Key,Value)键值对:
Key:tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue,
Value:RowID,
其中,tablePrefix和recordPrefixSep都是特定的字符串常量,用于在Key空间内区分其他数据,TableID表征表标识,indexID表征列标识,RowID表征行标识,indexedColumnsValue表征在主键索引的索引列的列值。
在另一场景中,若索引为不需要满足唯一性约束的普通二级索引,一个索引键值对可能对应多个数据行,需要根据索引键值对范围查询对应的RowID。因此,按照如下规则编码成(Key,Value)键值对:
Key:tablePrefix{TableID}_indexPrefixSep{IndexID}_indexedColumnsValue_{RowID1,RowID2......},
Value:null,
上述索引键值对的键包括表标识、索引列的列标识、索引列的列值以及满足该索引列的列值的各个数据行的行标识,而索引键值对的值为空,为方便理解,可以将该中索引键值对表征为以下形式:
Key:tablePrefix{TableID}_indexPrefixSep{IndexID}_indexedColumnsValue,
Value:RowID1,RowID2......,
在该种形式中,该索引键值对的键包括相应索引列的列标识以及相应数据行在相应索引列的列值,值包括相应数据行的行标识。
本申请实施例在目标存储节点中同时存储数据行对应的数据行键值对,以及数据行的各个索引对应的索引键值对,使得可以在同一个目标存储节点中根据索引键值的键快速定位索引键值对的值,即实现快速定位所需数据行的行标识,进而快速定位数据行,能够有效降低数据操作的时延。
本申请实施例中提供了一种可能的实现方式,若第一操作为插入操作,则第一请求中还包括第一数据行的数据行键值对;
从各个索引列中确定第一操作影响的第一索引列,对第一数据表中的第一数据行以及第一数据行的在各个第一索引列的索引进行第一操作,包括:
将第一数据表的各个索引列作为第一索引列;
对第一数据行的数据行键值对进行解析,得到第一数据行中各个第一索引列的列值,对于每个第一索引列,根据第一数据行中第一索引列的列值生成第一数据行中第一索引列的索引键值对的键,根据第一数据行的行标识生成第一索引列的索引键值对的值;
在目标存储节点中插入第一数据行的数据行键值对以及各个第一索引列的索引键值对。
由于计算节点可以处理客户端发送的数据库操作语句,数据库操作语句包括插入insert语句、修改update语句以及删除delete语句,而存储节点可以处理kv操作,因此需要把数据库操作语句转换为第一请求,第一请求属于kv请求,kv请求中包括kv操作,即第一操作为kv操作。
本申请实施例数据库操作语句为insert语句时,第一请求中的第一操作为插入put操作,此外,第一请求中还包括第一数据行的数据行键值对,这种情况下,第一请求用于对第一数据行的数据行键值对进行插入put操作,此外,若第一数据表中存在至少一个索引列,那么在这种情况下,该至少一个索引列均为第一索引列,还需为第一数据行创建在各个第一索引列的索引,即生成第一数据行在各个第一索引列的索引键值对。
如图3所示,其示例性示出了在分布式数据库节点集群中执行插入操作的示意图,涉及客户端、分布式数据库节点集群中的计算节点以及存储节点之间的交互,假设存储节点包括存储节点1和存储节点2。
客户端向计算节点发送insert语句,该insert语句中包括待插入的第一数据行的行标识、第一数据行所属第一数据表的表标识以及第一数据行各列的列值。
计算节点从管理节点中获取路由信息,路由信息中记录了存储节点中存储的各数据表的表标识,计算节点根据路由信息从多个存储节点(即存储节点1和存储节点2)中选择一个目标存储节点,假设存储节点1中存储有第一数据表,那么存储节点1即为目标存储节点,计算节点还会将insert语句转换为put操作,向存储节点1发送kv请求,该kv请求中包括put操作以及第一数据行的数据行键值对(key,vlaue)。
存储节点1接收到该kv请求后,解析该kv请求中的数据行键值对(key,vlaue),确定第一数据行所属第一数据表的表标识、第一数据行的行标识以及第一数据行中各列的列值;存储节点还可以根据该第一数据表的表标识获取该第一数据表的数据字典信息,该数据字典信息记录该第一数据表中的表信息,表信息包括数据表的表标识、表名、表中所包含的列的列名、列标识、各列的数据类型等,还记录了第一数据表中的索引列(即在那些列中建立了索引),若该第一数据表中存在索引列,那么存储节点1可以根据该第一数据表的数据字典信息可以确定该第一数据表的各个索引列,各个索引列均为被插入操作影响的第一索引列,因此需要再各个第一索引列建立索引,具体的,对于每个第一索引列,可以根据第一数据行中第一索引列的列值生成第一数据行中第一索引列的索引键值对的键,根据第一数据行的行标识生成第一索引列的索引键值对的值,由此可以得到该第一索引列的索引键值对。
存储节点1在获得各个索引键值对后,对第一数据行的数据行键值对和各个索引键值对进行落盘存储,实现数据行和数据行的索引一起落盘。
此外,存储节点1在操作完毕后,还会向计算节点返回执行结果,若插入成功后,则向计算节点返回第一执行结果,该第一执行结果表征插入成功。若插入失败,则向计算节点返回第二执行结果,该第二执行结果表征插入失败。
计算节点1在接收到执行结果后,向客户端转发执行结果。
本申请实施例中提供了一种可能的实现方式,若第一操作为删除操作,则第一请求中还包括第一数据行的数据行键值对的键;
从各个索引列中确定第一操作影响的第一索引列,对第一数据表中的第一数据行以及第一数据行的在各个第一索引列的索引进行第一操作,包括:
根据第一数据行的数据行键值对的键,在本地确定第一数据行的数据行键值对;
将第一数据表的各个索引列作为第一索引列;
从第一数据行的数据行键值对中,确定第一数据行在各个第一索引列的列值;
对于每个第一索引列,根据第一数据行在该第一索引列的列值,在本地确定第一数据行在第一索引列的索引键值对;
在本地删除第一数据行的数据行键值对以及第一数据行在各个第一索引列的索引键值对。
当数据库操作语句为delete操作时,第一操作为kv操作中的删除delete操作时,第一数据表中的各个索引列均为被第一操作影响的第一索引列。
在第一操作为删除操作时,第一请求中包括第一数据行的数据行键值对的键,可根据第一数据行的数据行键值对的键,在目标存储节点本地确定第一数据行的数据行键值对,对该第一数据行键值对进行解析,确定该第一数据行在各个第一索引列的列值,对于每个第一索引列,根据第一数据行在各个第一索引列的列值,在目标存储节点本地确定第一数据行在第一索引列的索引键值对,在本地删除第一数据行的数据行键值对以及第一数据行在各个第一索引列的索引键值对。
本申请实施例中提供了一种可能的实现方式,若第一操作为修改操作,则第一请求中还包括第一数据行的数据行键值对的键、第一数据行中各待修改的第一目标列的列标识以及第一目标列的修改后的列值;
从各个索引列中确定第一操作影响的第一索引列,对第一数据表中的第一数据行以及第一数据行的在各个第一索引列的索引进行第一操作,包括:
根据第一数据行的数据行键值对的键,在本地确定第一数据行的数据行键值对,将第一数据行的数据行键值对更新为新的数据行键值对,新的数据行键值对的值中各第一目标列的列值为相应修改后的列值;记录各第一目标列的修改前的列值;
对于每个第一目标列,若确定第一目标列属于索引列,则将第一目标列作为第一索引列;
对于每个第一索引列,根据第一数据行在该第一索引列的修改前的列值在本地确定第一数据行在第一索引列的索引键值对;将第一数据行在第一索引列的索引键值对更新为新的索引键值对,新的索引键值对的键中第一索引列的列值为修改后的列值;删除第一目标列修改前的值。
若确定第一目标列不属于索引列,则删除第一目标列修改前的值;
当第一操作为修改操作时,该第一请求中还包括第一数据行的数据行键值对的键、第一数据行中各待修改的第一目标列的列标识以及第一目标列的修改后的列值;
目标存储节点可以根据第一数据行的数据行键值对的键,在本地确定第一数据行的数据行键值对,将第一数据行的数据行键值对更新为新的数据行键值对,新的数据行键值对的值中各第一目标列的列值为相应修改后的列值。此时,还需记录各第一目标列的修改前的列值,这是因为目标存储节点中存储的第一数据行在各个索引列的索引键值对是基于索引列修改前的列值生成的,因此,需记录各第一目标列的修改前的列值。
值得注意的是,各待修改的第一目标列不一定都是被第一操作影响的第一索引列,若该第一目标列属于索引列,则确定该第一目标列属于被第一操作影响的第一索引列;若该第一目标列不属于索引列,则该第一目标列不存在索引,也就无需对索引进行操作。
对于每个第一索引列,可以根据第一数据行在该第一索引列的修改前的列值确定该第一数据行在该第一索引列的索引键值对的键,在本地根据该第一索引列的索引键值对的键,确定第一数据行在第一索引列的索引键值对;将第一数据行在第一索引列的索引键值对更新为新的索引键值对,新的索引键值对的键中第一索引列的列值为修改后的列值;并删除第一目标列修改前的值。
本申请实施例中提供了一种可能的实现方式,方法还包括:
接收计算节点发送的执行计划,执行计划包括用于查询第一数据表中第二数据行的查询条件;
若确定查询条件中包括第二数据行的行标识,则根据第二数据行的行标识在本地确定第二数据行的数据行键值对,读取第二数据行的数据行键值对的值作为第二数据行;
若确定查询条件中不包括第二数据行的行标识,则确定第一数据表的各个索引列,若确定查询条件中包括至少一个第二目标列,第二目标列为索引列,则根据第二目标列的列值在本地确定第二数据行在第二目标列的索引键值对;根据第二数据行在第二目标列的索引键值对确定第二数据行的行标识,根据第二数据行的行标识在本地确定第二数据行的数据行键值对,读取第二数据行的数据行键值对的值作为第二数据行;
向计算节点返回查询结果,查询结果包括第二数据行。
如图4所示,其示例性示出了在分布式数据库节点集群中进行数据查询的流程示意图,包括:
S1:客户端向分布式数据库节点集群的计算节点发送针对第一数据表中第二数据行的查询select语句;
S2:计算节点可以接收到该查询语句,对select语句进行词法和语法以进行语句解析,并生成执行计划,执行计划指的是数据库查询语句在数据库中执行时的表现情况,执行计划可以提前预估数据库需要运行多长时间、查询中需要涉及到的数据表和索引。执行计划中包括用于查询第一数据表中第二数据行的查询条件(where条件)、第一数据表的表标识和第二数据行的行标识。
S3:计算节点判断查询条件中是否包括行标识;若是,则执行步骤S4;若否,则执行步骤S5;
S4:若确定确定查询条件中包括第二数据行的行标识,则根据行标识的分布信息确定第二数据行所在的目标存储节点,直接向该第二数据行所在的目标存储节点发送该执行计划;执行S5;
S5:计算节点若确定查询条件中不包括第二数据行的行标识,则根据第二数据表的表标识确定存储该第二数据表的至少一个目标存储节点,向该存储该第二数据表的至少一个目标存储节点发送执行计划;执行S6;
S6:目标存储节点根据第二数据行的行标识在本地确定第二数据行的数据行键值对,读取第二数据行的数据行键值对的值作为第二数据行;执行S10;
S7:目标存储节点若确定查询条件中不包括第二数据行的行标识,则确定第一数据表的各个索引列,判断查询条件中是否包括索引列;若是,则执行步骤S8;若否,则执行步骤S9;
S8:若确定查询条件中包括至少一个第二目标列,第二目标列为索引列,则根据第二目标列的列值在本地确定第二数据行在第二目标列的索引键值对;根据第二数据行在第二目标列的索引键值对确定第二数据行的行标识;执行S6;
S9:目标存储节点若确定查询条件中不包括索引列,则扫描第一数据表中的各个数据行,直至扫描出第二数据行;
S10:目标存储节点在获得第二数据行后,向计算节点返回查询结果,查询结果包括第二数据行。
本申请实施例中提供了一种可能的实现方式,方法还包括:
接收计算节点发送的第二请求;第二请求包括第一数据表中第三目标列的列标识;第二请求用于为第三目标列创建索引;
确定第一数据表中各个数据行的行标识以及各个数据行在第三目标列的列值;
根据第一数据表中各个数据行的行标识、第三目标列的列标识以及各个数据行在第三目标列的列值,生成并存储各个数据行在第三目标列的索引键值对。
如图5所示,其示例性示出了为第一数据表中第三目标列创建索引的流程示意图,包括:S51:客户端向计算节点发送创建索引语句,该创建索引语句用于指示为第一数据表中的第三目标列创建索引;S52:计算节点接收到该创建索引语句后,对该创建索引语句进行词法分析和语法分析,以对该创建索引语句进行解析,并生成语法树;S53:计算节点根据该语法树中第一数据表的表标识确定存储该第一数据表的所有目标存储节点;S54:计算节点生成第二请求,向所有目标存储节点发送该第二请求,该第二请求用于为第一数据表中的第三目标列创建索引。
由于目标存储节点包括多个分区(region),每个分区用于存储第一数据表中各个数据行的数据行键值对或每个数据行的索引键值对,S55:目标存储节点在接收该第二请求后,可以以分区为单位为第一数据表的各个数据行在第三目标列创建索引键值对,具体的,可以确定存储第一数据表的数据行键值对的目标分区,读取该目标分区中的各个数据行键值对,确定各个数据行键值对在该第三目标列的列值,目标存储节点根据第一数据表中各个数据行的行标识、第三目标列的列标识以及各个数据行在第三目标列的列值,生成并存储各个数据行在第三目标列的索引键值对。
本申请实施例中提供了一种可能的实现方式,目标存储节点包括多个分区,每个分区用于存储至少一个数据行键值对或索引键值对;每个分区的至少一个数据行键值对的键或索引键值的键具备相同的前缀;
对第一数据表中的第一数据行以及第一数据行的在各个第一索引列的索引进行第一操作,包括:
将第一数据行的数据行键值的键和各个分区的至少一个索引键值对的键进行匹配,从多个分区中确定第一目标分区;第一数据行的数据行键值对的键和第一目标分区中至少一个数据行键值对的键具备相同的前缀;
在第一目标分区中对第一数据行对应的数据行键值对进行第一操作;
对于每个第一索引列,将第一数据行在第一索引列的索引键值对的键和各个分区的至少一个索引键值对的键进行匹配,从多个分区中确定第二目标分区;第一数据行在第一索引列的索引键值对的键和第二目标分区中至少一索引键值对的键具备相同的前缀;
在第二目标分区中对第一数据行在第一索引列对应的索引键值对进行第一操作。
对于基于计算存储分离架构的分布式数据库,存储层采用键值对的形式进行分布式存储。数据可以看做是一个巨大的有序的KV Map,对于每个存储节点,可以将该存储节点按照键值对的键进行分区,一个存储节点中包括多个分区,每个分区中的键值对的键是连续的,每个分区可以用[StartKey,EndKey)这样一个左闭右开区间来描述,每个Region中保存的数据量默认维持在96MiB左右(可以通过配置修改),StartKey表示该分区的第一个键值对,EndKey表示该分区的最后一个键值对。
如图6所示,其示例性示出了对存储节点进行分区的示意图,该存储节点中包括2分区,分别是分区1和分区2,每个分区用于存储键值对(key,value),该键值对可以是数据行键值对,也可以是索引键值对,分区1中包括(key1,value1)、(key2,value2)、(key3,value3)和(key4,value4),那么key1即为分区1的StartKey,key4即为分区1的EndKey;分区2中包括(key5,value5)、(key6,value6)、(key7,value7)和(key8,value8),那么key5即为分区1的StartKey,key8即为分区1的EndKey;。
前述实施例已经说明了对数据行键值对和索引键值对进行编码的方式,对数据行键值对而言,该数据行键值对包括该数据行所属数据表的表标识,一个数据表中各个数据行是相同的表标识,那么该数据表中各个数据行有相同的Key前缀,延续前述实施例,数据行键值对的键是“tablePrefix{TableID}_recordPrefixSep{RowID}”,RowID是可变的,而“tablePrefix{TableID}_recordPrefixSep”是不可变的,因此,数据行键值对的前缀可以是“tablePrefix{TableID}_recordPrefixSep”。
对于索引键值对而言,索引键值对的键包括数据表的表标识、相应索引列的列标识以及相应数据行在相应索引列的列值,数据行的键值对是tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue,“indexedColumnsValue”是可变的,而“tablePrefix{tableID}_indexPrefixSep{indexID}”是不可变的,因此,数据行键值对的前缀可以是“tablePrefix{tableID}_indexPrefixSep{indexID}”。
这样具有相同的前缀的数据行键值对或索引键值对,在存储节点的Key空间内,是排列在一起的。采用上述方式编码后,一个表的所有数据行键值对会按照RowID顺序地排列在Key空间中,索引键值对也会按照具体的的值顺序地排列在Key空间。
本申请实施例对第一数据表中的第一数据行以及第一数据行在各个第一索引列的索引进行第一操作,其实是第一数据行的索引键值对所在的第一目标分区对第一数据行的数据行键值对进行第一操作,在各个索引键值对所在的第二分区对各个索引键值对进行第一操作。
具体的,可以将第一数据行的数据行键值的键和各个分区的至少一个索引键值对的键进行匹配,从多个分区中确定第一目标分区;第一数据行的数据行键值对的键和第一目标分区中至少一个数据行键值对的键具备相同的前缀;在第一目标分区中对第一数据行对应的数据行键值对进行第一操作。
对于每个第一索引列,将第一数据行在第一索引列的索引键值对的键和各个分区的至少一个索引键值对的键进行匹配,从多个分区中确定第二目标分区;第一数据行在第一索引列的索引键值对的键和第二目标分区中至少一索引键值对的键具备相同的前缀;在第二目标分区中对第一数据行在第一索引列对应的索引键值对进行第一操作。
本申请实施例中提供了又一种数据处理方法,应用于分布式数据库节点集群的计算节点,如图7所示,该方法包括:
步骤S701,接收客户端发送的数据库操作语句,基于数据库操作语句生成第一请求,第一请求包括第一数据表中第一数据行的行标识以及第一操作。
步骤S702,确定第一数据表所在的目标存储节点,向目标存储发送第一请求,以使得目标存储节点从各个索引列中确定第一操作影响的第一索引列,对第一数据表中的第一数据行以及第一数据行在各个第一索引列的索引进行第一操作;
目标存储节点存储第一数据表以及第一数据表中每个数据行在各个索引列的索引。
本申请实施例计算节点可以接收客户端发送的数据库操作语句,数据库操作语句即sql操作语句,数据库操作语句可以是插入(insert)语句、修改(update)语句以及删除(delete)语句中的任意一种。
数据库操作语句用于对第一数据表中的第一数据行进行预设操作(插入、修改和删除),数据库操作语句包括该第一数据表的表标识和第一数据行的行标识。
本申请实施例计算节点在获得数据库操作语句后,将数据库操作语句转换为第一请求,存储节点可以处理该第一请求,该第一请求用于指示对第一数据表中的第一数据行进行第一操作。
本申请实施例计算节点在接收到客户端发送的数据库操作数据后,还需从管理节点中获取路由信息,路由信息记录了各存储节点中的数据表的表标识,计算节点可以读取该路由信息,从多个存储节点中确定存储第一数据表的至少一个目标存储节点,并向至少一个目标存储节点分别发送该第一请求。
另外,值得注意的是,若目标存储节点中包括一个第一数据表,那么该第一请求中可以包括第一数据包中第一数据行的行标识以及第一操作,若目标存储节点中除了包括第一数据表之外,还包括其他的数据表,那么该第一请求中还包括第一数据表的表标识。
本申请实施例存储节点在接收到该第一请求后,从各个索引列中确定第一操作影响的第一索引列,具体的,若该第一操作是插入操作或者删除操作,即插入或删除第一数据行,那么数据表中的各个索引列均为第一索引列;若该第一操作是修改操作,则需判断待修改的目标列是否属于索引列,若该待修改的目标列属于索引列,则该目标列为第一索引列。
本申请实施例存储节点在确定存在第一索引列后,由存储节点对第一数据表中的第一数据行以及第一数据行在各个第一索引列的列值共同执行第一操作,即实现在一个存储节点内部对数据行和数据行的索引执行第一操作,在一个存储节点对数据行和数据行的索引执行第一操作的执行效率远远高于数据行和索引分布在不同的存储节点上,能够有效降低时延。另外,在同一个存储节点内部解决数据行和索引的一致性问题远比在不同存储节点上解决该问题上要容易很多。
本申请实施例中提供了一种可能的实现方式,接收客户端发送的数据库查询语句,基于数据库查询语句生成执行计划,执行计划包括用于查询第一数据表中第二数据行的查询条件;
向目标存储节点发送执行计划。
当客户端发起针对第一数据表中第二数据行的查询select语句时,分布式数据库节点集群的计算节点可以接收到该查询语句,解析Select语句进行词法和语法解析,并生成执行计划,执行计划指的是数据库查询语句在数据库中执行时的表现情况,执行计划可以提前预估数据库需要运行多长时间、查询中需要涉及到的数据表和索引。执行计划中包括用于查询第一数据表中第二数据行的查询条件(where条件)、第一数据表的表标识和第二数据行的行标识。
计算节点判断查询条件中是否包括行标识;若确定确定查询条件中包括第二数据行的行标识,则根据行标识的分布信息确定第二数据行所在的目标存储节点,直接向该目标存储节点发送该执行计划;计算节点若确定查询条件中不包括第二数据行的行标识,则根据第二数据表的表标识确定存储该第二数据表的至少一个目标存储节点,将该执行计划发送至该至少一个目标存储节点。
目标存储节点在执行完毕后可以返回查询结果,该查询结果中包括该第二数据行。
详细过程见图4的实施例,本申请实施例在此不再进行赘述。
本申请实施例中提供了一种可能的实现方式,确定第一数据表所在的目标存储节点,包括:
从管理节点中获取各节点的路由信息,路由信息中记录每个存储节点所包含的数据表的表标识;
从路由信息中确定第一数据表所在的目标存储节点。
前述实施例已经说明书路由信息中记录每个存储节点所包含的数据表的表标识,计算节点可以查找路由信息以确定第一数据表所在的目标存储节点,在此不再进行赘述。
本申请实施例中提供了另一种数据处理方法,如图8所示,应用于分布式数据库节点集群的管理节点,分布式数据库节点集群中包括多个存储节点;每个存储节点存储至少一个数据表以及各数据表中每个数据行在各个索引列的索引;
该方法包括:
步骤S801,周期性接收各个存储节点发送的心跳消息;心跳消息包括相应存储节点的总存储空间和剩余存储空间;
步骤S802,在每个当前周期内,对于每个存储节点,根据存储节点的总存储空间和剩余存储空间确定存储节点的剩余空间占比,从各个存储节点中确定第一存储节点和第二存储节点,若确定第一存储节点和第二存储节点的剩余空间占比的差值大于预设阈值,则将第一存储节点中的第二数据表以及第二数据表中各数据行的索引迁移至第二存储节点;
第一存储节点的剩余空间占比为各存储节点的剩余空间占比中的最小值;第二存储节点的剩余空间占比为各存储节点的剩余空间占比中的最大值。
本申请实施例还支持对存储节点中存储的数据进行重分布,具体的,可以由管理节点进行数据重分布,管理节点可以周期性接收各个存储节点发送的心跳消息;心跳消息包括相应存储节点的总存储空间和剩余存储空间;此外,心跳消息还可以包括region个数、各region大小以及已占用存储空间等等。
管理节点在每个周期内,可以判断各个存储节点中的数据是否是均匀分布的,具体的,可以根据存储节点的总存储空间和剩余存储空间确定存储节点的剩余空间占比,即剩余空间占比=剩余存储空间/总存储空间,根据剩余空间占比来判断数据是否分布均匀。
通常情况下,各存储节点的总存储空间是相近的,分布式数据库节点集群追求并发性,希望各存储节点中的数据能够均匀分布,使得各存储节点尽可能相对均衡地被访问,在确定各个存储节点的剩余空间占比后,可以从各个存储节点中确定一个第一存储节点和一个第二存储节点,第一存储节点的剩余空间占比为各存储节点的剩余空间占比中的最小值;第二存储节点的剩余空间占比为各存储节点的剩余空间占比中的最大值,若确定第一存储节点和第二存储节点的剩余空间占比的差值大于预设阈值,则说明各存储节点中的数据分布不均衡,需要对数据进行重分布,即将剩余存储空间较小的第一存储节点中的数据迁移至剩余存储空间充足的第二存储节点,使得在进行重分布之后,数据能够相对均匀地分布在各个存储节点上;若确定第一存储节点和第二存储节点的剩余空间占比的差值不大于预设阈值,则说明各存储节点的数据分布是相对均匀的,这种情况下,无需对数据进行重分布。
本申请实施例在确定各数据存储节点中的数据分布不均匀时,可以将第一存储节点中的第二数据表以及第二数据表中各数据行的索引迁移至第二存储节点以进行数据重分布,一方面使得数据能够相对均匀分布在各个存储节点上,另一方面可以保证数据表中数据行的各个索引随着数据表的迁移而被一起迁移,使得数据表和数据表的索引位于相同的存储节点上,使得后续在对数据表和数据表中的索引进行操作时,只需在一个存储节点上对数据表和数据表的索引进行操作,无需跨多个存储节点,无需跨网络,能够有效降低时延。
本申请实施例中提供了一种可能的实现方式,每个存储节点包括多个分区;每个分区用于存储至少一个数据行键值对或索引键值对;每个分区的至少一个数据行键值对的键或索引键值的键具备相同的前缀;
将第一存储节点中的第二数据表以及第二数据表中各数据行的索引迁移至第二存储节点,包括:
从第一存储节点中确定待迁移的第一分区,第一分区为记录第二数据表中各个数据行的数据行键值对的分区;在第二存储节点中新增一个第二分区;将第一分区中的数据行键值对迁移至第二分区;
在第二存储节点新增一个第三分区,指示第二存储节点根据第二数据表的各个索引列以及第二分区中各个索引列的列值,在第三分区中为第二数据表的各个数据行生成在各个索引列的索引键值对。
本申请实施例以分区为分为单位迁移数据表,实现对数据进行重分布,具体的,可以从第一存储节点中确定待迁移的第一分区,第一分区为记录各第二数据表的各个数据行的数据行键值对的分区,可以在第二存储节点中新增一个第二分区,具体的,可以向第二存储节点发送第一指令,该第一指令用于指示第二存储节点在自身创建第二分区;在创建第二分区后,可以将第一分区中的数据行键值对迁移至第二分区。
此外,还可以对第一存储节点中第二数据表中各个数据行在各个索引列的索引进行迁移,然而,倘若一起迁移数据行和数据行的索引,则为保持二者的一致性,会带来较高的复杂度,本申请实施例在迁移完第二数据表,或者在迁移第二数据表的过程中,可以指示第二存储节点根据第二数据表的各个索引列以及第二分区中各个索引列的列值,在自身创建一个第三分区,在第三分区中为第二数据表的各个数据行生成在各个索引列的索引键值对,从而使得第二存储节点中即包括第二数据表中的各个数据行,还包括第二表中各个第二数据行在各个索引列的索引,使得二者可以保持一致性,同时还降低了迁移索引的复杂度。
本申请实施例中提供了一种可能的实现方式,将将第一分区中的数据行键值对对迁移至第二分区,包括:
确定第一分区所属的第一副本同步群组;第一副本同步群组中包含至少三个分区,且至少三个分区属于不同的存储节点;第一副本同步群组中的各个分区所包含的数据行键值是相同的;第一副本同步群组中的至少三个分区中存在一个主分区;
将第二分区添加至第一副本同步群组,确定第一副本同步群组中的主分区,将第一副本同步群组中的主分区中第二数据表中各个数据行的数据行键值对同步至第二分区,删除第一分区。
具体的,在对分区进行迁移时,需确定分区所在的副本同步群组(Raft group),副本同步群组中包括至少三个分区,且至少三个分区属于不同的存储节点,副本同步群组中包括主分区(leader)和从分区(follower),遵循副本同步(raft)算法,在副本同步群组中,对数据的写入和删除都在主分区leader,然后主分区leader将自身的写入和删除同步给从分区follower。副本同步群组中的分区的数量通常为奇数,对于一个写入操作或者删除操作而言,当副本同步群组中超过一半数量(通常为分区数/2+1)的分区执行完毕写入操作或删除操作后,那么可认为对该副本同步群组执行的写入操作或删除操作时成功的。
本申请实施例在将第一分区中的各个数据行键值对进行迁移时,需确定第一分区所在的第一副本同步集群,将第二分区添加至第一副本同步群组,需确定第一副本同步集群的主分区,将第一副本同步群组中的主分区中第二数据表中各个数据行的数据行键值对同步至第二分区,并删除第一分区。
具体的,可以确定第一副本同步集群的主分区所在的第三存储节点,确定第三存储节点的节点标识以及第一副本同步集群的主分区的分区标识,向第二存储节点发送同步指令,该同步指令包括第三存储节点的节点标识以及第一副本同步集群的主分区的分区标识,该同步指令用于指示第二存储节点同步第三存储节点中所包含的第一副本同步集群的主分区中的数据行键值对。
本申请实施例中提供了一种可能的实现方式,删除第一分区,包括:
若确定第一分区不为第一副本同步群组中的主分区,则删除第一分区;
若确定第一分区为第一副本同步群组中的主分区,则从第一副本同步群组中选择一个新的主分区,新的主分区不为第一分区;删除第一分区。
本申请实施例在对第一分区进行删除时,需确定第一分区是否为第一副本同步群组中的主分区,若确定第一分区不为第一副本同步群组中的主分区,则说明该第一分区不影响述第一副本同步群组的高可用性,可直接删除第一分区,管理节点可以向第一存储节点发送第一删除指令,该第一删除指令用于删除该第一分区;若确定第一分区为第一副本同步群组中的主分区,为避免删除第一分区影响第一副本同步群组的高可用性,通过raft算法发起选举,从第一副本同步群组中选择一个新的主分区,新的主分区不为第一分区,删除第一分区,即在从第一副本同步群组中选择一个新的主分区后,管理节点以向第一存储节点发送第一删除指令。
此外,在第二存储节点中为第二数据表中各个数据行创建完毕相应的索引(或索引键值对)后,还需删除在第一存储节点中第二数据表中的索引(或索引键值对),可确定第二数据表中各个数据行的索引键值对所在的第四分区,删除该第四分区,同删除第一分区一样,需确定该第四分区所在的第二副本同步群组,第二副本同步群组中包括多个分区,该第二副本同步群组的多个分区和第一副本同步群组的多个分区所在的存储节点是一样的,将第三分区添加至该第二副本同步群组,若确定第四分区不为该第二副本同步群组的主分区,则直接删除该第四分区,若确定该第四分区为该第二副本同步群组的主分区,则发起选举,从第二副本同步群组中选择一个新的主分区,新的主分区不为第四分区,删除第四分区。
如图9所示,其示例性示出了本申请实施例所提供的一种数据重分布方法的流程示意图,涉及分布式数据库节点集群的管理节点和多个存储节点,多个存储节点分别是存储节点1和存储节点2,其中存储节点1为第一存储节点,存储节点中包括待迁移的region1(第一分区),存储节点2为第二存储节点,管理节点发起针对存储节点2的region调度任务,指示存储节点2新增一个region2(第二分区),管理节点将region2添加至region1所在的raft group(第一副本同步群组),确定raft group中的leader,指示存储节点2同步leader中的数据行键值对于region2,并为region2中的各数据行创建索引,可以在region3(第三分区)中创建索引。
此外,管理节点还会发起针对存储节点1的region调度任务,指示存储节点1将region1从raft group中删除,若region1为raft group的leader,则将region1降级为follower;若region1不为raft group的leader,则直接删除该region1。存储节点1在删除Region1的数据行键值对的同时需要存储把对应的索引或索引键值对一起删除。
本申请实施例提供了一种数据处理装置,如图10所示,应用于分布式数据库节点集群的目标存储节点,目标存储节点存储第一数据表以及第一数据表中每个数据行在各个索引列的索引,该数据处理装置1000可以包括:
第一请求接收模块1001,用于接收计算节点发送的第一请求,第一请求包括第一数据表中的第一数据行的行标识以及第一操作;第一请求为计算节点基于客户端发送的数据库操作语句生成的;
第一操作执行模块1002,用于从各个索引列中确定第一操作影响的第一索引列,对第一数据表中的第一数据行以及第一数据行在各个第一索引列的索引进行第一操作。
本申请实施例中提供了一种可能的实现方式,目标存储节点通过数据行键值对的形式存储第一数据表中的各个数据行,每个数据行键值对的键包括相应数据行的行标识,值为相应数据行中各个列的列值;
目标存储节点通过索引键值对的形式存储每个数据行在各个索引列的索引,每个索引键值对的键包括相应索引列的列标识以及相应数据行在相应索引列的列值,值为相应数据行的行标识。
本申请实施例中提供了一种可能的实现方式,若第一操作为插入操作,则第一请求中还包括第一数据行的数据行键值对;
第一操作执行模块包括:
插入子模块,用于将第一数据表的各个索引列作为第一索引列;对第一数据行的数据行键值对进行解析,得到第一数据行在各个第一索引列的列值,对于每个第一索引列,根据第一数据行在第一索引列的列值生成第一数据行中第一索引列的索引键值对的键,根据第一数据行的行标识生成第一索引列的索引键值对的值;在目标存储节点中插入第一数据行的数据行键值对以及各个第一索引列的索引键值对。
本申请实施例中提供了一种可能的实现方式,若第一操作为修改操作,则第一请求中还包括第一数据行的数据行键值对的键、第一数据行中各待修改的第一目标列的列标识以及第一目标列的修改后的列值;
第一操作执行模块包括:
修改子模块,用于根据第一数据行的数据行键值对的键,在本地确定第一数据行的数据行键值对,将第一数据行的数据行键值对更新为新的数据行键值对,新的数据行键值对的值中各第一目标列的列值为相应修改后的列值;记录各第一目标列的修改前的列值;对于每个第一目标列,若确定第一目标列属于索引列,则将第一目标列作为第一索引列;对于每个第一索引列,根据第一数据行在第一索引列的修改前的列值在本地确定第一数据行在第一索引列的索引键值对;将第一数据行在第一索引列的索引键值对更新为新的索引键值对,新的索引键值对的键中第一索引列的列值为修改后的列值;删除第一目标列修改前的值。
本申请实施例中提供了一种可能的实现方式,若第一操作为删除操作,则第一请求中还包括第一数据行的数据行键值对的键;
第一操作执行模块包括:
删除子模块,用于根据第一数据行的数据行键值对的键,在本地确定第一数据行的数据行键值对;将第一数据表的各个索引列作为第一索引列;从第一数据行的数据行键值对中,确定第一数据行在各个第一索引列的列值;对于每个第一索引列,根据第一数据行在第一索引列的列值,在本地确定第一数据行在第一索引列的索引键值对;在本地删除第一数据行的数据行键值对以及第一数据行在各个第一索引列的索引键值对。
本申请实施例中提供了一种可能的实现方式,该数据处理装置1000还包括:
执行计划接受模块,用于接收计算节点发送的执行计划,执行计划包括用于查询第一数据表中第二数据行的查询条件;
查询模块,用于若确定查询条件中包括第二数据行的行标识,则根据第二数据行的行标识在本地确定第二数据行的数据行键值对,读取第二数据行的数据行键值对的值作为第二数据行;若确定查询条件中不包括第二数据行的行标识,则确定第一数据表的各个索引列,若确定查询条件中包括至少一个第二目标列,第二目标列为索引列,则根据第二目标列的列值在本地确定第二数据行在第二目标列的索引键值对;根据第二数据行在第二目标列的索引键值对确定第二数据行的行标识,根据第二数据行的行标识在本地确定第二数据行的数据行键值对,读取第二数据行的数据行键值对的值作为第二数据行;
查询结果返回模块,用于向计算节点返回查询结果,查询结果包括第二数据行。
本申请实施例中提供了一种可能的实现方式,该数据处理装置1000还包括:
第二请求接收模块,用于节后接收计算节点发送的第二请求;第二请求包括第一数据表中第三目标列的列标识;第二请求用于为第三目标列创建索引;
列值确定模块,用于确定第一数据表中各个数据行的行标识以及各个数据行在第三目标列的列值;
索引键值对生成模块,用于根据第一数据表中各个数据行的行标识、第三目标列的列标识以及各个数据行在第三目标列的列值,生成并存储各个数据行在第三目标列的索引键值对。
本申请实施例提供了一种数据处理装置,如图11所示,应用于分布式数据库节点集群的计算节点,数据处理装置1100包括:
操作语句接收模块1101,用于接收客户端发送的数据库操作语句,基于数据库操作语句生成第一请求,第一请求包括第一数据表中第一数据行的行标识以及第一操作;
第一请求发送模块1102,用于确定第一数据表所在的目标存储节点,向目标存储发送第一请求,以使得目标存储节点从各个索引列中确定第一操作影响的第一索引列,对第一数据表中的第一数据行以及第一数据行在各个第一索引列的索引进行第一操作;
目标存储节点存储第一数据表以及第一数据表中每个数据行在各个索引列的索引。
本申请实施例中提供了一种可能的实现方式,数据处理装置1100还包括:
查询语句接收模块,用于接收客户端发送的数据库查询语句,基于数据库查询语句生成执行计划,执行计划包括用于查询第一数据表中第二数据行的查询条件;
执行计划发送模块,用于向目标存储节点发送执行计划。
本申请实施例中提供了一种可能的实现方式,第一请求发送模块包括:
路由信息确定子模块,用于从管理节点中获取各节点的路由信息,路由信息中记录每个存储节点所包含的数据表的表标识;
目标存储节点确定子模块,用于从路由信息中确定第一数据表所在的目标存储节点。
本申请实施例提供了一种数据处理装置,如图12所示,应用于分布式数据库节点集群的管理节点,分布式数据库节点集群中包括多个存储节点;每个存储节点存储至少一个数据表以及各数据表中每个数据行在各个索引列的索引;
该数据处理装置1200包括:
心跳消息接收模块1201,用于周期性接收各个存储节点发送的心跳消息;心跳消息包括相应存储节点的总存储空间和剩余存储空间;
迁移模块1202,用于在每个当前周期内,对于每个存储节点,根据存储节点的总存储空间和剩余存储空间确定存储节点的剩余空间占比,从各个存储节点中确定第一存储节点和第二存储节点,若确定第一存储节点和第二存储节点的剩余空间占比的差值大于预设阈值,则将第一存储节点中的第二数据表以及第二数据表中各数据行的索引迁移至第二存储节点;
第一存储节点的剩余空间占比为各存储节点的剩余空间占比中的最小值;第二存储节点的剩余空间占比为各存储节点的剩余空间占比中的最大值。
本申请实施例中提供了一种可能的实现方式,每个存储节点包括多个分区;每个分区用于存储至少一个数据行键值对或索引键值对;每个分区的至少一个数据行键值对的键或索引键值的键具备相同的前缀;
迁移模块包括:
迁移子模块,用于从第一存储节点中确定待迁移的第一分区,第一分区为记录第二数据表中各个数据行的数据行键值对的分区;在第二存储节点中新增一个第二分区;将第一分区中的数据行键值对迁移至第二分区;
索引创建子模块,用于在第二存储节点新增一个第三分区,指示第二存储节点根据第二数据表的各个索引列以及第二分区中各个索引列的列值,在第三分区中为第二数据表的各个数据行生成在各个索引列的索引键值对。
本申请实施例中提供了一种可能的实现方式,迁移子模块包括:
第一副本同步群确定子模块,用于确定第一分区所属的第一副本同步群组;第一副本同步群组中包含至少三个分区,且至少三个分区属于不同的存储节点;第一副本同步群组中的各个分区所包含的数据行键值是相同的;第一副本同步群组中的至少三个分区中存在一个主分区;
同步子模块,用于将第二分区添加至第一副本同步群组,确定第一副本同步群组中的主分区,将第一副本同步群组中的主分区中第二数据表中各个数据行的数据行键值对同步至第二分区,删除第一分区。
本申请实施例中提供了一种可能的实现方式,同步子模块包括:
删除单元,用于若确定第一分区不为第一副本同步群组中的主分区,则删除第一分区;若确定第一分区为第一副本同步群组中的主分区,则从第一副本同步群组中选择一个新的主分区,新的主分区不为第一分区,删除第一分区。
本申请实施例的装置可执行本申请实施例所提供的方法,其实现原理相类似,本申请各实施例的装置中的各模块所执行的动作是与本申请各实施例的方法中的步骤相对应的,对于装置的各模块的详细功能描述具体可以参见前文中所示的对应方法中的描述,此处不再赘述。
本申请实施例中,术语“模块”或“单元”是指有预定功能的计算机程序或计算机程序的一部分,并与其他相关部分一起工作以实现预定目标,并且可以通过使用软件、硬件(如处理电路或存储器)或其组合来全部或部分实现。同样的,一个处理器(或多个处理器或存储器)可以用来实现一个或多个模块或单元。此外,每个模块或单元都可以是包含该模块或单元功能的整体模块或单元的一部分。
本申请实施例中提供了一种电子设备(计算机装置/设备/系统),包括存储器、处理器及存储在存储器上的计算机程序,该处理器执行上述计算机程序以实现数据处理方法的步骤,与相关技术相比可实现:本申请实施例目标存储节点同时存储数据表和数据表的各数据行在各索引列的索引,在接收到计算节点发送的第一操作后,确定被第一操作影响的第一索引列,由存储节点对第一数据表中的第一数据行以及第一数据行在各个第一索引列的列值共同执行第一操作,即实现在一个存储节点内部对数据行和数据行的索引执行第一操作,在一个存储节点对数据行和数据行的索引执行第一操作的执行效率远远高于数据行和索引分布在不同的存储节点上,无需跨网络执行,能够有效降低时延。另外,在同一个存储节点内部解决数据行和索引的一致性问题远比在不同存储节点上解决该问题上要容易很多。
在一个可选实施例中提供了一种电子设备,如图13所示,图13所示的电子设备4000包括:处理器4001和存储器4003。其中,处理器4001和存储器4003相连,如通过总线4002相连。可选地,电子设备4000还可以包括收发器4004,收发器4004可以用于该电子设备与其他电子设备之间的数据交互,如数据的发送和/或数据的接收等。需要说明的是,实际应用中收发器4004不限于一个,该电子设备4000的结构并不构成对本申请实施例的限定。
处理器4001可以是CPU(CentralProcessingUnit,中央处理器),通用处理器,DSP(DigitalSignalProcessor,数据信号处理器),ASIC(ApplicationSpecificIntegratedCircuit,专用集成电路),FPGA(FieldProgrammableGateArray,现场可编程门阵列)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本申请公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器4001也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,DSP和微处理器的组合等。
总线4002可包括一通路,在上述组件之间传送信息。总线4002可以是PCI(PeripheralComponentInterconnect,外设部件互连标准)总线或EISA(ExtendedIndustryStandardArchitecture,扩展工业标准结构)总线等。总线4002可以分为地址总线、数据总线、控制总线等。为便于表示,图13中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
存储器4003可以是ROM(ReadOnlyMemory,只读存储器)或可存储静态信息和指令的其他类型的静态存储设备,RAM(RandomAccessMemory,随机存取存储器)或者可存储信息和指令的其他类型的动态存储设备,也可以是EEPROM(ElectricallyErasableProgrammableReadOnlyMemory,电可擦可编程只读存储器)、CD-ROM(CompactDiscReadOnlyMemory,只读光盘)或其他光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质、其他磁存储设备、或者能够用于携带或存储计算机程序并能够由计算机读取的任何其他介质,在此不做限定。
存储器4003用于存储执行本申请实施例的计算机程序,并由处理器4001来控制执行。处理器4001用于执行存储器4003中存储的计算机程序,以实现前述方法实施例所示的步骤。
其中,电子设备包可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、PDA(个人数字助理)、PAD(平板电脑)、PMP(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字TV、台式计算机等等的固定终端。图13所示的电子设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
本申请实施例提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时可实现前述方法实施例的步骤及相应内容。与现有技术相比可实现:本申请实施例目标存储节点同时存储数据表和数据表的各数据行在各索引列的索引,在接收到计算节点发送的第一操作后,确定被第一操作影响的第一索引列,由存储节点对第一数据表中的第一数据行以及第一数据行在各个第一索引列的列值共同执行第一操作,即实现在一个存储节点内部对数据行和数据行的索引执行第一操作,在一个存储节点对数据行和数据行的索引执行第一操作的执行效率远远高于数据行和索引分布在不同的存储节点上,无需跨网络执行,能够有效降低时延。另外,在同一个存储节点内部解决数据行和索引的一致性问题远比在不同存储节点上解决该问题上要容易很多。
需要说明的是,本公开上述的计算机可读介质可以是计算机可读信号介质或者计算机可读介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、RF(射频)等等,或者上述的任意合适的组合。
本申请实施例还提供了一种计算机程序产品,包括计算机程序,计算机程序被处理器执行时可实现前述方法实施例的步骤及相应内容。与现有技术相比可实现:本申请实施例目标存储节点同时存储数据表和数据表的各数据行在各索引列的索引,在接收到计算节点发送的第一操作后,确定被第一操作影响的第一索引列,由存储节点对第一数据表中的第一数据行以及第一数据行在各个第一索引列的列值共同执行第一操作,即实现在一个存储节点内部对数据行和数据行的索引执行第一操作,在一个存储节点对数据行和数据行的索引执行第一操作的执行效率远远高于数据行和索引分布在不同的存储节点上,无需跨网络执行,能够有效降低时延。另外,在同一个存储节点内部解决数据行和索引的一致性问题远比在不同存储节点上解决该问题上要容易很多。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”、“1”、“2”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除图示或文字描述以外的顺序实施。
应该理解的是,虽然本申请实施例的流程图中通过箭头指示各个操作步骤,但是这些步骤的实施顺序并不受限于箭头所指示的顺序。除非本文中有明确的说明,否则在本申请实施例的一些实施场景中,各流程图中的实施步骤可以按照需求以其他的顺序执行。此外,各流程图中的部分或全部步骤基于实际的实施场景,可以包括多个子步骤或者多个阶段。这些子步骤或者阶段中的部分或全部可以在同一时刻被执行,这些子步骤或者阶段中的每个子步骤或者阶段也可以分别在不同的时刻被执行。在执行时刻不同的场景下,这些子步骤或者阶段的执行顺序可以根据需求灵活配置,本申请实施例对此不限制。
以上仅是本申请部分实施场景的可选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请的方案技术构思的前提下,采用基于本申请技术思想的其他类似实施手段,同样属于本申请实施例的保护范畴。
- 一种功率因数调整电路及使用其的高压集成电路
- 一种功率因数调整电路及使用其的高压集成电路