掌桥专利:专业的专利平台
掌桥专利
首页

数据库集群的扩容方法和装置、电子设备和存储介质

文献发布时间:2023-06-19 11:39:06


数据库集群的扩容方法和装置、电子设备和存储介质

技术领域

本申请涉及数据处理领域,尤其涉及一种数据库集群的扩容方法和装置、电子设备和存储介质。

背景技术

分布式数据库系统可以通过集群为用户提供如业务数据存储等服务。随着业务的发展,数据库系统需要存储的数据越来越多,由于集群的存储空间是有限的,在数据存储到一定程度时,需要通过增加集群中的机器使集群能够存储更多的数据,以保障服务能够正常的进行。

目前,一般采用数据重分布的方式进行分布式数据库扩容,该方式会把所有的数据都读取一遍,然后按照既定的拆分策略,重新读取并再次插入到集群中。上述数据重分布的方式会使原本不需要迁移的数据,同样再经过一次读取插入的流程,占用了较多的网络资源和机器资源。

因此,相关技术中的数据库扩容方式,存在对网络资源和机器资源占用量大的问题。

发明内容

本申请提供了一种数据库集群的扩容方法和装置、电子设备和存储介质,以至少解决相关技术中的数据库扩容方式存在的对网络资源和机器资源占用量大的问题。

根据本申请实施例的一个方面,提供了一种数据库集群的扩容方法,包括:使用第一节点对目标数据库集群扩容,其中,所述目标数据库集群包含至少一个第二节点;从多个子表中选取出待迁移到所述第一节点中的至少一个待迁移子表,其中,目标数据表被拆分为所述多个子表,所述多个子表中的一个子表存储在所述至少一个第二节点中的一个第二节点上,所述至少一个第二节点中的每个第二节点存储有所述多个子表中的至少一个子表;将所述至少一个待迁移子表中的每个待迁移子表由原存储在的第二节点迁移到所述第一节点上。

可选地,在使用所述第一节点为所述目标数据库扩容之前,所述方法还包括:接收第一客户端发送的目标建表命令,其中,所述目标建表命令用于指示创建被拆分成目标数量的子表的所述目标数据表;响应所述目标建表命令,为所述目标数据表创建所述多个子表,其中,所述多个子表中包含的子表的数量为所述目标数量,所述多个子表被分配到所述至少一个第二节点上。

可选地,为所述目标数据表创建所述多个子表包括:确定所述每个子表的表名以及所述每个子表所分配到的第二节点,其中,所述多个子表中的第一目标子表的表名与所述目标数据表的表名相同;按照所述每个子表的表名,在所述每个子表所分配到的第二节点上创建所述每个子表。

可选地,在接收所述第一客户端发送的所述目标建表命令之后,所述方法还包括:提取所述目标建表命令中的目标参数信息,其中,所述目标参数信息用于指示按照目标拆分键、采用目标映射关系将所述目标数据表拆分为所述多个子表,所述目标映射关系为所述目标拆分键的值与所述多个子表之间的映射关系;根据所述目标参数信息,生成与所述目标数据表对应的目标元信息,其中,所述目标元信息包含所述目标拆分键、所述目标映射关系的指示信息、以及第一分布信息,所述第一分布信息用于指示所述每个第二节点上所分配的子表。

可选地,在使用所述第一节点对所述目标数据库扩容之后,所述方法还包括:将所述目标元信息中的所述第一分布信息更新为第二分布信息,得到更新后的所述目标元信息,其中,所述第二分布信息用于指示所述第一节点和所述至少一个第二节点中的每个节点上所分配的子表。

可选地,在使用所述第一节点对所述目标数据库扩容之前,所述方法还包括:接收第二客户端发送的目标业务请求,其中,所述目标数据表按照目标拆分键、采用目标映射关系被拆分为所述多个子表,所述目标映射关系为目标拆分键的值与所述多个子表之间的映射关系,所述目标业务请求用于请求对目标业务数据执行目标处理操作,所述目标业务数据的所述目标拆分键的值为目标键值;响应所述目标业务请求,根据所述目标键值和所述目标映射关系,确定与所述目标业务数据对应的第二目标子表,其中,所述第二目标子表位于所述至少一个第二节点中的目标节点上;在所述目标节点的所述第二目标子表中对所述目标业务数据执行所述目标处理操作。

可选地,从所述多个子表中选取出待迁移到所述第一节点中的所述至少一个待迁移子表包括:获取所述至少一个第二节点中的每个第二节点的数据量,其中,所述每个第二节点的数据量为所述每个第二节点中所存储的子表的数据量;根据所述每个第二节点的数据量、以及所述每个子表的数据量,从所述多个子表中选取出所述至少一个待迁移子表。

根据本申请实施例的另一个方面,还提供了一种数据库集群的扩容装置,包括:扩容单元,用于使用第一节点对目标数据库集群扩容,其中,所述目标数据库集群包含至少一个第二节点;选取单元,用于从多个子表中选取出待迁移到所述第一节点中的至少一个待迁移子表,其中,目标数据表被拆分为所述多个子表,所述多个子表中的一个子表存储在所述至少一个第二节点中的一个第二节点上,所述至少一个第二节点中的每个第二节点存储有所述多个子表中的至少一个子表;迁移单元,用于将所述至少一个待迁移子表中的每个待迁移子表由原存储在的第二节点迁移到所述第一节点上。

可选地,所述装置还包括:第一接收单元,用于在使用所述第一节点为所述目标数据库扩容之前,接收第一客户端发送的目标建表命令,其中,所述目标建表命令用于指示创建被拆分成目标数量的子表的所述目标数据表;创建单元,用于响应所述目标建表命令,为所述目标数据表创建所述多个子表,其中,所述多个子表中包含的子表的数量为所述目标数量,所述多个子表被分配到所述至少一个第二节点上。

