基于分库分表的任务传输方法、装置及系统与流程

文档序号:12666199阅读:270来源:国知局
基于分库分表的任务传输方法、装置及系统与流程

本发明涉及数据库技术领域,具体而言,涉及一种基于分库分表的任务传输方法、装置及系统。



背景技术:

随着互联网应用的广泛普及,对于一个大型的互联网应用,每天有几十亿的页面访问量,大量数据存储在数据库中。在大数据平台处理数据之前,需要把数据导入大数据平台的存储系统,一般采用ETL(数据提取、转换和加载,Extract-Transform-Load的缩写)技术。

在ETL技术中,数据同步作为数据仓库的出口和入口,扮演着非常重要的角色,特别是离线数据同步,往往一个任务就需要同步上百GB甚至TB量级的数据,这对数据同步工具的稳定性要求非常高,同时因为抽取端数据库(DB,Database)支持并发读取,对抽取端和写入端数据库DB的压力也很大。正是由于大量数据的同步,使得人们可以更方便的关注到原本忽略的数据,使得数据同步过程中产生了更多的长尾任务,导致抽取端DB的压力和长尾渐渐成为数据同步的瓶颈。

现有技术中的解决方案都是针对单库的(即一个任务只抽取一个库),即在底层同步工具上层做一层服务,在服务中进行调度控制,避免同时对一个库抽取的并发任务数过多。

随着数据量的增加,单库已经无法满足大数据量的需求,需要将单个数据库进行拆分成多库多表存储数据。针对分库分表的单个任务而言,由于分库分表任务会对多个分库进行抽取,分库的抽取策略直接决定着任务抽取速度,使得上述针对单库的解决方案不再适用。

针对现有技术中在基于分库分表的任务进行并发传输时,抽取端从分库分表DB中并发读取数据压力过大,导致并发传输分库分表的任务效率低的技术问题,目前尚未提出有效的解决方案。



技术实现要素:

本发明实施例提供了一种基于分库分表的任务传输方法、装置及系统,以至少解决现有技术中在基于分库分表的任务进行并发传输时,抽取端从分库分表DB中并发读取数据压力过大,导致并发传输分库分表的任务效率低的技术问题。

根据本发明实施例的一个方面,提供了一种基于分库分表的任务传输方法,包括:从分库分表中抽取待传输的任务集合,其中,任务集合包括:多个分库,以及每个分库所包含的分表;按照预先配置的总并发粒度从多个分库中调取n个分表,n等于总并发粒度;将调取到的n个分表采用散列分配方式散列至不同的调度单元,其中,预先配置每个调度单元的单元并发粒度相同;将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置。

根据本发明实施例的另一方面,还提供了一种基于分库分表的任务传输装置,包括:抽取模块,用于从分库分表中抽取待传输的任务集合,其中,任务集合包括:多个分库,以及每个分库所包含的分表;调取模块,用于按照预先配置的总并发粒度从多个分库中共调取n个分表,n等于总并发粒度;处理模块,用于将调取到的n个分表采用散列分配方式散列至不同的调度单元,其中,预先配置每个调度单元的单元并发粒度相同;并发模块,用于将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置。

根据本发明实施例的另一方面,还提供了一种基于分库分表的任务传输系统包括:源数据终端,用于存储分库分表;调度终端,与源数据终端通信,用于从分库分表中抽取待传输的任务集合,其中,任务集合包括:多个分库,以及每个分库所包含的分表,并按照预先配置的总并发粒度从多个分库中共调取n个分表,n等于总并发粒度,在将调取到的n个分表采用散列分配方式散列至不同的调度单元之后,将每个调度单元中包含的分表按照单元并发粒度并发传输,其中,预先配置每个调度单元的单元并发粒度相同;目标终端,与调度终端通信,用于接收调度终端并发传输来的任务集合。

在本发明实施例中,如果希望减小分库分表任务的并行传输,可以在抽取待传输的任务集合之后,按照预先配置的总并发粒度从多个分库中调取n个分表,通过将调取到的n个分表采用散列分配方式散列至不同的调度单元,将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置,本方案可以根据总并发粒度和单元并发粒度对待传输的任务集合进行拆分,以均衡并行传输分库分表的任务。

容易注意到,由于在抽取待传输的任务集合之后,需要在按照预先配置的总并发粒度从多个分库中调取n个分表,并通过将调取到的n个分表采用散列分配方式散列至不同的调度单元,就可以根据散列后的分表并行发送任务集合,达到均衡并发传输 分库分表的任务,因此,通过本申请实施例所提供的方案,可以实现基于分库分表的任务传输,这样不仅实现了分库分表的任务传输,而且,在传输分库分表的任务时,在满足预先配置的总并发粒度的情况下,均衡传输分库分表的任务,因此,可以均衡分库分表中的多个任务,降低并发读取数据的压力,提高并发传输效率。

由此,本申请提供的上述实施例的方案解决了现有技术中在基于分库分表的任务进行并发传输时,抽取端从分库分表DB中并发读取数据压力过大,导致并发传输分库分表的任务效率低的技术问题。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据本申请实施例的一种基于分库分表的任务传输方法的计算机终端的硬件结构框图;

图2是根据本申请实施例的一种基于分库分表的任务传输方法的流程图;

图3是根据本申请实施例的分库分表对应调度管理单元的示意图;

图4是根据本申请实施例的分库分表散列至调度管理单元的示意图;

图5是根据本申请实施例的调度管理单元获取最优解的示意图;

图6是根据本申请实施例的一种可选的基于分库分表的任务传输方法的交互流程图;

图7是根据本申请实施例的一种基于分库分表的任务传输装置的示意图;

图8是根据本申请实施例的一种可选的基于分库分表的任务传输装置的示意图;

图9是根据本申请实施例的一种可选的基于分库分表的任务传输装置的示意图;

图10是根据本申请实施例的一种可选的基于分库分表的任务传输装置的示意图;

图11是根据本申请实施例的一种可选的基于分库分表的任务传输装置的示意图;

图12是根据本申请实施例的一种可选的基于分库分表的任务传输装置的示意图;

图13是根据本申请实施例的一种基于分库分表的任务传输系统的示意图;以及

图14是根据本申请实施例的一种计算机终端的结构框图。

具体实施方式

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

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

首先,在对本申请实施例进行描述的过程中出现的部分名词或术语适用于如下解释:

ETL:Extract-Transform-Load简称,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL是构建数据仓库的重要一环,用户从数据源抽取出所需的数据,经过数据清洗,最终按照预先定义好的数据仓库模块,将数据假造到数据仓库中取。

分库分表:把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。分库分表有垂直切分和水平切分两种,其中,垂直切分是指将表按照功能模块、关系密切程度划分出来,部署到不同的库上,例如,可以建立商品数据库存储商品定义表,建立用户数据库存储用户数据表等。水平切分是指当一个表中的数据量过大时,可以把该表的数据按照某种规则进行划分,然后存储到多个结构相同的表和不同的库上。

DB:(Database),数据库,是按照数据结构来组织、存储和管理的数据仓库。

实施例1

根据本发明实施例,还提供了一种基于分库分表的任务传输方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

本申请实施例一所提供的方法实施例可以在移动终端、计算机终端或者类似的运算装置中执行。以运行在计算机终端上为例,图1是根据本申请实施例的一种基于分库分表的任务传输方法的计算机终端的硬件结构框图。如图1所示,计算机终端10可以包括一个或多个(图中仅示出一个)处理器102(处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)、用于存储数据的存储器104、以及用于通信功能的传输模块106。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,计算机终端10还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。

存储器104可用于存储应用软件的软件程序以及模块,如本发明实施例中的基于分库分表的任务传输方法对应的程序指令/模块,处理器102通过运行存储在存储器104内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的应用程序的漏洞检测方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至计算机终端10。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

