基于日志解析同步的并行日志解析方法和数据同步系统
技术领域
本发明属于数据同步技术领域,更具体地,涉及一种基于日志解析同步的并行日志解析方法和数据同步系统。
背景技术
在基于日志解析架构的数据库实时同步系统(支持异构)中,源端数据同步服务负责捕获源端数据库的操作日志,并解析日志还得到相应的数据库操作,然后发送到目标端数据同步服务,目标端数据同步服务负责把这些操作在目标端数据库中执行,从而完成数据同步的过程。源端数据库日志中操作的顺序代表着这些操作在数据库中执行的顺序,每个操作都存在先后关联顺序,在解析日志还原这些操作时需要保证还原出的操作顺序和日志保持一致。
另外,解析日志时需要使用数据库中表的字典信息来还原操作,由于基于日志解析的同步是属于异步同步的架构,解析日志的字典信息并不能直接从源数据库中获取最新的字典,字典结构的变化同样要从捕获的日志中还原,这也对日志操作的解析顺序提出了要求。鉴于日志解析顺序的重要性,同步软件在解析日志时往往采用单线程来解析,按照捕获的日志顺序依次解析便可解决上述问题。但是日志解析是一个非常消耗CPU资源的工作,当源数据库在某个时刻产生大量的操作时,单线程解析日志的方式就跟不上源端数据库生成日志的速度,导致同步产生延时。针对这个问题,如何提高日志解析性能就成为业界亟待解决的技术问题。
鉴于此,克服该现有技术产品所存在的不足是本技术领域亟待解决的问题。
发明内容
针对现有技术的以上缺陷或改进需求,本发明提供了一种基于日志解析同步的并行日志解析方法和数据同步系统,在本发明中,将操作还原过程从日志解析中剥离出来,日志分析线程和操作还原线程异步执行,可以提高同步的效率,减少延迟。
为实现上述目的,按照本发明的一个方面,提供了一种基于日志解析同步的并行日志解析方法,源端数据同步服务包括日志分析线程和操作还原线程,其中,所述操作还原线程与所述日志分析线程异步执行;
所述并行日志解析方法包括:
通过所述日志分析线程对源端数据库的日志解析,得到待同步操作;
判断所述待同步操作的操作类型;
当所述待同步操作为DML操作时,为所述DML操作所涉及的操作对象构造共享锁,并将所述DML操作和所述DML操作对应的共享锁发送至所述操作还原线程,以异步进行所述DML操作的解析还原;
当所述待同步操作为DDL操作时,为所述DDL操作所涉及的操作对象构造排他锁,在对所述DDL操作所涉及的操作对象上锁成功后,解析所述DDL操作,维护更新所述DDL操作所指向的操作对象的字典信息。
优选地,所述并行日志解析方法还包括:
所述操作还原线程在接收到所述DML操作后,获取所述DML操作所指向的操作对象的字典信息;
根据所述DML操作所指向的操作对象的字典信息,将所述DML操作还原成目标端数据库所能识别的解析消息;
在完成解析还原后,释放所述DML操作所对应的共享锁。
优选地,所述并行日志解析方法还包括:
所述日志分析线程为所述DML操作创建占位符,所述占位符用于存放所述DML操作对应的日志信息。
优选地,所述并行日志解析方法还包括:
所述日志分析线程在所述占位符中添加标记信息,其中,所述标记信息用于标识所述DML操作的解析状态。
优选地,所述源端数据同步服务还包括日志投递线程,所述日志分析线程配套设置有待投递队列,所述并行日志解析方法还包括:
所述日志分析线程将携带有标记信息的所述占位符发送至所述待投递队列;
在释放所述DML操作所对应的共享锁后,所述操作还原线程更新所述DML操作,在所述待投递队列中所对应的占位符的标记信息,其中,标记信息被设置为已解析状态;
将所述DML操作对应的解析消息添加至所述DML操作所指向的占位符中。
优选地,所述并行日志解析方法还包括:
所述日志投递线程按照各个占位符的生成顺序,依次根据每一占位符中的标记信息判断占位符所指向的所述DML操作是否已经完成解析;
若已完成,则将填充在占位符中的解析消息发送至目标端,再判断下一个占位符所指向的所述DML操作是否已经完成解析。
优选地,根据所述DML操作所指向的操作对象的字典信息,将所述DML操作还原成目标端数据库所能识别的解析消息包括:
根据所述DML操作所指向的操作对象的标识号,在源端数据库侧的数据字典中查找所述DML操作所指向的操作对象的字典信息;
获取目标端数据库所能识别的数据类型,将所述DML操作的数据类型转换为所述目标端所述库所能识别的数据类型,以得到解析消息。
优选地,在为所述DDL操作所涉及的操作对象构造排他锁之后还包括:
判断所述DDL操作所涉及的操作对象是否被锁定;
若没有,则通过所述排他锁对所述DDL操作所涉及的操作对象进行锁定。
优选地,所述源端数据同步服务包括多个所述操作还原线程,多个所述操作还原线程共同拥有一个待还原队列;
多个所述操作还原线程并行执行相应DML操作的日志解析工作。
为实现上述目的,按照本发明的另一个方面,提供了一种数据同步系统,所述数据同步系统包括至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被程序设置为执行本发明所述的并行日志解析方法。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有如下有益效果:区别于现有技术,本发明提供一种基于日志解析同步的并行日志解析方法和数据同步系统,源端数据同步服务包括日志分析线程和操作还原线程,其中,操作还原线程与日志分析线程异步执行;该并行日志解析方法包括:通过日志分析线程对源端数据库的日志解析,得到待同步操作;判断待同步操作的操作类型;当待同步操作为DML操作时,为DML操作所涉及的操作对象构造共享锁,并将DML操作和DML操作对应的共享锁发送至操作还原线程,以异步进行DML操作的解析还原;当待同步操作为DDL操作时,为DDL操作所涉及的操作对象构造排他锁,在对DDL操作所涉及的操作对象上锁成功后,解析DDL操作,维护更新DDL操作所指向的操作对象的字典信息。
在本发明中,将操作还原过程从日志解析中剥离出来,日志分析线程和操作还原线程异步执行,可以提高同步的效率,减少延迟。另外,采用锁的机制严格控制具有冲突的DML操作和DDL操作的顺序,使它们在日志分析线程和操作还原线程中严格按照日志中的顺序来解析,保证数据同步的一致性。
附图说明
图1是本发明实施例提供的一种基于日志解析同步的并行日志解析方法的流程示意图;
图2是本发明实施例提供的一种日志分析线程的执行过程示意图;
图3是本发明实施例提供的一种操作还原线程的执行过程示意图;
图4是本发明实施例提供的一种日志投递线程的执行过程示意图;
图5是本发明实施例提供的一种数据同步系统的结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在本发明的描述中,术语“内”、“外”、“纵向”、“横向”、“上”、“下”、“顶”、“底”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明而不是要求本发明必须以特定的方位构造和操作,因此不应当理解为对本发明的限制。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
实施例1:
在实际应用场景下,在源端部署源端数据同步系统,在目标端部署目标端数据同步系统,所述源端数据同步系统用于将源端数据库的日志发送至所述目标端数据同步系统,所述目标端数据同步系统用于解析所述源端数据库的日志,以将源端数据库的同步操作应用到所述目标端数据库。
在实际应用场景下,日志解析可大致分为筛选归类、字典维护和操作还原,由于操作还原需要根据数据字典对日志中操作的数据,进行一系列的转换才能得到异构数据库能够识别的数据,导致它对CPU的消耗在整个解析过程中占比最大,当源端数据库在某个时刻产生大量的操作时,单线程解析日志的方式就跟不上源端数据库生成日志的速度,导致同步产生延时。
为解决同步过程中的延时问题,本实施例提供一种基于日志解析同步的并行日志解析方法,源端数据同步服务包括日志分析线程和操作还原线程,其中,所述操作还原线程可以有多个,以并行解析还原不同的操作,提高解析还原的效率。此外,所述操作还原线程与所述日志分析线程异步执行,各个操作还原线程分别解析相应的操作,可以提高解析的效率,减少延时。
参阅图1,所述并行日志解析方法包括如下步骤:
步骤101:通过所述日志分析线程对源端数据库的日志解析,得到待同步操作。
其中,所述日志分析线程配套设置有待分析队列,所述待分析队列用于存放源端数据库所产生的日志,所述日志分析线程用于筛选归类操作、字典维护和组织分派日志操作还原的任务。
源端数据同步系统捕获到源端数据库的操作日志后,将操作日志添加到待分析队列,日志分析线程从待分析队列中按顺序抽取日志,日志进行解析得到待同步操作,并提取待同步操作所属的事务号(事务ID号),以及所述待同步操作的操作类型,根据待同步操作所属的事务号将每个待同步操作归类到相应的事务下。
步骤102:判断所述待同步操作的操作类型。
其中,待同步操作的操作类型包括DML操作和DDL操作,DML(Data ManipulationLanguage,简写为DML)操作是针对某一对象的操作,包括INSERT、UPDATE和DELETE,DDL(Data Definition Language,简写为DDL)操作是针对某一对象的字典信息的操作,DDL主要是用在定义或改变表的结构、数据类型、表之间的链接和约束等初始化工作。在对DML操作进行解析还原时,需要获取该DML操作所涉及的对象的字典信息,方能准确解析还原DML操作。因此,在对DML操作进行还原时,需要保证该DML操作所涉及的对象的字典信息是当前最新的,否则有可能会出现数据同步错误的情况。
在本实施例中,日志分析线程负责维护日志操作中有冲突的DML和DDL日志的解析顺序,使用锁的机制保证它们在日志分析线程和操作还原线程中严格按照日志中的顺序来解析。
步骤103:当所述待同步操作为DML操作时,为所述DML操作所涉及的操作对象构造共享锁,并将所述DML操作和所述DML操作对应的共享锁发送至所述操作还原线程,以异步进行所述DML操作的解析还原。
其中,共享锁(S锁),又称读锁,若事务T对操作对象A加上S锁,则事务T可以读操作对象A但不能修改操作对象A,其他事务只能再对操作对象A加S锁,而不能加X锁,直到事务T释放操作对象A上的S锁。这保证了其他事务可以读操作对象A,但在事务T释放操作对象A上的S锁之前不能对操作对象A做任何修改。
其中,所述源端数据同步服务包括多个所述操作还原线程,多个所述操作还原线程共同拥有一个待还原队列;多个所述操作还原线程并行执行相应DML操作的日志解析工作,可以提高操作还原的效率。
在实际应用场景下,源端数据库产生的每条日志记录中都记有该操作所属的事务号以及该操作的类型(INSERT、UPDATE、DELETE、ROLLBACK和COMMIT等),如果是DML操作,在日志头上还记录有该操作针对表对像的ID信息。日志分析线程可以通过事务ID和操作类型进行事务的归类和操作的筛选,然后分发日志给操作还原线程进行数据还原。
具体地,当所述待同步操作为DML操作时,为所述DML操作所涉及的操作对象构造共享锁,并将所述DML操作和所述DML操作对应的共享锁发送至所述操作还原线程,以异步进行所述DML操作的解析还原。
在操作对象被共享锁锁定时,其他事务只能查看操作对象或者继续添加共享锁,而不能被修改,采用上共享锁的方式,一方面可以保证多个操作还原线程可以同时进行操作的还原,另一方面可以保证在还原过程中操作对象的字典信息不被修改。
步骤104:当所述待同步操作为DDL操作时,为所述DDL操作所涉及的操作对象构造排他锁,在对所述DDL操作所涉及的操作对象上锁成功后,解析所述DDL操作,维护更新所述DDL操作所指向的操作对象的字典信息。
其中,排他锁(X锁),又称写锁,若事务T对操作对象A加上X锁,事务T可以读操作对象A也可以修改操作对象A,其他事务不能再对操作对象A加任何锁,直到事务T释放操作对象A上的锁。这保证了其他事务在事务T释放操作对象A上的锁之前不能再读取和修改操作对象A。
当源端数据库对某个操作对象的定义信息改变后,需要及时更新操作对象的定义信息,维护更新数据字典,以便于进行操作还原时,能够查询到当前最新的字典信息。例如,操作对象为表,将该表增加一列,则该表对应的字典信息发生改变,需要更新数据字典。不过,在更新操作对象的字典信息时,需要保证该操作对象的字典信息不被其他事务查询到。
具体地,当所述待同步操作为DDL操作时,为所述DDL操作所涉及的操作对象构造排他锁,在对所述DDL操作所涉及的操作对象上锁成功后,解析所述DDL操作,维护更新所述DDL操作所指向的操作对象的字典信息。
在操作对象被排他锁锁定时,其他事务不能查看操作对象,采用上排他锁的方式,一方面可以保证日志分析线程维护更新操作对象的字典信息,另一方面可以将该操作对象相关联的还原操作处于等待状态,直至操作对象上的排他锁被释放,严格保证操作还原的顺序。
在本实施方式中,将操作还原过程从日志解析中剥离出来,日志分析线程和操作还原线程异步执行,可以提高同步的效率,减少延迟。另外,采用锁的机制严格控制具有冲突的DML操作和DDL操作的顺序,使它们在日志分析线程和操作还原线程中严格按照日志中的顺序来解析,保证数据同步的一致性。而且,多个操作还原线程可以并行转换,可以提高操作还原的效率。
在本实施例中,源端数据同步服务还包括日志投递线程,所述日志投递线程用于将完成解析的日志投递至目标端,所述日志投递线程配套设置有待投递队列。
下面分别说明日志分析线程、操作还原线程和日志投递线程的具体执行过程。
结合图2,日志分析线程的执行过程如下:
所述日志分析线程从待分析队列中提取日志,并进行解析得到待同步操作。判断待同步操作的类型,当待同步操作为DML操作时,执行步骤103,且所述日志分析线程还为所述DML操作创建占位符,并在所述占位符中添加标记信息,其中,所述标记信息用于标识所述DML操作的解析状态。所述日志分析线程将携带有标记信息的所述占位符发送至所述待投递队列。
基于日志解析进行同步时,需要严格按照顺序对日志进行解析还原,因此,在操作还原并行执行的过程中,对于顺序的控制极为重要,可以通过占位符方式保证整个日志流解析后生成消息的投递顺序。因此,在创建占位符时,按照待同步操作的日志序列号的先后顺序创建占位符,保证每个待同步操作对应的占位符的顺序与每个待同步操作在源数据库中的执行顺序一致。
当待同步操作为DDL操作时,执行步骤104,其中,在步骤104中还包括,在为所述DDL操作所涉及的操作对象构造排他锁之后还包括:判断所述DDL操作所涉及的操作对象是否被锁定;若没有,则通过所述排他锁对所述DDL操作所涉及的操作对象进行锁定。若所述DDL操作所涉及的操作对象被其他锁锁定,需要等待所述DDL操作所涉及的操作对象被释放后,再进行上锁。
在完成一个待同步操作的分析之后,从待分析队列提取下一个日志,进行日志的分析。
结合图3,操作还原线程的具体执行过程如下:
所述操作还原线程和所述日志分析线程异步执行,当日志分析线程完成一个DML操作的分析后,将DML操作和该DML操作对应的S锁,发送至待还原队列。所述操作还原线程从待还原队列提取日志,以获取待同步的DML操作,在接收到所述DML操作后,获取所述DML操作所指向的操作对象的字典信息;根据所述DML操作所指向的操作对象的字典信息,对所述DML操作进行解析,将所述DML操作还原成目标端数据库所能识别的解析消息。
在实际应用场景下,每种数据库产品虽然它们都支持SQL标准中的基础数据类型,例如整数类型INT、浮点数类型DOUBLE和时间日期类型DATE等,这些标准的数据类型在各种数据库的内部数据存储时都有自己独特的格式,这些格式也直接体现在了日志中,所以操作还原线程要把针对每种数据库进行有针对性的处理,把这些不同格式的数据转换为统一的格式,例如,字符串类型,然后才能把它们同步到异构的数据库中去。
具体地,根据所述DML操作所指向的操作对象的标识号,在源端数据库侧的数据字典中查找所述DML操作所指向的操作对象的字典信息;获取目标端数据库所能识别的数据类型,将所述DML操作的数据类型转换为所述目标端所述库所能识别的数据类型,以得到解析消息。
在完成解析还原后,释放所述DML操作所对应的共享锁。此外,在释放所述DML操作所对应的共享锁后,所述操作还原线程更新所述DML操作,在所述待投递队列中所对应的占位符的标记信息,其中,标记信息被设置为已解析状态(已完成状态);然后,再将所述DML操作对应的解析消息添加至所述DML操作所指向的占位符中。
结合图4,日志投递线程的具体执行过程如下:
在操作还原线程完成一个DML操作的解析还原后,会将相应的解析消息和标记信息所指示的解析状态发送至待投递队列。所述日志投递线程从待投递队里提取操作,按照各个占位符的生成顺序,依次根据每一占位符中的标记信息判断占位符所指向的所述DML操作是否已经完成解析;若已完成,则将填充在占位符中的解析消息发送至目标端,再判断下一个占位符所指向的所述DML操作是否已经完成解析。
在本实施例中,采用占位符的方式来保证整个日志流解析后生成消息的投递顺序;操作还原线程则并发的对日志中的数据解析还原,然后把解析后的消息填充到日志分析线程预先设定好的占位符中,并且及时的释放它所占用的S锁;日志投递线程则严格按照投递队列上的顺序来投递消息,只是在投递前需要判断标记是否满足投递的条件。
实施例2:
在本实施例中,以一具体实例简要说明前述方法的执行过程。源数据库现有表T(C1 INT),在源端执行下列操作:
INSERT INTO T(C1)VALUES(1);
INSERT INTO T(C1)VALUES(2);
ALTER TABLE T ADD C2 DATE;
INSERT INTO T(C1,C2)VALUES(3,SYSDATE());
INSERT INTO T(C1,C2)VALUES(4,SYSDATE());
COMMIT;
源端数据库会产生日志流:INSERT(C1=1)+INSERT(C1=2)+DDL(ADD C2)+INSERT(C1=3)+INSERT(C1=4)+COMMIT
解析过程如下:
(1)日志分析线程提取到日志INSERT(C1=1),先构造T表的S锁,再构造它的占位符Z1加入待投递队列,最后把日志INSERT(C1=1)和它对应的S锁添加到待还原队列。
(2)日志分析线程提取到日志INSERT(C1=2),先构造T表的S锁,再构造它的占位符Z2加入待投递队列,最后把日志INSERT(C1=2)和它对应的S锁添加到待还原队列。
(3)日志分析线程提取到日志DDL(ADD C2),先构造T表的X锁,此时X锁需要等待操作还原线程完成INSERT(C1=1)和INSERT(C1=2)操作的还原工作;
(4)两个操作还原线程分别从待还原队列获得INSERT(C1=1)和INSERT(C1=2)操作,然后各自完成它的还原任务后,释放两个操作各自的S锁。并把还原以后的消息分别填充到Z1和Z2占位符中,同时设置完成标识。
(5)日志分析线程的DDL解析任务X锁上锁成功,然后进行表T添加列的DDL解析并更新T表对应的字典信息,释放X锁。
(6)日志分析线程继续提取到日志INSERT(C1=3),先构造T表的S锁,再构造它的占位符Z3加入待投递队列,最后把日志INSERT(C1=3)和它对应的S锁添加到还原队列。
(7)日志分析线程提取到日志INSERT(C1=4),先构造T表的S锁,再构造它的占位符Z4加入待投递队列,最后把日志INSERT(C1=4)和它对应的S锁添加到还原队列。
(8)两个操作还原线程分别从待还原队列获得INSERT(C1=3)和INSERT(C1=4)操作,然后各自完成它的还原任务后,释放两个操作各自的S锁。并把还原以后的消息分别填充到Z3和Z4占位符中,同时设置完成标识。
(9)日志投递线程按Z1,Z2,Z3和Z4的顺序判断上面的完成标识,标识完成后则投递消息到目标端完成同步。
实施例3:
请参阅图5,图5是本发明实施例提供的一种数据同步系统的结构示意图。本实施例的数据同步系统包括一个或多个处理器61以及存储器62。其中,图5中以一个处理器61为例。
处理器61和存储器62可以通过总线或者其他方式连接,图5中以通过总线连接为例。
存储器62作为一种基于数据同步的非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,上述实施例的方法以及对应的程序指令。处理器61通过运行存储在存储器62中的非易失性软件程序、指令以及模块,从而执行各种功能应用以及数据处理,实现前述实施例的方法。
其中,存储器62可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器62可选包括相对于处理器61远程设置的存储器,这些远程存储器可以通过网络连接至处理器61。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
值得说明的是,上述装置和系统内的模块、单元之间的信息交互、执行过程等内容,由于与本发明的处理方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(Read Only Memory,简写为ROM)、随机存取存储器(RandomAccessMemory,简写为RAM)、磁盘或光盘等。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。