可选地,所述创建单元包括:确定模块,用于确定所述每个子表的表名以及所述每个子表所分配到的第二节点,其中,所述多个子表中的第一目标子表的表名与所述目标数据表的表名相同;创建模块,用于按照所述每个子表的表名,在所述每个子表所分配到的第二节点上创建所述每个子表。

可选地,所述装置还包括:提取单元,用于在接收所述第一客户端发送的所述目标建表命令之后,提取所述目标建表命令中的目标参数信息,其中,所述目标参数信息用于指示按照目标拆分键、采用目标映射关系将所述目标数据表拆分为所述多个子表,所述目标映射关系为所述目标拆分键的值与所述多个子表之间的映射关系;生成单元,用于根据所述目标参数信息,生成与所述目标数据表对应的目标元信息,其中,所述目标元信息包含所述目标拆分键、所述目标映射关系的指示信息、以及第一分布信息,所述第一分布信息用于指示所述每个第二节点上所分配的子表。

可选地,所述装置还包括:更新单元,用于在使用所述第一节点对所述目标数据库扩容之后,将所述目标元信息中的所述第一分布信息更新为第二分布信息,得到更新后的所述目标元信息,其中,所述第二分布信息用于指示所述第一节点和所述至少一个第二节点中的每个节点上所分配的子表。

可选地,所述装置还包括:第二接收单元,用于在使用所述第一节点对所述目标数据库扩容之前,接收第二客户端发送的目标业务请求,其中,所述目标数据表按照目标拆分键、采用目标映射关系被拆分为所述多个子表,所述目标映射关系为目标拆分键的值与所述多个子表之间的映射关系,所述目标业务请求用于请求对目标业务数据执行目标处理操作,所述目标业务数据的所述目标拆分键的值为目标键值;确定单元,用于响应所述目标业务请求,根据所述目标键值和所述目标映射关系,确定与所述目标业务数据对应的第二目标子表,其中,所述第二目标子表位于所述至少一个第二节点中的目标节点上;执行单元,用于在所述目标节点的所述第二目标子表中对所述目标业务数据执行所述目标处理操作。

可选地,选取单元包括:获取模块,用于获取所述至少一个第二节点中的每个第二节点的数据量,其中,所述每个第二节点的数据量为所述每个第二节点中所存储的子表的数据量;选取模块,用于根据所述每个第二节点的数据量、以及所述每个子表的数据量,从所述多个子表中选取出所述至少一个待迁移子表。

根据本申请实施例的又一个方面,还提供了一种电子设备,包括处理器、通信接口、存储器和通信总线,其中,处理器、通信接口和存储器通过通信总线完成相互间的通信;其中,存储器,用于存储计算机程序;处理器,用于通过运行所述存储器上所存储的所述计算机程序来执行上述任一实施例中的方法步骤。

根据本申请实施例的又一个方面,还提供了一种计算机可读的存储介质,该存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一实施例中的方法步骤。

在本申请实施例中,采用对逻辑表进行拆分、在扩容时迁移指定子表的方式,通过使用第一节点对目标数据库集群扩容,其中,目标数据库集群包含至少一个第二节点;从多个子表中选取出待迁移到第一节点中的至少一个待迁移子表,其中,目标数据表被拆分为多个子表,多个子表中的一个子表存储在至少一个第二节点中的一个第二节点上,至少一个第二节点中的每个第二节点存储有多个子表中的至少一个子表;将至少一个待迁移子表中的每个待迁移子表由原存储在的第二节点迁移到第一节点上,由于将目标数据表拆分成多个子表,在对数据库扩容时,只需将指定子表迁移到新的节点上,从而可以实现避免对无需迁移的数据执行读取和插入操作的目的,达到了节约系统资源和网络资源、加快扩容速度的技术效果,进而解决了相关技术中的数据库扩容方式存在的对网络资源和机器资源占用量大的问题。

附图说明

此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1是根据本申请实施例的一种可选的数据库集群的扩容方法的硬件环境的示意图;

图2是根据本申请实施例的一种可选的数据库集群的扩容方法的流程示意图;

图3是根据本申请实施例的一种可选的数据库集群的示意图;

图4是根据本申请实施例的另一种可选的数据库集群的示意图;

图5是根据本申请实施例的一种可选的数据库集群中子表分布的示意图;

图6是根据本申请实施例的另一种可选的数据库集群中子表分布的示意图;

图7是根据本申请实施例的另一种可选的数据库集群的扩容方法的流程示意图;

图8是根据本申请实施例的一种可选的数据库集群的扩容装置的结构框图;

图9是根据本申请实施例的一种可选的电子设备的结构框图。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

根据本申请实施例的一个方面,提供了一种数据库集群的扩容方法。可选地,在本实施例中,上述数据库集群的扩容方法可以应用于如图1所示的终端102和分布式数据库集群104所构成的硬件环境中。如图1所示,分布式数据库集群104包含计算节点1042和存储节点1044,终端102通过网络与计算节点1042,计算节点1042通过网络与存储节点1044相连,分布式数据库集群104可以为终端102提供数据处理业务,其中,计算节点1042用于执行数据处理业务的控制逻辑,存储节点1044中存储有业务数据,可以基于计算节点1042的控制执行数据处理操作。

上述网络可以包括但不限于以下至少之一:有线网络,无线网络。上述有线网络可以包括但不限于以下至少之一:广域网,城域网,局域网,上述无线网络可以包括但不限于以下至少之一:WIFI(Wireless Fidelity,无线保真),蓝牙。终端102可以并不限定于为PC、手机、平板电脑等。