传输装置106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括计算机终端10的通信供应商提供的无线网络。在一个实例中,传输装置106包括一个网络适配器(Network Interface Controller,NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输装置106可以为射频(Radio Frequency,RF)模块,其用于通过无线方式与互联网进行通讯。

在上述运行环境下,本申请提供了如图2所示的基于分库分表的任务传输方法。图2是根据本申请实施例的一种基于分库分表的任务传输方法的流程图,如图2所示的方法可以包括如下步骤:

步骤S21,从分库分表中抽取待传输的任务集合,其中,任务集合包括:多个分库,以及每个分库所包含的分表。

可选地,一个任务集合可以包括多个分库,每个分库可以包含多个分表,且每个分表可以记录有多条数据信息,该数据信息可以是注册用户数据信息、访问网页数据信息、购买商品数据信息等等。从分库分表中抽取待传输的任务集合之后,可以根据抽取顺序进行编号。

在一种可选的方案中,在从分库分表中抽取待传输的任务集合之前,可以获取配 置文件,该配置文件中记录待传输的多个分库的名称以及每个分库中包含的分表的名称。在读取配置文件之后,按照读取到的多个分库的名称以及多个分表的名称,从源数据库的分库分表中抽取待传输的多个分库以及每个分库包含的分表。

结合图3所示,在一个可选的实施例中,任务集合可以包含3个分库,分别是分库A、分库B和分库C,分库A可以包含4个分表,分别是分表T1、分表T2、分表T3和分表T4,分库B可以包含2个分表,分别是分表T1和分表T2,分库C可以包含4个分表,分别是分表T1、分表T2、分表T3和分表T4。

步骤S23,按照预先配置的总并发粒度从多个分库中调取n个分表,n等于总并发粒度。

可选地,总并发粒度(totalChannel)表示同时并发的任务个数,可以按照预先配置的总并发粒度,依次从任务集合中顺序抽取满足总并发粒度数的n个分表。上述预先配置的总并发粒度可以按照用户的实际需求进行配置,也可以根据数据库的并发能力进行配置。

仍以上述抽取的任务集合为例,在一种可选的方案中,预先配置的总并发粒度可以为9,按照总并发粒度依次从分库A中提取分表T1、分表T2、分表T3和分表T4,从分库B中提取分表T1和分表T2,从分库C中提取分表T1、分表T2和分表T3。提取的分表个数与总并发粒度相同。

步骤S25,将调取到的n个分表采用散列分配方式散列至不同的调度单元,其中,预先配置每个调度单元的单元并发粒度相同。

可选地,在按照预先配置的总并发粒度从多个分库中调取n个分表之后,按照散列分配方式,将n个分表依次散列至不同的调度单元中。上述预先配置的每个调度单元的单元并发粒度(tgChannel)用于表示每个调度单元同时并发的任务个数,单元并发粒度小于等于总并发粒度。

如图4所示,在一种可选的方案中,上述调度单元可以是调度管理模块(TG,taskGroup的简写),分库分表任务可以包括分库A、分库B和分库C,每个分库都可以包括n个分表,每一个分表都是一个待传输的任务,将3n个分表散列到n个调度管理单元中,每个调度管理单元可以包括三个分表。

仍以上述抽取的任务集合为例,在一种可选的方案中,预先配置每个调度单元的单元并发粒度可以为3,将提取的9个分表散列至不同的调度单元,调度单元1可以包括:AT3、BT2和CT3,调度单元2可以包括:AT1、AT4和CT1,调度单元3可以包括:AT2、BT1和CT2。

需要说明的是,上述散列方式将相同分库中的分表散列在不同的调度单元中,尽量满足不同分库中的多个分表均衡并发,减小抽取段DB的并发压力。

步骤S27,将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置。

可选地,上述目标位置可以是目标数据库,用于存储提取的数据信息。将调取到的n个分表采用散列分配方式散列至不同的调度单元之后,每个调度单元将散列后的n个分表按照单元并发粒度并发传输至目标数据库。

本申请上述实施例一公开的方案中,如果希望减小分库分表任务的并行传输,可以在抽取待传输的任务集合之后,按照预先配置的总并发粒度从多个分库中调取n个分表,通过将调取到的n个分表采用散列分配方式散列至不同的调度单元,将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置,本方案可以根据总并发粒度和单元并发粒度对待传输的任务集合进行拆分,以均衡并行传输分库分表的任务。

容易注意到,由于在抽取待传输的任务集合之后,需要在按照预先配置的总并发粒度从多个分库中调取n个分表,并通过将调取到的n个分表采用散列分配方式散列至不同的调度单元,就可以根据散列后的分表并行发送任务集合,达到均衡并发传输分库分表的任务,因此,通过本申请实施例所提供的方案,可以实现基于分库分表的任务传输,这样不仅实现了分库分表的任务传输,而且,在传输分库分表的任务时,在满足预先配置的总并发粒度的情况下,均衡传输分库分表的任务,因此,可以均衡分库分表中的多个任务,降低并发读取数据的压力,提高并发传输效率。

由此,本申请提供的上述实施例一的方案解决了现有技术中在基于分库分表的任务进行并发传输时,抽取端从分库分表DB中并发读取数据压力过大,导致并发传输分库分表的任务效率低的技术问题。

在本申请上述实施例中,在步骤S25,将调取到的n个分表采用散列分配方式散列至不同的调度单元之前,方法还包括如下步骤S251和步骤S255:

步骤S251,根据总并发粒度和单元并发粒度,确定调度单元的数量,并对每个调度单元分配对应的编号。

可选地,在按照预先配置的总并发粒度从多个分库中调取n个分表之后,可以根据预先配置的总并发粒度和单元并发粒度,根据公式tgCount=totalChannel/tgChannel得到调度单元的数量,然后对每个调度单元分配对应的编号。

结合图3所示,在一种可选的方案中,总并发粒度T可以为9,单元并发粒度t可以为3,则调度单元数量tgCount=totalChannel/tgChannel=3,3个调度单元的编 号分别为TG0、TG1和TG2。

步骤S253,通过如下公式计算得到任意一个分库中的每个分表Ti的散列分配值,其中,散列分配值用于表征分表Ti所散列至对应的调度单元的编号Tpos:

Tpos=(TCount+offset)%tgCount,tgCount=totalChannel/tgChannel,其中,TCount为任意一个分库中每个分表Ti的编号,offset为每个分库向对应的调度单元分配的偏移量,初始值为0,totalChannel为总并发粒度,tgChannel为单元并发粒度。

可选地,任意一个分库向对应的调度单元分配的偏移量可以为该分库对应前一个分库最后一个分表Tn的lastOffset,例如A分库最后一个分表T4de的lastOffset为1,则B分库的偏移量BOffset=lastOffset=1,在计算得到每个调度单元的数量之后,可以根据公式Tpos=(TCount+offset)%tgCount,对每个分库中每个分表对应的调度单元分配的编号TGi。

结合图3所示,在一种可选的实施例中,分库A、分库B和分库C的编号分别为0,1,和2,分库A的偏移量Aoffset=0,分表AT1对应的调度单元的编号为TGi=(1+Aoffset)%3=1,依次计算出分库A中其他分表对应的调度单元的编号,lastOffset=4%3=1,分库B的偏移量Boffset=lastOffset=1,则分表BT1对应的调度单元的编号为TGi=(1+Boffset)%3=2,依次可以得到3个分库中每个分库对应的调度单元的编号。

步骤S255,n个分表分别按照计算得到的散列分配值散列至对应的调度单元。

可选地,在计算得到n个分表对应的调度单元分配的编号TGi之后,将n个分表散列至对应的调度单元。

结合图3所示,在一种可选的实施例中,基于步骤S253的计算方法,可以将分库A中的分表T1、分表T2、分表T3和分表T4,分库B中的分表T1和分表T2,分库C中的分表T1、分表T2、分表T3和分表T4散列到对应的调度单元中,散列结果可以是分表AT3、分表BT2和分表CT3对应散列至调度单元TG0,分表AT1、分表AT4、分表CT1和分表CT4对应散列至调度单元TG1,分表AT2、分表BT1和分表CT2对应散列至调度单元TG2。

由上可知,在本申请上述实施例中,按照预先配置的总并发粒度从多个分库中调取n个分表之后,可以根据预先配置的总并发粒度和单元并发粒度,确定调度单元的数量,并对每个调度单元分配对应的编号,并通过如下公式计算得到每个分库中的每个分表所对应的调度单元的编号,实现将分库分表的任务进行切分的目的,将分库分表的任务均匀的分散到不同的调度单元中,避免现有技术中分库分表的任务顺序传输 造成的资源浪费。

在本申请上述实施例中,在执行步骤S27,将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置的过程中,步骤S22701,实时获取多个分库中除n个分表之外的m个分表,步骤S2703,按照总并发粒度将m个分表采用散列分配方式散列至不同的调度单元,步骤S2705,如果调度单元的线程被占满的情况下,将分配至对应的调度单元的分表放置在对应的调度单元的等待队列中,在调度单元的至少一个线程被释放之后,将等待队列中的分表调度至对应的调度单元中。

可选地,将按照预先配置的总并发粒度从所述多个分库中调取n个分表并发传输至目标位置时,将多个分库中未传输的多个分表散列至不同的调度单元,如果调度单元的线程被占满,则将散列后的分表放置在等待队列中,直到调度单元中任意一个线程被释放之后,才能被调度单元并发传输至目标位置,如果调度单元的线程未被占满,则散列后的分表直接被调度单元并发传输至目标位置。

仍旧结合图3所示,在一种可选的方案中,预先配置的总并发粒度可以为9,按照总并发粒度提取的分表为分表AT1、分表AT2、分表AT3、分表AT4、分表BT1、分表BT2、分表CT1、分表CT2和分表CT3。此时,三个分库中剩余的未被传输的分表为分表CT4,经过散列分配,该分表CT4应该被分配至调度单元TG1,由于调度单元TG1线程被占满,因此先将该分表CT4进入对调度单元TG1的等待队列,如图3中虚线所示。等待分表AT1、AT4和CT1中任意一个分表被传输至目标位置,线程释放之后,等待队列中的分表CT4被调度至调度单元TG1中,并发传输至目标位置。

由上可知,在本申请上述实施例中,在n个分表并发传输至目标位置的过程中,获取多个分库中其余的m个分表,在散列分配之后分配给对应的调度单元,如果调度单元线程被占满,则进入等待队列等待调度单元的至少一个线程被释放,实现切分分配分表的目的,在线程全部被占用的情况下进入等待队列,在至少一个线程释放后进入调度单元,保证并发传输分库分表的任务时资源最大化利用。

需要说明的是,如果相同分库不同分表的表的记录数基本相同,抽取时间相差不大,那么通过上述实施例就可以达到目的,使分库分表任务的DB抽取压力均衡,但是这种任务只存在于理想情况下,大多数任务相同分库不同分表的记录数不会保持一致,抽取时间也无法预测,这时候需要调度模块去做一个控制调度,选出最优解。

在本申请上述实施例中,在步骤S27,将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置之后,上述方法还包括步骤S271至步骤S275:

步骤S271,在任意一个调度单元中存在空闲的线程的情况下,获取每个分库的当 前并发数,其中,当前并发数用于表征分库中已经被调度至对应的调度单元中的分表数量。

可选地,上述每个分库的当前并发数可以保存在线程并发管理器(TC-MGR,Thread-Concurrency-Manager的简写)中,在启动线程时,将调度模块中线程对应的分库的并发数加1,如果线程执行完毕,则将线程并发管理器中对应的分库的并发数减1,这两个过程标记为同步(synchronized),线程之间互斥访问,为方便将上述两个成为启动通道(holdChannel)和释放通道(releaseChannel)。采用贪心算法,在需要启动线程时,获取调度模块中的每个分库的当前并发数。

如图5所示,在一种可选的方案中,线程并发管理器中记录了分库A、分库B和分库C的当前并发数TAC、TAB和TAC,分库A的当前并发数TAC=X,分库B的当前并发数TBC=Y,分库C的当前并发数TCC=Z,调度管理单元(即上述的调度单元)包括3个通道(即上述的线程),通道1、通道2和通道3。调度单元TG0在3个线程中有至少一个线程空闲的情况下,例如线程1空闲,获取调度模块中每个分库的当前并发数。

步骤S273,根据每个分库的当前并发数,从任意一个调度单元的等待队列中调度对应数量的分表。

可选地,当线程被释放之后,获取每个分库的当前并发数,并根据每个分库的当前并发数调度单元的等待队列中相应数量的分表,例如,如果调度单元释放了两个线程,则根据每个分库的当前并发数,调度该调度单元的等待队列中两个分表。

在一种可选的方案中,如果线程并发管理器中记录的当下分库A的当前并发数可以为3,分库B的当前并发数可以为1,分库C的当前并发数可以为2,此时如果需要启动的线程个数为2,则可以从调度单元的等待队列中调度两个分库B的分表,如果等待队列中只有一个分库B的分表,则进一步调度等待队列中一个分库C的分表。如果调度单元TG1的等待队列中保存了分库B的一个分表T4和其他分库的分表,此时,可以根据每个分库的并发数的比例,以及线程被释放,优先选则调取分表T4进入调度单元TG1,如果TG1的线程被全部释放,则可以调取等待队列中除T4以外的其他分表。其他任意一个调度单元的调取规则同理。

步骤S275,将从对应的等待队列中调度对应数量的分表并发传输至目标位置。

可选地,在从任意一个调度单元的等待队列中调度对应数量的分表之后,将该对应数量的分表并发传输至目标位置。

由上可知,在本申请上述实施例中,在任意一个调度单元中存在空闲的线程的情况下,获取每个分库的当前并发数,并根据每个分库的当前并发数,从任意一个调度 单元的等待队列中调度对应数量的分表,并发传输至目标位置,采用贪心算法,每当调度单元有通道线程饥饿时就先做启动通道,从而实现从局部最优到全局最优,进一步实现均衡并发传输分库分表的任务。

在本申请上述实施例中,步骤S273,根据每个分库的当前并发数,从任意一个调度单元的等待队列中调度对应数量的分表,包括如下步骤S2731至步骤S2735:

步骤S2731,按照每个分库的当前并发数进行排序,确定属于不同分库的分表的调度优先级,其中,分库的当前并发数越低,当前并发数越低的分库中的分表的调度优先级越高。

可选地,获取到每个分库的当前并发数之后,将每个分库按照当前并发数进行升序排序,当前并发数最低的分库中的分表优先级最高,当前并发数最高的分库中的分配的优先级最低,确定调度单元的等待队列中每个分库分表的调度优先级。

步骤S2733,根据任意一个调度单元中存在的空闲线程数量,确定调度数量。

可选地,在空闲线程数量小于等于调度单元的等待队列中的分表个数时,确定调度数量为空闲线程数量,在空闲线程数量大于调度单元的等待队列中的分表个数时,确定调度数量为调度单元的等待队列中的分表个数。

步骤S2735,在确定第一分库中的分表为调度优先级最高的分表之后,按照调度数量从等待队列中调度属于第一分库的分表。

可选地,在确定属于不同分库的分表的调度优先级和调度数量之后,从调度单元的等待队列中调度符合调度数量和调度优先级的分表。

在一种可选的方案中,分库A的当前并发数可以为3,分库B的当前并发数可以为1,分库C的当前并发数可以为2,通过分析三个分库的并发度的比例可以确定分库B的当前并发数最低,表示在之前的并发过程中,分库B中分表的分发或同步效率最低,因此分库B的分表的调度优先级最高,系统需要尽快处理分库B中的分表,而分库A的当前并发数最高,因此分库A的分表的调度优先级最低。调度单元的等待队列中有分表AT5,分表AT6,分表BT3和分表CT5,在有一个线程空闲的情况下,按照调度优先级的分析结果,此时调度单元从等待队列中调度分表BT3进行同步。

由上可知,在本申请上述实施例中,获取每个分库的当前并发数之后,根据排序结果确定调度单元中每个分表的调度优先级,并根据空闲线程数从调度单元的等待队列中调度对应调度优先级和对应数量的分表,从而实现在分表记录数均不相同的情况下,根据每个分库的当前并发数选取最优解,使分库分表任务的抽取压力均衡。

需要说明的是,为了获取每个分库的当前并发数之后,根据排序结果确定调度单元中每个分表的调度优先级,线程并发管理其器中还需要保存每个调度管理单元的分库使用情况。

在本申请上述实施例中,在步骤S2735,按照调度数量从等待队列中调度对应数量的分表之前,上述方法还包括步骤S27351至步骤S27353:

步骤S27351,读取等待队列中属于第一分库的分表的数量。

步骤S27353,判断属于第一分库的分表的数量是否大于等于调度数量。

可选地,如果判断属于第一分库的分表的数量大于等于调度数量,则进入步骤S2735,按照调度数量从等待队列中调度对应数量的分表;如果判断属于第一分库的分表的数量小于调度数量,则按照调度数量从等待队列中调度属于第一分库和属于其他分库的分表,其中,其他分库为当前并发数大于第一分库的分库。

在一种可选的方案中,分库A的当前并发数可以为3,分库B的当前并发数可以为1,分库C的当前并发数可以为2,通过分析三个分库的并发度的比例可以确定分库B的当前并发数最低,因此分库B的分表的调度优先级最高,分库A的当前并发数最高,因此分库A的分表的调度优先级最低,分库C的当前并发数位于两者之间,因此分库C的分表的调度优先级也位于两者之间。调度单元TG0的等待队列中有分表AT5,分表AT6,分表BT3和分表CT5,按照上述一种可选方案所确定的调度优先级的调度规则,可以读取等待队列中属于分库B的分表数量为1,属于分库C的分表数量为1,属于分库A的分表数量为2,在调度单元TG0有两个线程空闲的情况下,调度单元TG0从等待队列中调度分表BT3和CT5。

在另一种可选的方案中,分库A的当前并发数可以为3,分库B的当前并发数可以为1,分库C的当前并发数可以为2,通过分析三个分库的并发度的比例可以确定分库B的当前并发数最低,因此分库B的分表的调度优先级最高,分库A的当前并发数最高,因此分库A的分表的调度优先级最低,分库C的当前并发数位于两者之间,因此分库C的分表的调度优先级也位于两者之间。调度单元的等待队列中有分表AT5,分表AT6,分表BT3和分表CT5。按照上述另一种可选方案所确定的调度优先级的调度规则,可以读取等待队列中属于分库B的分表数量为1,属于分库C的分表数量为1,属于分库A的分表数量为2,在调度单元TG0有三个线程空闲的情况下,调度单元TG0从等待队列中调度分表BT3、分表CT5和分表AT5。

在又一种可选的方案中,分库A的当前并发数可以为3,分库B的当前并发数可以为2,分库C的当前并发数可以为2,通过分析三个分库的并发度的比例可以确定分 库B和分库C的当前并发数最低,因此分库B和分库C的分表的调度优先级最高,分库A的当前并发数最高,因此分库A的分表的调度优先级最低。调度单元的等待队列中有分表AT5,分表AT6,分表BT3,分表BT4,分表BT5,分表CT5和分表CT6。按照上述又一种可选方案所确定的调度优先级的调度规则,可以读取等待队列中属于分库B的分表数量为3,属于分库C的分表数量为2,属于分库A的分表数量为2,在调度单元TG0有三个线程空闲的情况下,调度单元TG0从等待队列中调度分表BT3、分表BT4和分表CT5。

由上可知,在本申请上述实施例中,在判断读取到的属于第一分库的分表的数量大于等于调度数量的情况下,按照调度数量从等待队列中调度对应数量的分表;在判断读取到的属于第一分库的分表的数量小于调度数量的情况下,在判断读取到的属于第一分库的分表的数量大于等于调度数量的情况下,按照调度数量从等待队列中调度属于第一分库和属于其他分库的分表,从而实现动态调度均衡,降低分库分表任务对抽取段DB的压力,减少长尾任务。

根据本申请上述实施例,对散列至不同的所述调度单元的分表标记分库标识,所述分库标识用于表征所述分表原始对应的分库。

下面结合图4、图5和图6详细介绍本申请的一种优选实施例。

如图4,图5和图6所示,以任务集合包含多个分库和多个分表为应用场景,提供了一种可选的基于分库分表的任务传输方法,该方法可以包括如下步骤S61至步骤S67:

步骤S61,获取分库分表的任务集合。

可选地,为了获取分库分表的任务集合,调度终端133从配置文件中读取分库分表的名称,并从源数据终端131的分库分表中提取待传输的任务集合,任务集合中包括多个分库以及分库对应的分表。

在一种可选的方案中,配置文件中包含分库A、分库B和分库C,分库A可以包含4个分表,分别是分表T1、分表T2、分表T3和分表T4,分库B可以包含2个分表,分别是分表T1和分表T2,分库C可以包含4个分表,分别是分表T1、分表T2、分表T3和分表T4。

步骤S63,将分库分表的任务集合散列至多个调度管理单元中。

可选地,将分库分表的任务切分成n个单个分表粒度的任务(即上述的n个分表),并按照用户配置的总并发粒度和单个调度管理单元(即上述的调度单元)的并发粒度 (即上述的预先配置的总并发粒度和单元并发粒度),将任务按照分库均匀的分配到调度管理单元中,并对每个任务属于哪个分库打标。

在一种可选的方案中,调度终端133按照用户配置的总并发粒度从多个分库中调取n个分表,按照用户配置的总并发粒度和单个调度管理单元的并发粒度确定调度管理单元的个数,并对每个调度管理单元进行编号;计算n个单个分表粒度的任务中每个任务对应的调度管理单元的编号,并将n个单个分表粒度的任务散列分配到对应调度管理单元中。

在该实施例中,上述步骤S63的实现方式与本申请上述实施例中的步骤S23和步骤S25的实现方式一致,在此不再赘述。

步骤S65,多个调度单元从调度模块中获取最优解。

可选地,最优解等于当前并发数最小的N个分库,且这N个分库在当前TG中还存在未消费的任务(结果按照并发数从小到大排列)(即上述的多个分库中除n个分表之外的m个分表),N为保持通道的请求参数,一般为调度管理单元中当前饥饿的通道数。

在一种可选的方案中,调度模块中保存了分库分表的任务集合中每个分库的当前并发数和每个调度单元对每个分库的使用情况,调度终端133从调度模块中获取每个分库的当前并发数,并将每个分库的当前的并发数进行排序确定每个分库的调度优先级,读取调度单元的空闲线程数量和当前并发数最小的分库中未传输的分表的数量,在空闲线程数量大于分表的数量时,调取当前并发数最小的分库的分表和其他分库的分表;在空闲线程数量小于等于分表的数量时,调取当前并发数最小的分库的分表。

步骤S67,并发传输任务集合至目标位置。

可选地,按照用户配置的总并发粒度和单个调度管理单元的并发粒度,并发传输任务集合,在调度管理单元线程被占满的情况下,将未传输的任务放置在调度管理单元的等待队列中,直到调度管理单元存在空闲线程,则并行发送最优解。

在该实施例中,上述步骤S63的实现方式与本申请上述实施例中的S27的实现方式一致,在此不再赘述。

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

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

实施例2

根据本发明实施例,还提供了一种用于实施上述基于分库分表的任务传输方法的基于分库分表的任务传输装置,如图7所示,该装置包括:抽取模块71,调取模块73,处理模块75和并发模块77。

其中,抽取模块71用于从分库分表中抽取待传输的任务集合,其中,任务集合包括:多个分库,以及每个分库所包含的分表。调取模块73用于按照预先配置的总并发粒度从多个分库中共调取n个分表,n等于总并发粒度。处理模块75用于将调取到的n个分表采用散列分配方式散列至不同的调度单元,其中,预先配置每个调度单元的单元并发粒度相同。并发模块77用于将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置。

此处需要说明的是,上述抽取模块71,调取模块73,处理模块75和并发模块77对应于实施例一中的步骤S21至步骤S27,四个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

本申请上述实施例二公开的方案中,如果希望减小分库分表任务的并行传输,可以在抽取待传输的任务集合之后,按照预先配置的总并发粒度从多个分库中调取n个分表,通过将调取到的n个分表采用散列分配方式散列至不同的调度单元,将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置,本方案可以根据总并发粒度和单元并发粒度对待传输的任务集合进行拆分,以均衡并行传输分库分表的任务。

容易注意到,由于在抽取待传输的任务集合之后,需要在按照预先配置的总并发粒度从多个分库中调取n个分表,并通过将调取到的n个分表采用散列分配方式散列至不同的调度单元,就可以根据散列后的分表并行发送任务集合,达到均衡并发传输分库分表的任务,因此,通过本申请实施例所提供的方案,可以实现基于分库分表的任务传输,这样不仅实现了分库分表的任务传输,而且,在传输分库分表的任务时, 在满足预先配置的总并发粒度的情况下,均衡传输分库分表的任务,因此,可以均衡分库分表中的多个任务,降低并发读取数据的压力,提高并发传输效率。

由此,本申请提供的上述实施例二的方案解决了现有技术中在基于分库分表的任务进行并发传输时,抽取端从分库分表DB中并发读取数据压力过大,导致并发传输分库分表的任务效率低的技术问题。

在本申请上述实施例中,如图8所示,上述装置还包括:第一确定模块81和计算模块83,其中,处理模块75包括:第一散列分配模块85。

其中,第一确定模块81用于根据总并发粒度和单元并发粒度,确定调度单元的数量,并对每个调度单元分配对应的编号。计算模块83用于通过如下公式计算得到任意一个分库中的每个分表Ti的散列分配值,其中,散列分配值用于表征分表Ti所散列至对应的调度单元的编号Tpos:Tpos=(TCount+offset)%tgCount,tgCount=totalChannel/tgChannel,其中,TCount为任意一个分库中每个分表Ti的编号,offset为每个分库向对应的调度单元分配的偏移量,初始值为0,totalChannel为总并发粒度,tgChannel为单元并发粒度。第一散列分配模块85用于n个分表分别按照计算得到的散列分配值散列至对应的调度单元。

此处需要说明的是,上述第一确定模块81,计算模块83和第一散列分配模块85对应于实施例一中的步骤S251至步骤S255,该模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

在本申请上述实施例中,如图9所示,上述装置还包括:第一获取模块91,第二散列分配模块93和子处理模块95。

其中,第一获取模块91用于实时获取多个分库中除n个分表之外的m个分表。第二散列分配模块93用于按照总并发粒度将m个分表采用散列分配方式散列至不同的调度单元。子处理模块95用于如果调度单元的线程被占满的情况下,将分配至对应的调度单元的分表放置在对应的调度单元的等待队列中,在调度单元的至少一个线程被释放之后,将等待队列中的分表调度至对应的调度单元中。

此处需要说明的是,上述第一获取模块91,第二散列分配模块93和子处理模块95对应于实施例一中的步骤S2701至步骤S2705,该模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

在本申请上述实施例中,如图10所示,上述装置还包括:第二获取模块101,调 度模块103和传输模块105。

其中,第二获取模块101用于在任意一个调度单元中存在空闲的线程的情况下,获取每个分库的当前并发数,其中,当前并发数用于表征分库中已经被调度至对应的调度单元中的分表数量。调度模块103用于根据每个分库的当前并发数,从任意一个调度单元的等待队列中调度对应数量的分表。传输模块105用于将从对应的等待队列中调度对应数量的分表并发传输至目标位置。

此处需要说明的是,上述第二获取模块101,调度模块103和传输模块105对应于实施例一中的步骤S271至步骤S275,该模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

在本申请上述实施例中,如图11所示,调度模块103包括:排序模块111,第二确定模块113和子调度模块115。

其中,排序模块111用于按照每个分库的当前并发数进行排序,确定属于不同分库的分表的调度优先级,其中,分库的当前并发数越低,当前并发数越低的分库中的分表的调度优先级越高。第二确定模块113用于根据任意一个调度单元中存在的空闲线程数量,确定调度数量。子调度模块115用于在确定第一分库中的分表为调度优先级最高的分表之后,按照调度数量从等待队列中调度属于第一分库的分表。

此处需要说明的是,上述排序模块111,第二确定模块113和子调度模块115对应于实施例一中的步骤S2731至步骤S2735,该模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

在本申请上述实施例中,如图12所示,上述装置还包括:读取模块121,判断模块123,第一执行模块125和第二执行模块127。

其中,读取模块121用于读取等待队列中属于第一分库的分表的数量。判断模块123用于判断属于第一分库的分表的数量是否大于等于调度数量。第一执行模块125用于如果大于等于调度数量,则执行子调度模块的功能。第二执行模块127用于如果小于调度数量,则按照调度数量从等待队列中调度属于第一分库和属于其他分库的分表,其中,其他分库为当前并发数大于第一分库的分库。

此处需要说明的是,上述读取模块121,判断模块123,第一执行模块125和第二执行模块127对应于实施例一中的步骤S27351至步骤S27353,该模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是, 上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

实施例3

根据本申请实施例,还提供了一种基于分库分表的任务传输系统,如图13所示,该系统可以包括:源数据终端131,调度终端133和目标终端135。

其中,源数据终端131用于存储分库分表。

调度终端133,与源数据终端131通信,用于从分库分表中抽取待传输的任务集合,其中,任务集合包括:多个分库,以及每个分库所包含的分表,并按照预先配置的总并发粒度从多个分库中共调取n个分表,n等于总并发粒度,在将调取到的n个分表采用散列分配方式散列至不同的调度单元之后,将每个调度单元中包含的分表按照单元并发粒度并发传输,其中,预先配置每个调度单元的单元并发粒度相同。

可选地,一个任务集合可以包括多个分库,每个分库可以包含多个分表,且每个分表可以记录有多条数据信息,该数据信息可以是注册用户数据信息、访问网页数据信息、购买商品数据信息等等。从分库分表中抽取待传输的任务集合之后,可以根据抽取顺序进行编号。

在一种可选的方案中,在从分库分表中抽取待传输的任务集合之前,可以获取配置文件,该配置文件中记录带传输的多个分库的名称以及每个分库中包含的分表的名称。在读取配置文件之后,按照读取到的多个分库的名称以及多个分表的名称,从源数据库的分库分表中抽取带传输的多个分库以及每个分库包含的分表。

结合图3所示,在一个可选的实施例中,任务集合可以包含3个分库,分别是分库A、分库B和分库C,分库A可以包含4个分表,分别是分表T1、分表T2、分表T3和分表T4,分库B可以包含2个分表,分别是分表T1和分表T2,分库C可以包含4个分表,分别是分表T1、分表T2、分表T3和分表T4。

可选地,总开发粒度(totalChannel)表示同时并发的任务个数,可以按照预先配置的总并发粒度,依次从任务集合中顺序抽取满足总开发粒度数的n个分表。上述预先配置的总并发粒度可以按照用户的实际需求进行配置,也可以根据数据库的并发能力进行配置。

仍以上述抽取的任务集合为例,在一种可选的方案中,预先配置的总开发粒度可以为9,按照总开发粒度依次从分库A中提取分表T1、分表T2、分表T3和分表T4,从分库B中提取分表T1和分表T2,从分库C中提取分表T1、分表T2和分表T3。提取的分表个数与总开发粒度相同。

可选地,在按照预先配置的总开发粒度从多个分库中调取n个分表之后,按照散列分配方式,将n个分表依次散列至不同的调度单元中。上述预先配置的每个调度单元的单元并发粒度(tgChannel)用于表示每个调度单元同时并发的任务个数,单元并发粒度小于等于总并发粒度。

如图4所示,在一种可选的方案中,上述调度单元可以是调度管理模块(TG,taskGroup的简写),分库分表任务可以包括分库A、分库B和分库C,每个分库都可以包括n个分表,每一个分表都是一个待传输的任务,将3n个分表散列到n个调度管理单元中,每个调度管理单元可以包括三个分表。

仍以上述抽取的任务集合为例,在一种可选的方案中,预先配置每个调度单元的单元并发粒度可以为3,将提取的9个分表散列至不同的调度单元,调度单元1可以包括:AT3、BT2和CT3,调度单元2可以包括:AT1、AT4和CT1,调度单元3可以包括:AT2、BT1和CT2。

需要说明的是,上述散列方式将相同分库中的分表散列在不同的调度单元中,尽量满足不同分库中的多个分表均衡并发,减小抽取段DB的并发压力。

目标终端135,与调度终端133通信,用于接收调度终端并发传输来的任务集合。

可选地,上述目标终端可以是目标数据库,用于存储提取的数据信息。将调取到的n个分表采用散列分配方式散列至不同的调度单元之后,每个调度单元将散列后的n个分表按照单元并发粒度并发传输至目标数据库。

本申请上述实施例三公开的方案中,如果希望减小分库分表任务的并行传输,可以在抽取待传输的任务集合之后,按照预先配置的总并发粒度从多个分库中调取n个分表,通过将调取到的n个分表采用散列分配方式散列至不同的调度单元,将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置,本方案可以根据总并发粒度和单元并发粒度对待传输的任务集合进行拆分,以均衡并行传输分库分表的任务。

容易注意到,由于在抽取待传输的任务集合之后,需要在按照预先配置的总并发粒度从多个分库中调取n个分表,并通过将调取到的n个分表采用散列分配方式散列至不同的调度单元,就可以根据散列后的分表并行发送任务集合,达到均衡并发传输分库分表的任务,因此,通过本申请实施例所提供的方案,可以实现基于分库分表的任务传输,这样不仅实现了分库分表的任务传输,而且,在传输分库分表的任务时,在满足预先配置的总并发粒度的情况下,均衡传输分库分表的任务,因此,可以均衡分库分表中的多个任务,降低并发读取数据的压力,提高并发传输效率。

由此,本申请提供的上述实施例三的方案解决了现有技术中在基于分库分表的任 务进行并发传输时,抽取端从分库分表DB中并发读取数据压力过大,导致并发传输分库分表的任务效率低的技术问题。

在本申请提供的一种可选实施例中,上述调度终端133还用于根据总并发粒度和单元并发粒度,确定调度单元的数量,并对每个调度单元分配对应的编号,通过如下公式计算得到任意一个分库中的每个分表Ti的散列分配值,其中,散列分配值用于表征分表Ti所散列至对应的调度单元的编号Tpos:Tpos=(TCount+offset)%tgCount,tgCount=totalChannel/tgChannel,其中,TCount为任意一个分库中每个分表Ti的编号,offset为每个分库向对应的调度单元分配的偏移量,初始值为0,totalChannel为总并发粒度,tgChannel为单元并发粒度,并将n个分表分别按照计算得到的散列分配值散列至对应的调度单元。

可选地,在按照预先配置的总并发粒度从多个分库中调取n个分表之后,可以根据预先配置的总并发粒度和单元并发粒度,根据公式tgCount=totalChannel/tgChannel得到调度单元的数量,然后对每个调度单元分配对应的编号。

结合图3所示,在一种可选的方案中,总并发粒度T可以为9,单元并发粒度t可以为3,则调度单元数量tgCount=totalChannel/tgChannel=3,3个调度单元的编号分别为TG0、TG1和TG2。

可选地,任意一个分库向对应的调度单元分配的偏移量可以为该分库对应前一个分库最后一个分表Tn的lastOffset,例如A分库最后一个分表T4de的lastOffset为1,则B分库的偏移量BOffset=lastOffset=1,在计算得到每个调度单元的数量之后,可以根据公式Tpos=(TCount+offset)%tgCount,对每个分库中每个分表对应的调度单元分配的编号TGi。

结合图3所示,在一种可选的实施例中,分库A、分库B和分库C的编号分别为0,1,和2,分库A的偏移量Aoffset=0,分表AT1对应的调度单元的编号为TGi=(1+Aoffset)%3=1,依次计算出分库A中其他分表对应的调度单元的编号,lastOffset=4%3=1,分库B的偏移量Boffset=lastOffset=1,则分表BT1对应的调度单元的编号为TGi=(1+Boffset)%3=2,依次可以得到3个分库中每个分分库对应的调度单元的编号。

可选地,在计算得到n个分表对应的调度单元分配的编号TGi之后,将n个分表散列至对应的调度单元。

结合图3所示,在一种可选的实施例中,基于步骤S253的计算方法,可以将分库A中的分表T1、分表T2、分表T3和分表T4,分库B中的分表T1和分表T2,分库 C中的分表T1、分表T2、分表T3和分表T4散列到对应的调度单元中,散列结果可以是分表AT3、分表BT2和分表CT3对应散列至调度单元TG0,分表AT1、分表AT4、分表CT1和分表CT4对应散列至调度单元TG1,分表AT2、分表BT1和分表CT2对应散列至调度单元TG2。

由上可知,在本申请上述实施例中,按照预先配置的总并发粒度从多个分库中调取n个分表之后,可以根据预先配置的总并发粒度和单元并发粒度,确定调度单元的数量,并对每个调度单元分配对应的编号,并通过如下公式计算得到每个分库中的每个分表所对应的调度单元的编号,实现将分库分表的任务进行切分的目的,将分库分表的任务均匀的分散到不同的调度单元中,避免现有技术中分库分表的任务顺序传输造成的资源浪费。

在本申请提供的一种可选实施例中,上述调度终端133还用于将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置的过程中,,实时获取多个分库中除n个分表之外的m个分表,并按照总并发粒度将m个分表采用散列分配方式散列至不同的调度单元,如果调度单元的线程被占满的情况下,将分配至对应的调度单元的分表放置在对应的调度单元的等待队列中,在调度单元的至少一个线程被释放之后,将等待队列中的分表调度至对应的调度单元中。

可选地,将按照预先配置的总并发粒度从所述多个分库中调取n个分表并发传输至目标位置时,将多个分库中未传输的多个分表散列至不同的调度单元,如果调度单元的线程被占满,则将散列后的分表放置在等待队列中,直到调度单元中任意一个线程被释放之后,才能被调度单元并发传输至目标位置,如果调度单元的线程未被占满,则散列后的分表直接被调度单元并发传输至目标位置。

仍旧结合图3所示,在一种可选的方案中,预先配置的总开发粒度可以为9,按照总开发粒度提取的分表为分表AT1、分表AT2、分表AT3、分表AT4、分表BT1、分表BT2、分表CT1、分表CT2和分表CT3。此时,三个分库中剩余的未被传输的分表为分表CT4,经过散列分配,该分表CT4应该被分配至调度单元TG1,由于调度单元TG1线程被占满,因此先将该分表CT4进入对调度单元TG1的等待队列,如图3中虚线所示。等待分表AT1、AT4和CT1中任意一个分表被传输至目标位置,线程释放之后,等待队列中的分表CT4被调度至调度单元TG1中,并发传输至目标位置。

由上可知,在本申请上述实施例中,在n个分表并发传输至目标位置的过程中,获取多个分库中其余的m个分表,在散列分配之后分配给对应的调度单元,如果调度单元线程被占满,则进入等待队列等待调度单元的至少一个线程被释放,实现切分分配分表的目的,在线程全部被占用的情况下进入等待队列,在至少一个线程释放后进 入调度单元,保证并发传输分库分表的任务时资源最大化利用。

需要说明的是,如果相同分库不同分表的表的记录数基本相同,抽取时间相差不大,那么通过上述实施例就可以达到目的,使分库分表任务的DB抽取压力均衡,但是这种任务只存在于理想情况下,大多数任务相同分库不同分表的记录数不会保持一致,抽取时间也无法预测,这时候需要调度模块去做一个控制调度,选出最优解。

在本申请提供的一种可选实施例中,上述调度终端133还用于将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置之后,在任意一个调度单元中存在空闲的线程的情况下,获取每个分库的当前并发数,其中,当前并发数用于表征分库中已经被调度至对应的调度单元中的分表数量,并根据每个分库的当前并发数,从任意一个调度单元的等待队列中调度对应数量的分表,将从对应的等待队列中调度对应数量的分表并发传输至目标位置。

可选地,上述每个分库的当前并发数可以保存在线程并发管理器(TC-MGR,Thread-Concurrency-Manager的简写)中,在启动线程时,将调度模块中线程对应的分库的并发数加1,如果线程执行完毕,则将线程并发管理器中对应的分库的并发数减1,这两个过程标记为同步(synchronized),线程之间互斥访问,为方便将上述两个成为启动通道(holdChannel)和释放通道(releaseChannel)。采用贪心算法,在需要启动线程时,获取调度模块中的每个分库的当前并发数。

如图5所示,在一种可选的方案中,线程并发管理器中记录了分库A、分库B和分库C的当前并发数TAC、TAB和TAC,分库A的当前并发数TAC=X,分库B的当前并发数TBC=Y,分库C的当前并发数TCC=Z,调度管理单元(即上述的调度单元)包括3个通道(即上述的线程),通道1、通道2和通道3。调度单元TG0在3个线程中有至少一个线程空闲的情况下,例如线程1空闲,获取调度模块中每个分库的当前并发数。

可选地,当线程被释放之后,获取每个分库的当前并发数,并根据每个分库的当前并发数调度单元的等待队列中相应数量的分表,例如,如果调度单元释放了两个线程,则根据每个分库的当前并发数,调度该调度单元的等待队列中两个分表。

在一种可选的方案中,如果线程并发管理器中记录的当下分库A的当前并发数可以为3,分库B的当前并发数可以为1,分库C的当前并发数可以为2,此时如果需要启动的线程个数为2,则可以从调度单元的等待队列中调度两个分库B的分表,如果等待队列中只有一个分库B的分表,则进一步调度等待队列中一个分库C的分表。如果调度单元TG1的等待队列中保存了分库B的一个分表T4和其他分库的分表,此时,可以根据每个分库的并发数的比例,以及线程被释放,优先选则调取分表T4进入调度 单元TG1,如果TG1的线程被全部释放,则可以调取等待队列中除T4以外的其他分表。其他任意一个调度单元的调取规则同理。

可选地,在从任意一个调度单元的等待队列中调度对应数量的分表之后,将该对应数量的分表并发传输至目标位置。

由上可知,在本申请上述实施例中,在任意一个调度单元中存在空闲的线程的情况下,获取每个分库的当前并发数,并根据每个分库的当前并发数,从任意一个调度单元的等待队列中调度对应数量的分表,并发传输至目标位置,采用贪心算法,每当调度单元有通道线程饥饿时就先做启动通道,从而实现从局部最优到全局最优,进一步实现均衡并发传输分库分表的任务。

在本申请提供的一种可选实施例中,上述调度终端133还用于按照每个分库的当前并发数进行排序,确定属于不同分库的分表的调度优先级,其中,分库的当前并发数越低,当前并发数越低的分库中的分表的调度优先级越高,并根据任意一个调度单元中存在的空闲线程数量,确定调度数量,在确定第一分库中的分表为调度优先级最高的分表之后,按照调度数量从等待队列中调度属于第一分库的分表。

可选地,获取到每个分库的当前并发数之后,将每个分库按照当前并发数进行升序排序,当前并发数最低的分库中的分表优先级最高,当前并发数最高的分库中的分配的优先级最低,确定调度单元的等待队列中每个分库分表的调度优先级。

可选地,在空闲线程数量小于等于调度单元的等待队列中的分表个数时,确定调度数量为空闲线程数量,在空闲线程数量大于调度单元的等待队列中的分表个数时,确定调度数量为调度单元的等待队列中的分表个数。

可选地,在确定属于不同分库的分表的调度优先级和调度数量之后,从调度单元的等待队列中调度符合调度数量和调度优先级的分表。

在一种可选的方案中,分库A的当前并发数可以为3,分库B的当前并发数可以为1,分库C的当前并发数可以为2,通过分析三个分库的并发度的比例可以确定分库B的当前并发数最低,表示在之前的并发过程中,分库B中分表的分发或同步效率最低,因此分库B的分表的调度优先级最高,系统需要尽快处理分库B中的分表,而分库A的当前并发数最高,因此分库A的分表的调度优先级最低。调度单元的等待队列中有分表AT5,分表AT6,分表BT3和分表CT5,在有一个线程空闲的情况下,按照调度优先级的分析结果,此时调度单元从等待队列中调度分表BT3进行同步。

由上可知,在本申请上述实施例中,获取每个分库的当前并发数之后,根据排序结果确定调度单元中每个分表的调度优先级,并根据空闲线程数从调度单元的等待队 列中调度对应调度优先级和对应数量的分表,从而实现在分表记录数均不相同的情况下,根据每个分库的当前并发数选取最优解,使分库分表任务的抽取压力均衡。

需要说明的是,为了获取每个分库的当前并发数之后,根据排序结果确定调度单元中每个分表的调度优先级,线程并发管理其器中还需要保存每个调度管理单元的分库使用情况。

在本申请提供的一种可选实施例中,上述调度终端133还用于按照调度数量从等待队列中调度对应数量的分表之前,读取等待队列中属于第一分库的分表的数量,并判断属于第一分库的分表的数量是否大于等于调度数量,如果判断属于第一分库的分表的数量大于等于调度数量,则按照调度数量从等待队列中调度对应数量的分表;如果判断属于第一分库的分表的数量小于调度数量,则按照调度数量从等待队列中调度属于第一分库和属于其他分库的分表,其中,其他分库为当前并发数大于第一分库的分库。

在一种可选的方案中,分库A的当前并发数可以为3,分库B的当前并发数可以为1,分库C的当前并发数可以为2,通过分析三个分库的并发度的比例可以确定分库B的当前并发数最低,因此分库B的分表的调度优先级最高,分库A的当前并发数最高,因此分库A的分表的调度优先级最低,分库C的当前并发数位于两者之间,因此分库C的分表的调度优先级也位于两者之间。调度单元TG0的等待队列中有分表AT5,分表AT6,分表BT3和分表CT5,按照上述一种可选方案所确定的调度优先级的调度规则,可以读取等待队列中属于分库B的分表数量为1,属于分库C的分表数量为1,属于分库A的分表数量为2,在调度单元TG0有两个线程空闲的情况下,调度单元TG0从等待队列中调度分表BT3和CT5。

在另一种可选的方案中,分库A的当前并发数可以为3,分库B的当前并发数可以为1,分库C的当前并发数可以为2,通过分析三个分库的并发度的比例可以确定分库B的当前并发数最低,因此分库B的分表的调度优先级最高,分库A的当前并发数最高,因此分库A的分表的调度优先级最低,分库C的当前并发数位于两者之间,因此分库C的分表的调度优先级也位于两者之间。调度单元的等待队列中有分表AT5,分表AT6,分表BT3和分表CT5。按照上述另一种可选方案所确定的调度优先级的调度规则,可以读取等待队列中属于分库B的分表数量为1,属于分库C的分表数量为1,属于分库A的分表数量为2,在调度单元TG0有三个线程空闲的情况下,调度单元TG0从等待队列中调度分表BT3、分表CT5和分表AT5。

在又一种可选的方案中,分库A的当前并发数可以为3,分库B的当前并发数可以为2,分库C的当前并发数可以为2,通过分析三个分库的并发度的比例可以确定分 库B和分库C的当前并发数最低,因此分库B和分库C的分表的调度优先级最高,分库A的当前并发数最高,因此分库A的分表的调度优先级最低。调度单元的等待队列中有分表AT5,分表AT6,分表BT3,分表BT4,分表BT5,分表CT5和分表CT6。按照上述又一种可选方案所确定的调度优先级的调度规则,可以读取等待队列中属于分库B的分表数量为3,属于分库C的分表数量为2,属于分库A的分表数量为2,在调度单元TG0有三个线程空闲的情况下,调度单元TG0从等待队列中调度分表BT3、分表BT4和分表CT5。

由上可知,在本申请上述实施例中,在判断读取到的属于第一分库的分表的数量大于等于调度数量的情况下,按照调度数量从等待队列中调度对应数量的分表;在判断读取到的属于第一分库的分表的数量小于调度数量的情况下,在判断读取到的属于第一分库的分表的数量大于等于调度数量的情况下,按照调度数量从等待队列中调度属于第一分库和属于其他分库的分表,从而实现动态调度均衡,降低分库分表任务对抽取段DB的压力,减少长尾任务。

在本申请提供的一种可选实施例中,上述调度终端133还用于对散列至不同的所述调度单元的分表标记分库标识,所述分库标识用于表征所述分表原始对应的分库。

实施例4

本发明的实施例可以提供一种计算机终端,该计算机终端可以是计算机终端群中的任意一个计算机终端设备。可选地,在本实施例中,上述计算机终端也可以替换为移动终端等终端设备。

可选地,在本实施例中,上述计算机终端可以位于计算机网络的多个网络设备中的至少一个网络设备。

在本实施例中,上述计算机终端可以执行应用程序的漏洞检测方法中以下步骤的程序代码:从分库分表中抽取待传输的任务集合,其中,任务集合包括:多个分库,以及每个分库所包含的分表;按照预先配置的总并发粒度从多个分库中调取n个分表,n等于总并发粒度;将调取到的n个分表采用散列分配方式散列至不同的调度单元,其中,预先配置每个调度单元的单元并发粒度相同;将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置。

可选地,图14是根据本发明实施例的一种计算机终端的结构框图。如图14所示,该计算机终端A可以包括:一个或多个(图中仅示出一个)处理器、存储器、以及传输装置。

其中,存储器可用于存储软件程序以及模块,如本发明实施例中的安全漏洞检测 方法和装置对应的程序指令/模块,处理器通过运行存储在存储器内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的系统漏洞攻击的检测方法。存储器可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器可进一步包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至终端A。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

处理器可以通过传输装置调用存储器存储的信息及应用程序,以执行下述步骤:从分库分表中抽取待传输的任务集合,其中,任务集合包括:多个分库,以及每个分库所包含的分表;按照预先配置的总并发粒度从多个分库中调取n个分表,n等于总并发粒度;将调取到的n个分表采用散列分配方式散列至不同的调度单元,其中,预先配置每个调度单元的单元并发粒度相同;将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置。

可选的,上述处理器还可以执行如下步骤的程序代码:根据总并发粒度和单元并发粒度,确定调度单元的数量,并对每个调度单元分配对应的编号;通过如下公式计算得到任意一个分库中的每个分表Ti的散列分配值,其中,散列分配值用于表征分表Ti所散列至对应的调度单元的编号Tpos:Tpos=(TCount+offset)%tgCount,tgCount=totalChannel/tgChannel,其中,TCount为任意一个分库中每个分表Ti的编号,offset为每个分库向对应的调度单元分配的偏移量,初始值为0,totalChannel为总并发粒度,tgChannel为单元并发粒度;其中,n个分表分别按照计算得到的散列分配值散列至对应的调度单元。

可选的,上述处理器还可以执行如下步骤的程序代码:实时获取多个分库中除n个分表之外的m个分表,并按照总并发粒度将m个分表采用散列分配方式散列至不同的调度单元,其中,如果调度单元的线程被占满的情况下,将分配至对应的调度单元的分表放置在对应的调度单元的等待队列中,在调度单元的至少一个线程被释放之后,将等待队列中的分表调度至对应的调度单元中。

可选的,上述处理器还可以执行如下步骤的程序代码:在任意一个调度单元中存在空闲的线程的情况下,获取每个分库的当前并发数,其中,当前并发数用于表征分库中已经被调度至对应的调度单元中的分表数量;根据每个分库的当前并发数,从任意一个调度单元的等待队列中调度对应数量的分表;将从对应的等待队列中调度对应数量的分表并发传输至目标位置。

可选的,上述处理器还可以执行如下步骤的程序代码:按照每个分库的当前并发数进行排序,确定属于不同分库的分表的调度优先级,其中,分库的当前并发数越低, 当前并发数越低的分库中的分表的调度优先级越高;根据任意一个调度单元中存在的空闲线程数量,确定调度数量;在确定第一分库中的分表为调度优先级最高的分表之后,按照调度数量从等待队列中调度属于第一分库的分表。

可选的,上述处理器还可以执行如下步骤的程序代码:读取等待队列中属于第一分库的分表的数量;判断属于第一分库的分表的数量是否大于等于调度数量;其中,如果大于等于调度数量,则进入按照调度数量从等待队列中调度对应数量的分表的步骤;如果小于调度数量,则按照调度数量从等待队列中调度属于第一分库和属于其他分库的分表,其中,其他分库为当前并发数大于第一分库的分库。

采用本发明实施例,如果希望减小分库分表任务的并行传输,可以在抽取待传输的任务集合之后,按照预先配置的总并发粒度从多个分库中调取n个分表,通过将调取到的n个分表采用散列分配方式散列至不同的调度单元,将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置,本方案可以根据总并发粒度和单元并发粒度对待传输的任务集合进行拆分,以均衡并行传输分库分表的任务。

容易注意到,由于在抽取待传输的任务集合之后,需要在按照预先配置的总并发粒度从多个分库中调取n个分表,并通过将调取到的n个分表采用散列分配方式散列至不同的调度单元,就可以根据散列后的分表并行发送任务集合,达到均衡并发传输分库分表的任务,因此,通过本申请实施例所提供的方案,可以实现基于分库分表的任务传输,这样不仅实现了分库分表的任务传输,而且,在传输分库分表的任务时,在满足预先配置的总并发粒度的情况下,均衡传输分库分表的任务,因此,可以均衡分库分表中的多个任务,降低并发读取数据的压力,提高并发传输效率。

由此,本申请提供的上述实施例的方案解决了现有技术中在基于分库分表的任务进行并发传输时,抽取端从分库分表DB中并发读取数据压力过大,导致并发传输分库分表的任务效率低的技术问题。

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

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

实施例5

本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于保存上述实施例一所提供的基于分库分表的任务传输方法所执行的程序代码。

可选地,在本实施例中,上述存储介质可以位于计算机网络中计算机终端群中的任意一个计算机终端中,或者位于移动终端群中的任意一个移动终端中。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:从分库分表中抽取待传输的任务集合,其中,任务集合包括:多个分库,以及每个分库所包含的分表;按照预先配置的总并发粒度从多个分库中调取n个分表,n等于总并发粒度;将调取到的n个分表采用散列分配方式散列至不同的调度单元,其中,预先配置每个调度单元的单元并发粒度相同;将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:根据总并发粒度和单元并发粒度,确定调度单元的数量,并对每个调度单元分配对应的编号;通过如下公式计算得到任意一个分库中的每个分表Ti的散列分配值,其中,散列分配值用于表征分表Ti所散列至对应的调度单元的编号Tpos:Tpos=(TCount+offset)%tgCount,tgCount=totalChannel/tgChannel,其中,TCount为任意一个分库中每个分表Ti的编号,offset为每个分库向对应的调度单元分配的偏移量,初始值为0,totalChannel为总并发粒度,tgChannel为单元并发粒度;其中,n个分表分别按照计算得到的散列分配值散列至对应的调度单元。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:在将每个调度单元中包含的分表按照单元并发粒度并发传输至目标位置的过程中,实时获取多个分库中除n个分表之外的m个分表,并按照总并发粒度将m个分表采用散列分配方式散列至不同的调度单元,其中,如果调度单元的线程被占满的情况下,将分配至对应的调度单元的分表放置在对应的调度单元的等待队列中,在调度单元的至少一个线程被释放之后,将等待队列中的分表调度至对应的调度单元中。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:在任意一个调度单元中存在空闲的线程的情况下,获取每个分库的当前并发数,其中,当前并发数用于表征分库中已经被调度至对应的调度单元中的分表数量;根据每个分库的当前并发数,从任意一个调度单元的等待队列中调度对应数量的分表;将从对应的等待队列中调度对应数量的分表并发传输至目标位置。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:按照每个分库的当前并发数进行排序,确定属于不同分库的分表的调度优先级,其中,分库的当前并发数越低,当前并发数越低的分库中的分表的调度优先级越高;根据任意一个调度单元中存在的空闲线程数量,确定调度数量;在确定第一分库中的分表为调度优先级最高的分表之后,按照调度数量从等待队列中调度属于第一分库的分表。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:读取等待队列中属于第一分库的分表的数量;判断属于第一分库的分表的数量是否大于等于调度数量;其中,如果大于等于调度数量,则进入按照调度数量从等待队列中调度对应数量的分表的步骤;如果小于调度数量,则按照调度数量从等待队列中调度属于第一分库和属于其他分库的分表,其中,其他分库为当前并发数大于第一分库的分库。

可选地,在本实施例中,存储介质被设置为存储:对散列至不同的调度单元的分表标记分库标识,分库标识用于表征分表原始对应的分库。

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

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

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

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

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

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质 上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

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

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