一种可实现数据快速装载的数据同步方法和装置与流程

文档序号:20440724发布日期:2020-04-17 22:23阅读:333来源:国知局

技术领域
:】本发明涉及数据同步
技术领域
:,具体涉及一种可实现数据快速装载的数据同步方法和装置。
背景技术
::目前,典型的数据同步流程通常包括两个步骤:一是将数据从数据源中读取出来放到缓存中,即数据读取;二是从缓存中读取数据装载到目的数据库中,即数据装载。假设源端为关系数据库,则当前典型的数据同步流程如图1所示,其数据装载过程一般都是调用jdbc(javadatabaseconnectivity)或者odbc(opendatabaseconnectivity)接口实现对目的数据库的访问。jdbc或者odbc都是通用的数据库编程接口,可提供一套完整的、独立于任何特定数据库的编程接口,使得应用程序无需绑定到每种数据库不同的编程接口。数据库厂商发布数据库时会同时发布符合jdbc和odbc标准的驱动程序,以便应用程序使用该驱动程序访问数据库。由于jdbc或者odbc是通用的标准,因此调用jdbc或者odbc接口装载数据时的操作流程一般也是固定的,如图2所示。图2所示的数据装载流程对于一般的数据库应用是没有问题的,但是在进行大数据量的装载时性能往往难以满足用户需求,这是因为jdbc和odbc接口为保证通用性,通常不支持数据库产品特有的批量数据装载命令,难以实现数据快速装载。要实现数据的快速装载,需利用数据库专有的批量数据装载命令来实现。数据库专有的批量数据装载命令,一般是提供给数据库管理员直接用于快速导入导出数据,内部进行了较多的优化,相比通用接口,其优势是性能比使用jdbc和odbc接口的方式快几倍到十几倍,可进行数据的快速批量装载;但其劣势是使用时要求数据必须以指定格式的文件的形式存在于磁盘上,而且不同目的数据库的批量数据装载命令和要求的数据格式都不相同,不具有通用性。以下为mysql数据库的批量数据装载命令示例:loaddatainfile"/data/mysql/test.txt"intotablet1fieldsterminatedby',';该命令表示将/data/mysql/test.txt文件中的数据装载到t1表中,文件test.txt为文本文件,字段之间以“,”逗号为分隔符。目前常见的数据集成工具对于上述形式的批量装载的支持,均要求被装载的数据文件必须已存在于磁盘上,不能直接进行数据源到目的表数据的批量装载。用户要使用批量装载则必须先将源表数据导出到文件中,然后再使用批量装载命令进行数据装载,两个步骤必须串行执行,使用起来较为麻烦、效率低且性能损失较大。鉴于此,克服上述现有技术所存在的缺陷是本
技术领域
:亟待解决的问题。技术实现要素:本发明需要解决的技术问题是:数据同步中使用批量装载时要求数据必须以指定格式的文件形式存在于磁盘上,必须先将源表数据导出到文件中,然后再使用批量装载命令进行数据装载,两步串行执行,流程复杂、效率低且性能损失大;不同目的数据库的批量装载命令和要求数据格式都不相同,不具有通用性。本发明通过如下技术方案达到上述目的:第一方面,本发明提供了一种可实现数据快速装载的数据同步方法,数据装载节点内设有生产者线程、任务队列和消费者线程,则数据同步方法包括:从数据源读取数据,并将读取的数据放入缓存中;所述生产者线程将缓存中的数据分批生成多个数据文件,并将生成的数据文件放入任务队列中;其中,每个数据文件包含一条或多条数据;所述消费者线程调用目的数据库专有的批量数据装载命令,将任务队列中待装载的数据文件逐一装载到目的数据库;其中,所述生产者线程对应的数据文件生成过程和所述消费者线程对应的数据批量装载过程为并行进行。优选的,在数据同步过程中,所述方法还包括:统计同步过程中数据从数据源中的读取速度,以及数据装载到目的数据库的装载速度,并将读取速度和装载速度进行比较;如果读取速度和装载速度相当,则下次数据同步时数据放入缓存之后,在linux系统内生成一虚拟的管道文件,并将缓存中的数据读取到管道文件中;然后将目的数据库专有的批量装载命令定位到管道文件,并利用批量装载命令将管道文件中的数据装载到目的数据库;如果读取速度和装载速度不相当,则下次数据同步时数据放入缓存之后,所述生产者线程将缓存中的数据分批生成多个数据文件,并将生成的数据文件放入任务队列中。优选的,在生成数据文件时,所述生产者线程按照所述目的数据库的格式要求,生成相应格式的数据文件。优选的,所述生产者线程将缓存中的数据分批生成多个数据文件,并将生成的数据文件放入任务队列中,具体包括:所述生产者线程从缓存中读取待装载的数据,并将读取到的数据写入一临时生成的数据文件中;所述生产者线程判断当前数据文件中的数据量是否达到预设阈值,如果当前数据文件中的数据量未达到预设阈值,则所述生产者线程继续从缓存中读取下一条待装载的数据写入到当前数据文件中。优选的,如果当前数据文件中的数据量已经达到预设阈值,则继续检查任务队列中的任务数量是否达到最大任务数限制;如果任务队列中的任务数量未达到最大任务数限制,则所述生产者线程将当前写入完成的数据文件放到任务队列中;如果任务队列中的任务数量已达到最大任务数限制,则所述生产者线程等待所述消费者线程从任务队列中取出任务后,再将当前写入完成的数据文件放到任务队列中。优选的,所述消费者线程调用目的数据库专有的批量数据装载命令,将任务队列中待装载的数据文件逐一装载到目的数据库,具体包括:所述消费者线程从任务队列中取出待装载的数据文件,并根据目的数据库生成用于装载当前数据文件的批量数据装载命令;所述消费者线程执行所述批量数据装载命令,进而将当前取出的数据文件装载到目的数据库;所述消费者线程将完成装载后的数据文件删除,并检查任务队列中是否还有待装载的数据文件,如果有则继续进行下一个数据文件的装载。优选的,所述消费者线程设置至少两个,则在进行数据装载时,各消费者线程以并行方式将任务队列中不同的数据文件分别装载到目的数据库。优选的,所述数据源为关系数据库、消息队列、xml文件、kv数据库或文档数据库。优选的,所述目的数据库为关系数据库。第二方面,本发明提供了一种可实现数据快速装载的数据同步装置,包括至少一个处理器和存储器,所述至少一个处理器和存储器之间通过数据总线连接,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令在被所述处理器执行后,用于完成第一方面所述的可实现数据快速装载的数据同步方法。本发明的有益效果是:本发明提供的数据同步方法对数据装载过程进行了改进,在数据装载节点内设置生产者线程、任务队列和消费者线程,采用生产者-消费者的多线程模型,在数据装载时分批连续生成所需格式的数据文件,并调用目的数据库专有的批量数据装载命令来装载数据,数据文件的生成和数据装载命令的执行可以并行进行,且两步合为一步,减少了串行执行时的性能损失,提高同步效率,简化流程配置。【附图说明】为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1为传统的数据同步过程示意图;图2为传统数据同步过程中利用jdbc或odbc接口装载数据时的数据装载流程图;图3为本发明实施例提供的一种数据同步过程及多线程模式示意图;图4为本发明实施例提供的一种可实现数据快速装载的数据同步方法流程图;图5为本发明实施例提供的一种数据装载时生产者线程的运行流程图;图6为本发明实施例提供的一种数据装载时消费者线程的运行流程图;图7为本发明实施例提供的一种可实现数据快速装载的数据同步装置的架构图。【具体实施方式】为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。在本发明各实施例中,符号“/”表示同时具有两种功能的含义,而对于符号“a和/或b”则表明由该符号连接的前后对象之间的组合包括“a”、“b”、“a和b”三种情况。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。下面就参考附图和实施例结合来详细说明本发明。实施例1:本发明实施例提供了一种可实现数据快速装载的数据同步方法,在该方法中,目的数据库(即目的端)为关系数据库,数据源端则没有限制,可以是多种类型的数据源,例如关系数据库、消息队列、xml文件、kv数据库、文档数据库等。与传统的数据同步过程相比,本发明主要对其中的数据装载步骤进行了改进,使之能够利用各种数据库专有的批量装载命令,从而提升性能。如图3所示,本发明中数据装载节点不是简单的从数据缓存中取数据,然后调用jdbc/odbc接口将数据写入到目的数据库,而是采用了生产者-消费者的并发模型,多个线程并行协同工作,即在数据装载节点内设有生产者线程、任务队列和消费者线程。基于图3提供的模型,本发明实施例提供的数据同步方法可参考图4,主要包括以下步骤:步骤201,从数据源读取数据,并将读取的数据放入缓存中。该步骤即为数据读取,将数据源中的数据逐条读取到缓存中,与传统数据同步过程中的数据读取步骤相同,在此不做赘述。步骤202,所述生产者线程将缓存中的数据分批生成多个数据文件,并将生成的数据文件放入任务队列中;其中,每个数据文件中包含一条或多条数据。步骤203,所述消费者线程调用目的数据库专有的批量数据装载命令,将任务队列中待装载的数据文件逐一装载到目的数据库。其中,步骤202与步骤203共同构成数据装载过程:步骤202为数据文件的生成,由所述生产者线程完成;步骤203为批量数据装载命令的执行,由所述消费者线程完成。其中,在生成数据文件时,所述生产者线程可按照所述目的数据库的格式要求,生成相应格式的数据文件。在生成数据文件时,所述生产者线程会分批连续地生成多个数据文件,例如,将缓存中的每10000条数据生成一个数据文件;所述生产者线程每生成一个数据文件并写入到任务队列中之后,会继续生成下一个数据文件;而在所述生产者线程生成数据文件的同时,所述消费者线程会对任务队列中已有的待装载的数据文件执行批量数据装载命令,将数据文件逐一装载到目的数据库。也就是说,所述生产者线程对应的数据文件生成过程和所述消费者线程对应的数据批量装载过程是并行进行的,两个线程互不干涉,可减少传统串行执行时的性能损失,提高装载效率。传统的数据装载过程中,需先将源表数据导出到文件中,然后再使用批量装载命令进行数据装载,两步串行执行,此时仅生成单一文件,因此文件内存过大,会占用过多的磁盘空间,而且单文件加载数据时间过长,容易造成界面统计信息状态更新不及时的问题。本发明实施例中可分批连续地生成多个数据文件,并对每个数据文件分别执行装载命令,避免了分步串行执行时,生成单一文件过大占用过多的磁盘空间以及单文件加载数据时间过长造成界面统计信息状态更新不及时的问题。另外,本发明在数据装载时通过动态生成数据文件并执行批量数据装载命令的方式,实际上是将传统的两步操作合并为一步操作,简化了流程配置。本发明实施例提供的上述数据同步方法主要对数据装载过程进行了改进,在数据装载节点内设置生产者线程、任务队列和消费者线程,采用生产者-消费者的并发模型,多个线程并行协同工作,在数据装载时分批连续生成所需格式的数据文件,并能调用目的数据库专有的批量数据装载命令来装载数据,数据文件的生成和数据装载命令的执行可并行进行,且两步合为一步,减少了串行执行时的性能损失,提高同步效率,简化流程配置。除了采用图3所示的“生产者-消费者”多线程任务处理模型以外,还可采用生成管道文件的方式来实现数据的快速批量装载。则在数据同步过程中,所述方法还包括:统计同步过程中数据从数据源中的读取速度,以及数据装载到目的数据库的装载速度,并将读取速度和装载速度进行比较。其中,具体的读取速度和装载速度可通过相关测试报文获取;或者统计指定时间内从数据源处读取出的数据量以及装载到目的数据库中的数据量,计算得到相应的读取速度和装载速度。读取速度和装载速度的快慢,主要与源端和目的端服务器自身硬件配置和各自自身业务执行内容所占用资源有关,自身运行的业务越多,越影响速率。如果比较之后发现读取速度和装载速度相当,则下次数据同步时数据从数据源读取并放入缓存之后,可先在linux系统内生成一虚拟的管道文件,并将缓存中的数据读取到管道文件中;然后再将目的数据库专有的批量装载命令定位到管道文件,并利用批量装载命令将管道文件中的数据装载到目的数据库。其中,速度相当即相近似,具体可以设置一预设差值,如果两速度之间的差小于预设差值,可认为两个速度相当;如果大于预设差值,则认为两个速度不相当。另外,所述管道文件是linux系统服务器利用自身的内存模拟出的一虚拟文件,并不实际存在,因此这种装载方式其实无需生成中间文件,又可利用虚拟传输的方式实现数据的批量装载,进一步将装载过程简化,提高装载效率。如果比较之后发现读取速度和装载速度不相当,则下次数据同步时数据从数据源读取并放入缓存之后,所述生产者线程将缓存中的数据分批生成多个数据文件,并将生成的数据文件放入任务队列中,即继续按照图3和图4所示,向下执行步骤202和步骤203,利用“生产者-消费者”多线程任务处理模型来完成数据的快速批量装载。其中,管道文件主要是利用linux系统服务器中的管道技术来生成,因此除了比较速度以外,还可直接根据系统的类型来选择相应的数据装载方式。如果系统为linux系统,则可直接采用管道文件装载的方式,跳过生成中间文件的过程,完成数据装载;如果系统不是linux系统,例如windows系统,则采用“生产者-消费者”多线程任务处理模型,通过动态生成数据文件并执行批量装载命令的方式,实现数据装载。无论是哪种装载方式,均可利用目的数据库专有的批量数据装载命令,实现数据的快速装载。进一步地,由步骤202可知,所述生产者线程的主要功能是将缓存中的数据生成临时的数据文件,并将生成的数据文件放入任务队列中。其运行流程可参考图5,主要包括如下步骤:第一,所述生产者线程从缓存中读取一条待装载的数据。第二,所述生产者线程将读取到的数据写入一临时生成的数据文件中;这里为便于描述,可将当前生成的数据文件记为数据文件a。第三,所述生产者线程判断当前数据文件a中的数据量是否达到预设阈值,即是否达到最大限制,例如500000条数据。这里之所以要设置数据文件的大小限制,是因为所述消费者线程执行快速装载命令时所装载的数据文件必须是完整的;如果不限制数据文件的大小,而是直接把全部数据写入到一个数据文件中,则所述消费者线程必须等待所述生产者线程将所有数据都写完才能开始执行装载。这样虽然启用多线程,但本质上还是顺序执行,对提高性能不利,因此采用将数据分批写入数据文件的方式。简言之,这里之所以设置预设阈值,是为了分批生成数据文件,从而保证数据文件生成和数据批量装载的并行执行。如果当前数据文件a中的数据量未达到预设阈值,则所述生产者线程继续从缓存中读取下一条待装载的数据写入到当前数据文件a中,然后继续重复上述判断过程,直至当前数据文件a中的数据量达到预设阈值。如果当前数据文件a中的数据量已经达到预设阈值,说明数据文件a已经完成写入,不能再继续向数据文件a中写入数据,此时继续向下执行第四步。第四,所述生产者线程检查任务队列中的任务数量是否达到最大任务数限制,即判断任务队列是否已满。这里之所以为任务队列设置任务数限制,是为了防止任务队列中等待的任务过多占用过大的磁盘空间。由于写本地文件比读文件装载数据库的速度要快很多,即生成任务的速度比执行任务的速度要快很多,所以任务队列大部分情况下不会为空,不需要将任务队列的任务数限制设置的过大就可以保证消费者线程获取任务时无需等待,保证系统的并发度。在本发明实施例中,可将任务队列的最大任务数限制设置为3。如果任务队列中的任务数量未达到最大任务数限制,则所述生产者线程将当前写入完成的数据文件a放到任务队列中,继续向下执行第五步。如果任务队列中的任务数量已达到最大任务数限制,则所述生产者线程需等待所述消费者线程从任务队列中取出任务后,再将当前写入完成的数据文件a放到任务队列中,继续向下执行第五步。第五,判断缓存中的数据是否读取完毕。如果缓存中还有数据,则所述生产者线程继续从缓存中读取下一条待装载的数据,并将数据写入到新生成的数据文件b中,即开始下一批的数据写入,重复执行上述过程,直至完成同步;如果缓存中没有数据了,则整个同步过程完成,结束运行。进一步地,由步骤203可知,所述消费者线程的主要功能是调用目的数据库专有的批量数据装载命令,将任务队列中待装载的数据文件装载到目的数据库中。由于数据文件生成(即图3中“写文件”)的速度一般比将文件装载到数据库(即图3中“读文件”)的速度要快,因此可以增加消费者线程数来进一步提高数据装载的性能,即所述消费者线程设置至少两个,则在进行数据装载时,各消费者线程以并行方式将任务队列中不同的数据文件分别装载到目的数据库。这种方式能够继续提高装载性能的程度取决于目的数据库的并发性能,不同的数据库提升的程度可能不同。无论所述消费者线程的设置数量为多少,每个消费者线程的运行流程均可参考图6,主要包括如下步骤:第一,所述消费者线程从任务队列中取出一待装载的数据文件;这里为便于描述,仍可将当前取出的数据文件记为数据文件a。第二,所述消费者线程根据目的数据库生成用于装载当前数据文件a的批量数据装载命令。其中,该批量数据装载命令为当前目的数据库专有。第三,所述消费者线程执行所述批量数据装载命令,进而将当前取出的数据文件a装载到目的数据库。第四,所述消费者线程将完成装载后的数据文件a删除。第五,所述消费者线程检查任务队列中是否还有任务,即是否还有待装载的数据文件。如果有则继续进行下一个数据文件的装载,例如,任务队列中下一个待装载的数据文件为b,则所述消费者线程继续按照上述流程将数据文件b装载到目的数据库;如果任务队列中没有新任务,则整个同步过程完成,结束运行。综上所述,本发明实施例提供的数据同步方法具有以下优势:在数据装载时采用生产者-消费者的多线程模型,可调用目的数据库专有的批量数据装载命令来装载数据,数据文件的生成和数据装载命令的执行可并行进行,减少了串行执行时的性能损失,提高同步效率;在数据装载时采用动态生成数据文件并执行快速装载命令的方式,实际上将两步操作合并为一步操作,简化了流程配置;在生成数据文件时分批连续生成多个数据文件,并对每个文件分别执行装载命令,避免生成单一文件过大占用过多的磁盘空间以及单文件加载数据时间过长的问题;当读取速度和装载速度相当时或者应用于linux系统时,可直接采用管道文件的方式完成数据批量装载,无需生成中间文件,进一步简化装载过程,提高装载效率;消费者线程可设置至少两个,在进行数据装载时,各消费者线程以并行方式将任务队列中不同的数据文件分别装载到目的数据库,通过增加消费者线程数进一步提高了数据装载的性能。实施例2:在上述实施例1提供的可实现数据快速装载的数据同步方法的基础上,本发明还提供了一种可用于实现上述方法的可实现数据快速装载的数据同步装置,如图7所示,是本发明实施例的装置架构示意图。本实施例的可实现数据快速装载的数据同步装置包括一个或多个处理器21以及存储器22。其中,图7中以一个处理器21为例。所述处理器21和所述存储器22可以通过总线或者其他方式连接,图7中以通过总线连接为例。所述存储器22作为一种可实现数据快速装载的数据同步方法非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1中的可实现数据快速装载的数据同步方法。所述处理器21通过运行存储在所述存储器22中的非易失性软件程序、指令以及模块,从而执行可实现数据快速装载的数据同步装置的各种功能应用以及数据处理,即实现实施例1的可实现数据快速装载的数据同步方法。所述存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,所述存储器22可选包括相对于所述处理器21远程设置的存储器,这些远程存储器可以通过网络连接至所述处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例1中的可实现数据快速装载的数据同步方法,例如,执行以上描述的图4-图6所示的各个步骤。本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(rom,readonlymemory)、随机存取存储器(ram,randomaccessmemory)、磁盘或光盘等。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1