本申请实施例的数据库集群的扩容方法可以由分布式数据库集群104来执行,也可以由终端102来执行,还可以是由分布式数据库集群104和终端102共同执行。其中,终端102执行本申请实施例的数据库集群的扩容方法也可以是由安装在其上的客户端来执行。

以由分布式数据库集群104中的计算节点1042来执行本实施例中的数据库集群的扩容方法为例,图2是根据本申请实施例的一种可选的数据库集群的扩容方法的流程示意图,如图2所示,该方法的流程可以包括以下步骤:

步骤S202,使用第一节点对目标数据库集群扩容,其中,目标数据库集群包含至少一个第二节点。

本实施例中的数据库集群的扩容方法可以应用于分布式数据库系统中,该分布式数据库系统可以使用不同的分布式数据库集群为不同的对象提供数据存储服务。对于一个分布式数据库集群的关联对象,分布式数据库集群相当于是一个数据库。分布式数据库集群可以使用一个或多个数据表为关联对象提供数据存储服务,存储关联对象的业务数据。对于目标对象,为其分配的分布式数据库集群为目标数据库集群(目标分布式数据库集群)。

目标对象可以包含一个或者多个关联帐号,每个帐号可以被一个用户或者多个用户所使用。一个用户可以使用帐号和密码、或其他方式登录分布式数据库系统的客户端,从而使该客户端与分布式数据库系统建立连接。在连接到分布式数据库系统之后,该用户可以使用为目标对象配置的目标数据库集群执行数据操作,例如,读操作,写操作。目标数据库集群可以包含至少一个第二节点,第二节点可以是存储节点。目标数据库集群还可以包含目标计算节点,该目标计算节点可以用于执行数据处理业务的控制逻辑,本实施例中的数据库集群的扩容方法可以是由上述目标计算节点执行的。

至少一个第二节点上可以存储有目标对象的一个或多个数据表,一个或多个数据表可以包括目标数据表。随着存储的业务数据的数据量不断增加,可以对目标数据库集群进行扩容,例如,水平扩容。水平扩容是指:通过增加更多的服务器或者程序实例来分散负载,从而提升集群的存储能力和计算能力。

当目标数据库集群中的存储节点需要扩容时,可以使用第一节点为目标数据库集群扩容,也就是,将第一节点添加到目标数据库集群中。使用第一节点为目标数据库集群扩容的方式可以是:建立目标计算节点与第一节点之间的连接,同时为第一节点配置集群信息等,以将第一节点添加到目标数据库集群中。

步骤S204,从多个子表中选取出待迁移到第一节点中的至少一个待迁移子表,其中,目标数据表被拆分为多个子表,多个子表中的一个子表存储在至少一个第二节点中的一个第二节点上,至少一个第二节点中的每个第二节点存储有多个子表中的至少一个子表。

在对目标数据库集群进行扩容之后,目标计算节点可以将已有存储节点中(至少一个第二节点)的数据表中的数据迁移到新添加的存储节点中,以均衡不同存储节点之间的负载。

相关技术中,采用数据重分布的方式进行数据迁移。例如,在如图3所示的集群中,proxy为计算节点,g0和g1为两个存储节点,每个存储节点保存一张大表Table_1,g0和g1中的表Table_1数据的总和为用户所有数据。

假设表Table_1的建表语句为:

Create table table_1(id int not null,val int)/*#partition by id#*/

其中,表table_1以列id作为拆分键进行拆分,拆分策略为hash(哈希)。

可以将数据(1,10)、(2,20)、(3,30)、(4,40)、(5,50)、(6,60)、(7,70)、(8,80)、(9,90)和(10,100)插入到表中,由于选择列id作为拆分键,可以对id进行hash,即,id对2取模(2位存储节点个数)。例如,数据(1,10)对2取模,1%2=1,模为1,可以将数据(1,10)存放在节点g1中,数据(2,20)对2取模,2%2=0,可以将其存放到节点g0中,数据(3,30)对3取模,3%2=1,可以将其存放到节点g1中,依次类推。最终g0上数据为(2,20),(4,40),(6,60),(8,80),(10,100),g1上数据为(1,10),(3,30),(5,50),(7,70),(9,90)。

当对该集群进行扩容时,扩容一个节点,如果采用数据重分布的方式进行拆分,需要把所有数据都遍历一遍,然后按照既定的拆分策略将数据重新插入。具体地,可以对id进行hash,即,id对3取模,如数据(1,10)对3取模,1%3=1,模为1,则将数据(1,10)存放在节点g1中;数据(2,20)对3取模,2%3=2,则将其存放到节点g2中;数据(3,30)对3取模,3%3=0,则将其存放到节点g0中;以此类推。最终,g0上数据为(3,30),(6,60),(9,90),g1上数据为(1,10),(4,40),(7,70),(10,100),g2上数据为(2,20),(5,50),(8,80),扩容后集群中架构及数据分布如图4所示。

由扩容前后的集群数据分布可知,扩容前后数据(6,60)均存放在节点g0中,数据(1,10),(7,70)均存放在节点g1中,这些数据在扩容时实际上无需进行再次重分布。但是在数据重分布的方案中,这些数据依然需要再次被读取及计算存储在哪个节点上,这就增加了扩容时所需的计算量、网络资源以及扩容所需的时间。

可选地,在本实施例,采用将大表拆分成多个子表,集群中的每个存储节点存储一个或多个子表,也即,每个逻辑表对应多个物理子表,同时每个存储节点存储一个或多个物理子表。在对集群进行扩容时,只需要将某些物理子表全部迁移到新的存储节点。

对于目标数据表,该目标数据表被拆分为多个子表,一个子表可以存储在一个第二节点上,每个第二节点上可以存储有至少一个子表。为保证系统资源的合理利用,每个第二节点上存储的子表的数量可以是相同或者类似的,或者,每个第二节点上存储的子表的数据量可以是相同或者类似的。

需要说明的是,目标数据表为一张逻辑表,每个子表为一张物理表(物理子表)。逻辑表可以理解为数据库中的视图,是一张虚拟表,可以映射到一张物理表,也可以映射到多张物理表,这些物理表可以来自于不同的数据源。而物理表是具体某个数据源中的一张表,对于MySQL(一个关系型数据库管理系统),物理表就是一个table。

可选地,在本实施例中,分布式数据库系统可以对用户屏蔽底层物理子表的细节,只向用户展示一张逻辑表,用户可以像操作一张表一样进行数据操作(例如,增、删、查、改等)。

如果使用第一节点对目标数据库集群进行扩容,目标计算节点可以从多个子表中选取出待迁移到第一节点中的至少一个待迁移子表。选取待迁移子表的方式可以有一种或多种,例如,可以从多个子表中随机选取子表作为待迁移子表,再例如,可以基于每个第二节点中存储的子表的数量选取子表作为待迁移子表,又例如,可以基于每个第二节点的数据量(每个第二节点中所存储的子表的数据量)以及每个子表的数据量(每个子表中存储的业务数据的数据量)选取子表作为待迁移子表,还可以采用其他方式选取待迁移子表,本实施例中对此不作限定。

步骤S206,将至少一个待迁移子表中的每个待迁移子表由原存储在的第二节点迁移到第一节点上。

对于至少一个待迁移子表中的每个待迁移子表,目标计算节点可以将该待迁移子表从原来存储在的第二节点迁移到第一节点上。如果有多个待迁移子表,多个待迁移子表的迁移过程可以是顺序执行的,也可以是并发执行的,本实施例中对此不作限定。

例如,假如存在一张表table,表table被拆分为8个物理子表,这些子表可以被均匀地存储到两个存储节点上。如图5所示,存储节点g1上存储有子表table,table_1,table_3,table_6,存储节点g2上存储有子表table_2,table_4,table_5,table_7,其中,存储节点g1上的子表table的表名与逻辑表的表名一致。两个存储节点存储的所有子表中数据为用户表table中的所有数据。

这里,对子表table_0的表名优化为和逻辑表名一致,即,子表table_0的表名优化为table,这样在查询表结构时,就可以直接将查询语句发往该子表所在的节点,然后将结果直接返回给用户,而无需修改结果。

如果将集群扩容为3个存储节点,则只需将某些子表全部迁移到新的存储节点上面,其他子表不需要做任何数据迁移。扩容后,集群数据的分布如图6所示,表table_1、table_3和table_6仍然在节点g1,表table_2、table_4和table_5仍然在节点g2,只把节点g1的子表table和节点g2的子表table_7迁移到新节点g3上,其他子表没有做任何迁移。通过上述数据库集群的扩容方式,既节约了系统资源和网络资源,也加快了扩容的速度,更好的为用户提供服务。

通过上述步骤S202至步骤S206,使用第一节点对目标数据库集群扩容,其中,目标数据库集群包含至少一个第二节点;从多个子表中选取出待迁移到第一节点中的至少一个待迁移子表,其中,目标数据表被拆分为多个子表,多个子表中的一个子表存储在至少一个第二节点中的一个第二节点上,至少一个第二节点中的每个第二节点存储有多个子表中的至少一个子表;将至少一个待迁移子表中的每个待迁移子表由原存储在的第二节点迁移到第一节点上,解决了相关技术中的数据库扩容方式存在的对网络资源和机器资源占用量大的问题,节约了系统资源和网络资源,加快了扩容的速度。

作为一种可选的实施例,从多个子表中选取出待迁移到第一节点中的至少一个待迁移子表包括:

S11,获取至少一个第二节点中的每个第二节点的数据量,其中,每个第二节点的数据量为每个第二节点中所存储的子表的数据量;

S12,根据每个第二节点的数据量、以及每个子表的数据量,从多个子表中选取出至少一个待迁移子表。

为了保证存储节点之间的负载均衡,当存储节点需要扩容时,可以根据各个存储节点中子表的数据量,选择合适的子表进行迁移,以使扩容后的数据能尽可能均匀的存储到各个存储节点上。例如,目标计算节点可以基于每个第二节点的数据量以及每个子表的数据量选取子表作为待迁移子表。

目标计算节点可以获取每个子表的数据量,还可以获取每个第二节点的数据量,也就是,每个第二节点中所存储的子表的数据量。根据每个第二节点的数据量、以及每个子表的数据量,目标计算节点可以选取合适的子表(至少一个待迁移子表)进行迁移。在各个待迁移子表都已迁移完成之后,第一节点和至少一个第二节点中的每个节点的数据量尽量均衡。

例如,对于如图5所示的集群,节点g1的子表table和节点g2的子表table_7,数据量较大,可以选择将这两个子表迁移到新扩容的存储节点g3上,其他子表不需要做任何变动,扩容后集群信息如图6所示。

通过本实施例,根据各个存储节点中子表的数据量选择子表进行迁移,以使扩容后的数据能尽可能均匀的存储到各个节点上,可以保证集群中各个存储节点之间的负载均衡。

作为一种可选的实施例,在使用第一节点为目标数据库扩容之前,上述方法还包括:

S21,接收第一客户端发送的目标建表命令,其中,目标建表命令用于指示创建被拆分成目标数量的子表的目标数据表;

S22,响应目标建表命令,为目标数据表创建多个子表,其中,多个子表中包含的子表的数量为目标数量,多个子表被分配到至少一个第二节点上。

目标数据表可以是基于第一客户端发送的目标建表命令(用于创建数据表)所创建的,第一客户端可以是使用第一帐号登录的客户端,该客户端可以与目标计算节点相连,从而可以向目标计算节点发送目标建表命令,该目标建表命令用于指示创建被拆分成目标数量的子表的目标数据表。

响应接收到的目标建表命令,目标计算节点可以为该目标数据表创建多个子表,从而创建出目标数据表。该目标数据表为一张虚拟表,多个子表为该目标数据表所映射到的多张物理子表。多个子表中包含的子表的数量为目标数量,多个子表被分配到至少一个第二节点上,每个第二节点上所分配的子表的数量可以是相同的,也可以是不同的。

对于一个子表,该子表可以是在目标计算节点上创建并发送给对应的第二节点的,也可以是目标计算节点通过向对应的第二节点发送建表命令,由对应的第二节点响应接收到的建表命令所创建的,本实施例中对此不作限定。

通过本实施例,通过在创建数据表的命令中直接指示所需创建的数据表被拆分成的子表的数量,可以方便进行子表拆分,提高数据表的创建效率。

作为一种可选的实施例,为目标数据表创建多个子表包括:

S31,确定每个子表的表名以及每个子表所分配到的第二节点,其中,多个子表中的第一目标子表的表名与目标数据表的表名相同;

S32,按照每个子表的表名,在每个子表所分配到的第二节点上创建每个子表。

在创建多个子表时,目标计算节点可以生成每个子表的表名,每个子表的表名可以是与目标数据表的表名相关的,也可以是不相关的。可选地,多个子表中的第一目标子表(目标位置的子表,例如,第一个子表)的表名与目标数据表的表名可以是相同的,从而可以方便用户在进行数据表操作时,直接操作命令发往该子表所在的节点,然后将结果直接返回给用户,而无需修改结果。

例如,目标数据表为table,该被拆分为8个子表,8个子表的表名可以分别为:table,table_1,table_2,table_3,table_4,table_5,table_6,table_7,table_8。在查询表结构时,如果查询的是table子表中的数据,可以直接将查询语句发往该table子表所在的节点,然后将结果直接返回给用户,而无需修改结果。

目标计算节点还可以将多个子表分配到至少一个第二节点上,如果子表的数量大于或者等于第二节点的数量,则每个第二节点上分配至少一个子表,从而可以保证各个节点的负载均衡。

在确定出每个子表的表名和所分配到的第二节点之后,目标计算节点可以按照每个子表的表名,在每个子表所分配到的第二节点上创建每个子表。例如,目标计算节点可以向每个子表所分配到的第二节点发送建表命令,该建表命令用于指示创建表名为每个子表的表名的数据表。在接收到目标计算节点所发送的建表命令之后,每个子表所分配到的第二节点可以创建表名为每个子表的表名的数据表。

通过本实施例,通过创建表名与逻辑表名一致的物理子表,可以在执行逻辑表操作时直接向该表转发操作命令,简化计算节点的操作流程。

作为一种可选的实施例,在接收第一客户端发送的目标建表命令之后,上述方法还包括:

S41,提取目标建表命令中的目标参数信息,其中,目标参数信息用于指示按照目标拆分键、采用目标映射关系将目标数据表拆分为多个子表,目标映射关系为目标拆分键的值与多个子表之间的映射关系;

S42,根据目标参数信息,生成与目标数据表对应的目标元信息,其中,目标元信息包含目标拆分键、目标映射关系的指示信息、以及第一分布信息,第一分布信息用于指示每个第二节点上所分配的子表。

对于用户创建的表信息(元信息),目标计算节点可以将其存储到元数据表(meta_tables)中,并做持久化。不同的数据表可以对应于不同的元信息,对于目标数据表,其对应的元信息是目标元信息。通过数据表的元信息,目标计算节点可以方便地定位出数据表(逻辑表)所映射的物理子表所在的节点,提高数据操作的效率。

对于目标数据表,该目标建表命令中可以携带有目标参数信息,目标参数信息可以包含目标拆分键,以及目标映射关系(拆分方式)的指示信息,目标映射关系为目标拆分键的值与多个子表之间的映射关系,可以用于指示按照目标拆分键、采用目标映射关系将目标数据表拆分为多个子表。

目标映射关系可以有一种或多个,可以包含但不限于以下至少之一:hash(哈希),range(范围),LIST(区段)等,本实施例中对此不作限定。

例如,用户在创建表时,可以指定待创建的子表个数,建表语句可以是:

CREATE TABLE user_tbl(

id bigint not null auto_increment,

name varchar(21),

operation varchar(31),

primary key(id)

)/*#partition by id type="hash",partitions=8#*/;

该建表语句表示:该数据表的拆分键为id,拆分方式为hash,拆分的子表个数是8个。在该建表语句执行后,proxy会根据参数信息创建指定数量的子表,并尽可能将子表均匀地分布到存储节点,集群中子表分布情况如图5所示。

目标计算节点可以从目标建表命令中提取出目标参数信息,并根据目标参数信息生成与该目标数据表对应的目标元信息,目标元信息中可以包含目标拆分键、目标映射关系的指示信息、以及第一分布信息,第一分布信息可以用于指示每个第二节点上所分布的子表。

例如,元数据表的一种形式可以如下:

Table_name char,

Db_name char,

Type char,

Shard_method,char,

Shard_key char,

Groups char,

Primary key(Table_name,Db_name)

其中,Table_name表示数据表的表名,Db_name表示数据库(数据库集群)的库名,Type表示表类型(例如,是普通单表,还是分区表),Shard_method表示分区的方式(例如,hash,range等),shard_key表示分区键(拆分键,本例中的分区键为id),Groups表示集群中各个存储节点存储的子表信息,Table_name和Db_name可以为联合主键。

对于上述表user_tbl,该表的元数据信息是:(user_tbl,db1,partition,hash,id,{"table_map":{"g1":["table","table_1","table_3","table_6"],"g2":["table_2","table_4","table_5","table_7"]}})。由元数据信息可知,表user_tbl位于库db1中,类型为partition,即,分布式表,拆分方式为hash,拆分键为id,子表的分布情况为:节点g1存储的子表为:"table","table_1","table_3","table_6",节点g2存储的子表为:"table_2","table_4","table_5","table_7"。

通过本实施例,通过生成数据表的元信息,以记录数据表的拆分键、拆分方式、以及子表的分布情况,可以方便确定各个业务操作所需操作的子表、以及所需操作的子表所在的存储节点,提高数据操作的效率。

作为一种可选的实施例,在使用第一节点对目标数据库扩容之后,上述方法还包括:

S51,将目标元信息中的第一分布信息更新为第二分布信息,得到更新后的目标元信息,其中,第二分布信息用于指示第一节点和至少一个第二节点中的每个节点上所分布的子表。

在对存储节点扩容之后,为了保证数据表的元信息可以准确表征数据表的子表的分布情况,目标计算节点可以对目标元信息进行更新,更新的内容可以是目标元信息中的分布信息。

目标计算节点可以确定第一节点和至少一个第二节点中的每个节点上所分布的子表。对于第一节点,其上分布的子表可以是上述至少一个待迁移子表;对于每个第二节点,如果该第二节点上没有子表被迁移出,则其上分布的子表未发生变化,如果该第二节点上有子表被迁移出,则其上分布的子表为迁移之后剩余的子表。

在确定出第一节点和至少一个第二节点中的每个节点上所分布的子表之后,目标计算节点可以将目标元信息中的第一分布信息更新为第二分布信息,得到更新后的目标元信息,第二分布信息用于指示第一节点和至少一个第二节点中的每个节点上所分布的子表。

例如,对于如图5所示的集群,在扩容成如图6所示的集群之后,元信息修改为:(user_tbl,db1,partition,hash,id,{"table_map":{"g1":["table_1","table_3","table_6"],"g2":["table_2","table_4","table_5"],"g3":["table","table_7"]}})。

通过本实施例,在存储节点扩容之后同步修改数据表的元信息,可以保证数据表的元信息可以准确表征数据表的子表的分布情况,避免由于元信息错误导致的无效操作。

作为一种可选的实施例,在使用第一节点对目标数据库扩容之前,上述方法还包括:

S61,接收第二客户端发送的目标业务请求,其中,目标数据表按照目标拆分键、采用目标映射关系被拆分为多个子表,目标映射关系为目标拆分键的值与多个子表之间的映射关系,目标业务请求用于请求对目标业务数据执行目标处理操作,目标业务数据的目标拆分键的值为目标键值;

S62,响应目标业务请求,根据目标键值和目标映射关系,确定与目标业务数据对应的第二目标子表,其中,第二目标子表位于至少一个第二节点中的目标节点上;

S63,在目标节点的第二目标子表中对目标业务数据执行目标处理操作。

目标数据表可以按照目标拆分键、采用目标映射关系被拆分为多个子表。分布式数据库系统可以对用户屏蔽底层子表的细节,只向用户展示一张目标数据表,用户可以像操作一张表一样进行数据的操作(例如,增、删、改、查等)。

对于目标计算节点,目标计算节点可以接收第二客户端发送的目标业务请求,该第二客户端可以是使用第二帐号登录的客户端。该目标业务请求用于请求对目标业务数据执行目标处理操作,该目标业务数据的目标拆分键的值为目标键值。目标处理操作可以包括但不限于以下至少之一的操作:插入,更新,删除,查询。

响应目标业务请求,目标计算节点可以根据目标键值和目标映射关系,确定与目标业务数据对应的第二目标子表。例如,目标映射关系为哈希映射,目标计算节点可以根据目标键值和目标映射关系,确定该目标键值对应的目标哈希值,并确定与该目标哈希值对应的第二目标子表。又例如,目标映射关系为区间映射,目标计算节点可以根据目标键值和目标映射关系,确定该目标键值所在的目标区间,并确定与该目标哈希值对应的第二目标子表。

在确定出第二目标子表之后,目标计算节点可以确定该第二目标子表所在的第二节点,即,目标节点。确定目标节点的方式可以是:查询与目标数据表对应的目标元信息,确定该第二目标子表所在的第二节点,目标元信息中的第一分布信息用于指示每个第二节点上所分配的子表。

目标计算节点可以在目标节点的第二目标子表中对目标业务数据执行目标处理操作。例如,第二目标子表的表名与目标数据表相同,目标计算节点可以将目标业务请求直接转发给目标节点;目标节点在接收到目标业务请求之后,可以在第二目标子表中对目标业务数据执行目标处理操作。又例如,第二目标子表的表名与目标数据表不同,目标计算节点可以将目标业务请求中的数据表名修改为第二目标子表的表名,得到新的业务请求,并将新的业务请求发送给目标节点;目标节点在接收到业务请求之后,可以在第二目标子表中对目标业务数据执行目标处理操作。

例如,对于如图5所示的集群,当写数据时,假设id=23,id对子表数进行取模,即,23%8=7,可知该条数据应该存储到子表table_7中,根据元数据表可知,子表table_7存储在节点g2中,这样就可以将id为23的数据存储到节点g2上的子表table_7中,以此类推。

又例如,对于如图5所示的集群,当读数据时,假设id=23,id对子表数进行取模,即23%8=7,可知该条数据应该存储在子表table_7中,根据元数据表可知,子表table_7存储在节点g2中,这样就可以到存储节点g2上的子表table_7中去读取该数据。

需要说明的是,在对集群扩容时,由于只是改变了子表所存储到的存储节点,而并没改变目标映射关系,因此,在使用第一节点对目标数据库扩容之后,在接收到业务请求之后,可以采用同样的方式进行业务操作,只是与业务数据对应的子表可能位于第一节点上,在此不做赘述。

例如,如图6所示,扩容完成后,当写数据时,假设id=32,id对子表数进行取模,即32%8=0,可知该条数据应该存储到子表table中,根据元数据表可知,子表table存储在新扩容的节点g3中,这样就可以将数据插入到节点g3上的子表table中。

通过本实施例,通过计算节点基于拆分键和拆分方式确定与待操作的业务数据对应的子表,并在子表中对业务数据执行业务操作,可以方便用户对数据表进行操作,提高用户体验。

下面结合可选示例对本申请实施例中的数据库集群的扩容方法进行解释说明。本示例中的数据库集群的扩容方法是一种基于数据库扩容方案,通过对逻辑表拆分,在扩容时只需迁移指定子表。

如图7所示,本可选示例中的数据库集群的扩容方法的流程可以包括以下步骤:

步骤S702,接收目标对象的数据表创建请求,该请求中指定待创建的子表个数为目标个数。

集群中的计算节点可以接收用户的数据表创建请求,该请求中指定待创建的子表个数为目标个数,还指定拆分键为id,拆分方式为hash。

步骤S704,响应数据表创建请求,将创建的表信息存储到元数据表中,创建目标个数的子表,并将目标个数的子表均匀地分布到各个存储节点。

响应数据表创建请求,计算节点可以将创建的表信息(元信息)存储到元数据表中。计算节点还可以创建目标个数的子表,并将目标个数的子表尽可能均匀地分布到各个存储节点。

步骤S706,使用新节点对集群扩容,选取待迁移到新节点上的子表,将选取的子表迁移到新节点上。

在使用新节点对集群进行扩容之后,计算节点可以根据各个存储节点上的数据量,从目标个数的子表中选取出待迁移到新节点上的子表,并将选取的子表迁移到新节点上,以均衡各个存储节点的负载。

通过本示例,通过对逻辑表进行拆分,扩容时只迁移指定子表,可以节约系统资源和网络资源,加快扩容速度。

需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM(Read-Only Memory,只读存储器)/RAM(Random Access Memory,随机存取存储器)、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本申请各个实施例的方法。

根据本申请实施例的另一个方面,还提供了一种用于实施上述数据库集群的扩容方法的数据库集群的扩容装置。图8是根据本申请实施例的一种可选的数据库集群的扩容装置的结构框图,如图8所示,该装置可以包括:

扩容单元802,用于使用第一节点对目标数据库集群扩容,其中,目标数据库集群包含至少一个第二节点;

选取单元804,与扩容单元802相连,用于从多个子表中选取出待迁移到第一节点中的至少一个待迁移子表,其中,目标数据表被拆分为多个子表,多个子表中的一个子表存储在至少一个第二节点中的一个第二节点上,至少一个第二节点中的每个第二节点存储有多个子表中的至少一个子表;

迁移单元806,与选取单元804相连,用于将至少一个待迁移子表中的每个待迁移子表由原存储在的第二节点迁移到第一节点上。

需要说明的是,该实施例中的扩容单元802可以用于执行上述步骤S202,该实施例中的选取单元804可以用于执行上述步骤S204,该实施例中的迁移单元806可以用于执行上述步骤S206。

通过上述模块,使用第一节点对目标数据库集群扩容,其中,目标数据库集群包含至少一个第二节点;从多个子表中选取出待迁移到第一节点中的至少一个待迁移子表,其中,目标数据表被拆分为多个子表,多个子表中的一个子表存储在至少一个第二节点中的一个第二节点上,至少一个第二节点中的每个第二节点存储有多个子表中的至少一个子表;将至少一个待迁移子表中的每个待迁移子表由原存储在的第二节点迁移到第一节点上,解决了相关技术中的数据库扩容方式存在的对网络资源和机器资源占用量大的问题,节约了系统资源和网络资源,加快了扩容的速度。

作为一种可选的实施例,上述装置还包括:

第一接收单元,用于在使用第一节点为目标数据库扩容之前,接收第一客户端发送的目标建表命令,其中,目标建表命令用于指示创建被拆分成目标数量的子表的目标数据表;

创建单元,用于响应目标建表命令,为目标数据表创建多个子表,其中,多个子表中包含的子表的数量为目标数量,多个子表被分配到至少一个第二节点上。

作为一种可选的实施例,创建单元包括:

确定模块,用于确定每个子表的表名以及每个子表所分配到的第二节点,其中,多个子表中的第一目标子表的表名与目标数据表的表名相同;

创建模块,用于按照每个子表的表名,在每个子表所分配到的第二节点上创建每个子表。

作为一种可选的实施例,上述装置还包括:

提取单元,用于在接收第一客户端发送的目标建表命令之后,提取目标建表命令中的目标参数信息,其中,目标参数信息用于指示按照目标拆分键、采用目标映射关系将目标数据表拆分为多个子表,目标映射关系为目标拆分键的值与多个子表之间的映射关系;

生成单元,用于根据目标参数信息,生成与目标数据表对应的目标元信息,其中,目标元信息包含目标拆分键、目标映射关系的指示信息、以及第一分布信息,第一分布信息用于指示每个第二节点上所分配的子表。

作为一种可选的实施例,上述装置还包括:

更新单元,用于在使用第一节点对目标数据库扩容之后,将目标元信息中的第一分布信息更新为第二分布信息,得到更新后的目标元信息,其中,第二分布信息用于指示第一节点和至少一个第二节点中的每个节点上所分配的子表。

作为一种可选的实施例,上述装置还包括:

第二接收单元,用于在使用第一节点对目标数据库扩容之前,接收第二客户端发送的目标业务请求,其中,目标数据表按照目标拆分键、采用目标映射关系被拆分为多个子表,目标映射关系为目标拆分键的值与多个子表之间的映射关系,目标业务请求用于请求对目标业务数据执行目标处理操作,目标业务数据的目标拆分键的值为目标键值;

确定单元,用于响应目标业务请求,根据目标键值和目标映射关系,确定与目标业务数据对应的第二目标子表,其中,第二目标子表位于至少一个第二节点中的目标节点上;

执行单元,用于在目标节点的第二目标子表中对目标业务数据执行目标处理操作。

作为一种可选的实施例,选取单元包括:

获取模块,用于获取至少一个第二节点中的每个第二节点的数据量,其中,每个第二节点的数据量为每个第二节点中所存储的子表的数据量;

选取模块,用于根据每个第二节点的数据量、以及每个子表的数据量,从多个子表中选取出至少一个待迁移子表。

此处需要说明的是,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现,其中,硬件环境包括网络环境。

根据本申请实施例的又一个方面,还提供了一种用于实施上述数据库集群的扩容方法的电子设备,该电子设备可以是服务器、终端、或者其组合。

图9是根据本申请实施例的一种可选的电子设备的结构框图,如图9所示,包括处理器902、通信接口904、存储器906和通信总线908,其中,处理器902、通信接口904和存储器906通过通信总线908完成相互间的通信,其中,

存储器906,用于存储计算机程序;

处理器902,用于执行存储器906上所存放的计算机程序时,实现如下步骤:

S1,使用第一节点对目标数据库集群扩容,其中,目标数据库集群包含至少一个第二节点;

S2,从多个子表中选取出待迁移到第一节点中的至少一个待迁移子表,其中,目标数据表被拆分为多个子表,多个子表中的一个子表存储在至少一个第二节点中的一个第二节点上,至少一个第二节点中的每个第二节点存储有多个子表中的至少一个子表;

S3,将至少一个待迁移子表中的每个待迁移子表由原存储在的第二节点迁移到第一节点上。

可选地,在本实施例中,上述的通信总线可以是PCI(Peripheral ComponentInterconnect,外设部件互连标准)总线、或EISA(Extended Industry StandardArchitecture,扩展工业标准结构)总线等。该通信总线可以分为地址总线、数据总线、控制总线等。为便于表示,图9中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。通信接口用于上述电子设备与其他设备之间的通信。

存储器可以包括RAM,也可以包括非易失性存储器(non-volatile memory),例如,至少一个磁盘存储器。可选地,存储器还可以是至少一个位于远离前述处理器的存储装置。

作为一种示例,上述存储器906中可以但不限于包括上述数据库集群的扩容装置中的扩容单元802、选取单元804以及迁移单元806。此外,还可以包括但不限于上述数据库集群的扩容装置中的其他模块单元,本示例中不再赘述。

上述处理器可以是通用处理器,可以包含但不限于:CPU(Central ProcessingUnit,中央处理器)、NP(Network Processor,网络处理器)等;还可以是DSP(DigitalSignal Processing,数字信号处理器)、ASIC(Application Specific IntegratedCircuit,专用集成电路)、FPGA(Field-Programmable Gate Array,现场可编程门阵列)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。

可选地,本实施例中的具体示例可以参考上述实施例中所描述的示例,本实施例在此不再赘述。

本领域普通技术人员可以理解,图9所示的结构仅为示意,实施上述数据库集群的扩容方法的设备可以是终端设备,该终端设备可以是智能手机(如Android手机、iOS手机等)、平板电脑、掌上电脑以及移动互联网设备(Mobile Internet Devices,MID)、PAD等终端设备。图9其并不对上述电子设备的结构造成限定。例如,电子设备还可包括比图9中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图9所示的不同的配置。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、ROM、RAM、磁盘或光盘等。

根据本申请实施例的又一个方面,还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于执行本申请实施例中上述任一项数据库集群的扩容方法的程序代码。

可选地,在本实施例中,上述存储介质可以位于上述实施例所示的网络中的多个网络设备中的至少一个网络设备上。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:

S1,使用第一节点对目标数据库集群扩容,其中,目标数据库集群包含至少一个第二节点;

S2,从多个子表中选取出待迁移到第一节点中的至少一个待迁移子表,其中,目标数据表被拆分为多个子表,多个子表中的一个子表存储在至少一个第二节点中的一个第二节点上,至少一个第二节点中的每个第二节点存储有多个子表中的至少一个子表;

S3,将至少一个待迁移子表中的每个待迁移子表由原存储在的第二节点迁移到第一节点上。

可选地,本实施例中的具体示例可以参考上述实施例中所描述的示例,本实施例中对此不再赘述。

可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、ROM、RAM、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。

上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。

在本申请的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例中所提供的方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。

相关技术
  • 数据库集群的扩容方法和装置、电子设备和存储介质
  • 数据库集群的扩容方法、装置、系统和数据库集群系统
技术分类

06120113008206