一种数据同步方法、装置、终端及存储介质与流程

文档序号:26642938发布日期:2021-09-15 00:59阅读:86来源:国知局
一种数据同步方法、装置、终端及存储介质与流程

1.本发明涉及数据同步技术领域,特别涉及一种数据同步方法、装置、终端及存储介质。


背景技术:

2.当前最常见的数据同步方案为canal项目,具体通过订阅和消费mysql数据库binlog来完成数据同步,因此,其面向的主体仅限于mysql或者mysql衍生产品,即同步双方均需为mysql或其衍生产品方可使用,属于同构数据源的同步。而在实际中,由于信息系统开发时间和选用技术的不同,存在很多异构数据源之间进行数据同步的需要,目前的数据同步方案不能实现。
3.因此,现有技术还有待改进和提高。


技术实现要素:

4.针对现有技术的上述缺陷,本发明提供一种数据同步方法、装置、终端及存储介质,旨在解决现有技术中的数据同步方案不能实现异构数据源之间的数据同步的问题。
5.为了解决上述技术问题,本发明所采用的技术方案如下:
6.本发明的第一方面,提供一种数据同步方法,所述方法包括:
7.获取第一同步任务,对所述第一同步任务进行分片,得到至少一个分片任务,其中,所述第一同步任务中包括多条数据id,各个所述分片任务分别包括若干个连续的数据id;
8.根据各个所述分片任务生成迁移计划,当所述至少一个分片任务中的目标分片任务被执行时,根据所述目标分片任务对应的迁移计划中的数据id分别从第一数据源中读取对应的目标数据;
9.将读取到的各个所述目标数据同步至第二数据源中。
10.所述的数据同步方法,其中,所述根据各个所述分片任务生成迁移计划,包括:
11.当已生成的迁移计划的数量小于所述分片任务的数量时,检测分布式锁;
12.根据获得分布式锁的所述分片任务生成迁移计划并重复执行所述检测分布式锁的步骤直至已生成的迁移计划等于所述分片任务的数量。
13.所述的数据同步方法,其中,所述根据所述目标分片任务对应的迁移计划中的数据id分别从第一数据源中读取对应的目标数据,包括:
14.根据所述目标分片任务对应的迁移计划的开始id从所述第一数据源中读取预设数量条目标数据;
15.其中,所述目标分片任务对应的迁移计划的所述开始id的初始值为所述目标分片任务中包括的若干个连续的数据id中的第一个数据id。
16.所述的数据同步方法,其中,所述将读取到的各个所述目标数据同步至第二数据源中,包括:
17.对读取到的各个所述目标数据进行第一预设处理后写入至所述第二数据源中;
18.对写入至所述第二数据源中的所述目标数据进行第二预设处理,并将各个所述目标数据中最后一条数据对应的id更新所述目标分片任务中的所述开始id;
19.重复执行所述根据所述目标分片任务对应的迁移计划中的数据id分别从第一数据源中读取对应的目标数据的步骤,直至将所述目标分片任务对应的迁移计划中的结束id对应的数据写入至所述第二数据源中。
20.所述的数据同步方法,其中,所述将读取到的各个所述目标数据同步至第二数据源中之后,还包括:
21.获取第二同步任务,所述第二同步任务中包括同步时间戳;
22.根据所述同步时间戳在所述第一数据源中查找各个第一目标数据id,所述第一目标数据id对应的数据的更新时间戳不早于所述同步时间戳;
23.分别获取各个所述第一目标数据id对应的第一更新时刻和第二更新时刻,所述第一更新时刻为所述第一目标数据id在所述第一数据源中对应的数据的更新时刻,所述第二更新时刻为所述第一目标数据id在所述第二数据源中对应的数据的更新时刻;
24.当所述第一目标数据id对应的所述第一更新时刻晚于所述第二更新时刻时,从所述第一数据源中读取所述第一目标数据id对应的数据并进行第一预设处理,根据进行所述第一预设处理后的数据更新所述第二数据源中所述第一目标数据id对应的数据。
25.所述的数据同步方法,其中,所述根据进行所述第一预设处理后的数据更新所述第二数据源中所述第一目标数据id对应的数据之后,包括:
26.当所述第一数据源中更新时刻最晚的数据的更新时间戳与所述同步时间戳相同,对所述同步时间戳进行更新,更新后的所述同步时间戳对应的时刻晚于更新前的所述同步时间戳对应的时刻;
27.当所述第一数据源中更新时刻最晚的数据的更新时间戳晚于所述同步时间戳,将所述同步时间戳更新为所述第一数据源中更新时刻最晚的数据的更新时间戳。
28.所述的数据同步方法,其中,所述所述将读取到的各个所述目标数据同步至第二数据源中之后,还包括:
29.获取第三同步任务,所述第三同步任务中包括同步计划表;
30.当所述第一数据源中的数据发生变更时,将发生变更的数据的数据id记录至所述同步计划表中并标记状态为处理成功;
31.从所述同步计划表中读取第二目标数据id,所述第二目标数据id为所述同步计划表中状态为处理成功的数据id,若所述第二目标数据id在所述第一数据源中对应的数据的更新时间戳晚于在所述第二数据源中对应的数据的更新时间戳,则从所述第一数据源中读取所述第二目标数据id对应的数据并进行第一预设处理,根据进行所述第一预设处理后的数据更新所述第二数据源中所述第二目标数据id对应的数据;
32.将所述第二目标数据id在所述同步计划表中的状态修改为已处理;
33.清空所述同步计划表中状态为已处理的数据id。
34.本发明的第二方面,提供一种数据同步装置,包括:
35.任务获取模块,所述任务获取模块用于获取第一同步任务,对所述第一同步任务进行分片,得到至少一个分片任务,其中,所述第一同步任务中包括多条数据id,各个所述
分片任务分别包括若干个连续的数据id;
36.数据读取模块,所述数据读取模块用于根据各个所述分片任务生成迁移计划,当所述至少一个分片任务中的目标分片任务对应的迁移计划被执行时,根据所述目标分片任务中的数据id分别从第一数据源中读取对应的目标数据;
37.同步模块,所述同步模块用于将读取到的各个所述目标数据同步至第二数据源中。
38.本发明的第三方面,提供一种终端,所述终端包括处理器、与处理器通信连接的计算机可读存储介质,所述计算机可读存储介质适于存储多条指令,所述处理器适于调用所述计算机可读存储介质中的指令,以执行实现上述任一项所述的数据同步方法的步骤。
39.本发明的第四方面,提供一种计算机可读存储介质,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现上述任一项所述的数据同步方法的步骤。
40.与现有技术相比,本发明提供了一种数据同步方法、装置、终端及存储介质,本发明提供的数据同步方法中,对于需要将多条数据从第一数据源同步至第二数据源的同步任务,将同步任务进行分片,对于每一个分片任务生成迁移计划,当迁移计划被执行时,根据分片任务中的数据id从第一数据源中读取对应的数据并同步至第二数据源中,在整个过程中,只需要根据数据id进行查找、读取和写入步骤,同步过程可使用通用的语言实现,不依赖于第一数据源或第二数据源的结构,可以实现异构数据源之间的数据同步。
附图说明
41.图1为本发明提供的数据同步方法的实施例的流程图;
42.图2为本发明提供的数据同步方法的实施例中在处理第一同步任务时获取目标数据的逻辑框图;
43.图3为本发明提供的数据同步方法的实施例中在处理第一同步任务时生成迁移计划的逻辑框图;
44.图4为本发明提供的数据同步方法的实施例中在处理第一同步任务时将目标数据同步至第二数据源的逻辑框图;
45.图5为本发明提供的数据同步方法的实施例中在处理第二同步任务时从第一数据源中查询数据的逻辑框图;
46.图6为本发明提供的数据同步方法的实施例中在处理第二同步任务时对同步时间戳进行更新的逻辑框图;
47.图7为本发明提供的数据同步方法的实施例中在处理第二同步任务时将数据写入至第二数据源的逻辑框图;
48.图8为本发明提供的数据同步方法的实施例中在处理第三同步任务时获取同步计划的逻辑框图;
49.图9为本发明提供的数据同步方法的实施例中在处理第三同步任务时将数据写入至第二数据源的逻辑框图;
50.图10为本发明提供的数据同步装置的实施例的结构原理图;
51.图11为本发明提供的终端的实施例的原理示意图。
具体实施方式
52.为使本发明的目的、技术方案及效果更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
53.本发明提供的数据同步方法,可以是由终端来执行。所述终端包括但不限于是各种计算机、服务器、手机、平板电脑、可穿戴式设备等。
54.实施例一
55.如图1所示,所述数据同步方法的一个实施例中,包括步骤:
56.s100、获取第一同步任务,对所述第一同步任务进行分片,得到至少一个分片任务。
57.具体地,本实施例提供的数据同步方法,用于第一数据源和第二数据源之间的数据同步,所述第一数据源和所述第二数据源中的每条数据都具有唯一性的自增id,一般设定字段名为数据的id,所述第一同步任务中包括多个数据id,所述第一同步任务用于将所述第一数据源中的部分数据迁移至所述第二数据源,也就是说,所述第一同步任务中包括的数据id在所述第一数据源中存在,在所述第二数据源中不存在。由于所述第一同步任务中需要迁移的数据数量较多,为了提升迁移速度,如图2所示,在本实施例中,采用分片机制来加快处理速度,即采用多个线程分别执行各个分片任务。具体地,对所述第一同步任务进行分片,得到至少一个分片任务,每个所述分片任务中包括若干个连续的数据id。所述分片任务的个数可以根据实际需要进行设置,所述分片任务的个数直接影响数据迁移的并发处理速度。
58.对所述第一同步任务进行分片得到各个所述分片任务,可以是对所述第一同步任务中包括的数据id进行等比例划分,即每个所述分片任务中包括的数据id的数量相等,也可以是不均匀划分。
59.在本实施例中,多线程分别处理各个所述分片任务,具体地,每个分片任务对应一个迁移计划,每次对所述分片任务进行处理时,获取当前分片任务对应的迁移计划。即本实施例提供的数据同步方法,还包括步骤:
60.s200、根据各个所述分片任务生成迁移计划,当所述至少一个分片任务中的目标分片任务被执行时,根据所述目标分片任务对应的迁移计划中的数据id分别从第一数据源中读取对应的目标数据。
61.具体地,所述根据各个所述分片任务生成迁移计划,包括:
62.当已生成的迁移计划的数量小于所述分片任务的数量时,检测分布式锁;
63.根据获得分布式锁的所述分片任务生成迁移计划并重复执行所述检测分布式锁的步骤直至已生成的迁移计划等于所述分片任务的数量。
64.如图3所示,为了避免多个所述分片任务同时执行生成迁移计划,在本实施例中,引入分布式锁,仅允许获得分布式锁的分片任务来执行生成迁移计划的操作,可采用redis的setnx命令来完成分布式锁的竞争。
65.迁移计划的主体结构为:任务名称+分片索引+开始id+结束id,由于每个所述分片任务中的数据id是连续的,迁移计划中的所述开始id是该迁移计划对应的分片任务当前开始处理的第一条数据的id,在数据迁移的过程中会自动更新,迁移计划中的结束id是对应
的所述分片任务中的最后一条数据的id,在数据迁移的过程中保持不变,当结束id为空时,表示该分片任务五结束条件,可以一直执行下去,此时当后续有新增数据时,会通过该分片任务继续进行数据迁移。
66.所述根据所述目标分片任务对应的迁移计划中的数据id分别从第一数据源中读取对应的目标数据,包括步骤:
67.根据所述目标分片任务对应的迁移计划的开始id从所述第一数据源中读取预设数量条目标数据;
68.其中,所述目标分片任务对应的迁移计划的所述开始id的初始值为所述目标分片任务中包括的若干个连续的数据id中的第一个数据id。
69.在本实施例中,由于需要迁移的数据量很大,每次执行预设数量条数据的迁移,具体地,根据所述目标分片任务对应的迁移计划的开始id从所述第一数据源中读取预设数量条目标数据,所述预设数量可以根据实际情况进行设置,例如1w、2w等,由于所述目标分片任务处理的数据id是连续的,因此,根据所述开始id可以依次得到预设数量条的数据id,进而在所述第一数据源中查找读取的数据id对应的数据,得到预设数量条所述目标数据。在读取到所述预设数量条所述目标数据后,将所述预设数量条所述目标数据批量写入至所述第二数据源,完成同步,具体将在步骤s300中说明。
70.s300、将读取到的各个所述目标数据同步至第二数据源中。
71.在通过步骤s200读取到各个所述目标数据后,采用批量写入的方式将各个所述目标数据同步至所述第二数据源中,具体地,所述将读取到的各个所述目标数据同步至第二数据源中,包括步骤:
72.s310、对读取到的各个所述目标数据进行第一预设处理后写入至所述第二数据源中;
73.s320、对写入至所述第二数据源中的所述目标数据进行第二预设处理,并将各个所述目标数据中最后一条数据对应的id更新所述目标分片任务中的所述开始id;
74.s330、重复执行所述根据所述目标分片任务对应的迁移计划中的数据id分别从第一数据源中读取对应的目标数据的步骤,直至将所述目标分片任务中的最后一个数据id对应的数据写入至所述第二数据源中。
75.对于通过步骤s200读取到的各个所述目标数据,先调用第一预设处理方法对各个所述目标数据进行第一预设处理,具体地,所述第一预设处理方法为预留处理方法,也就是说,可以对各个所述目标数据进行第一预设处理或不进行所述第一预设处理,在一些可能的实现方式中,在进行数据迁移时,可能还需要对数据进行数据校验等操作,此时在实现类中重写第一预设处理方法以对所述目标数据进行数据校验。
76.对读取到的各个所述目标数据进行第一预设处理后批量写入至所述第二数据源中,如果批量写入成功,则调用第二预设处理方法,对写入的数据进行第二预设处理,所述第二预设处理方法也为预留处理方法,也就是说,可以对写入的数据进行第二预设处理或不进行第二预设处理,当进行多表级联迁移,可以在实现类中重写第二预设处理方法以对写入至所述第二数据源的所述目标数据进行进一步处理实现多表级联迁移。在对写入至所述第二数据源的所述目标数据进行第二预设处理后,更新所述目标分片任务对应的迁移计划,具体地,将所述目标分片任务对应的迁移计划中的所述开始id更新为本次写入至所述
第二数据源中的各个所述目标数据中最后一条数据的下一个数据id。之后重复执行所步骤s200,再次读取一批所述目标数据并写入至所述第二数据源,直至将所述目标分片任务对应的迁移计划中的结束id对应的数据写入至所述第二数据源中,所述目标分片任务执行完毕。
77.如图4所示,如果读取的一批所述目标数据写入至所述第二数据源中时批量写入失败,则逐条通过数据id判断所述目标数据是否已在所述第二数据源中存在,将已存在的所述目标数据过滤掉,用过滤后的数据再次执行匹配写入操作,若成功,则执行步骤s320,否则发送失败告警,结束所述目标分片任务。
78.以通过本实施例提供的数据同步方法将第一数据源a(sqlserver)的用户表t_user(100w条数据)全量迁移到第二数据源b(mysql)的用户表user中为例:
79.设定分片任务的数量为10,当第一个分片任务(分片索引为0)开始执行时,首先通过t_user和自己的分片索引0检测当前是否存在迁移计划,如果没有则通过所竞争后,创建完整的迁移计划,即创建每个分片任务分别对应的迁移计划,所有的迁移计划可以表1所示。
80.任务名称分片索引起始id结束idt_user01100000t_user1100001200000t_user2200001300000t_user3300001400000t_user4400001500000t_user5500001600000t_user6600001700000t_user7700001800000t_user8800001900000t_user9900001 81.表1
82.每个分片任务都存在迁移计划后,再次查询本分片任务的迁移计划,获得开始id为1,结束id为100000,并以“id>=1and id<100000order by id”作为查询条件从t_user表中查询1000条数据,然后批量写入到数据源b中,写入成功后,用最后一条数据的id(其值为1000)更新迁移计划中的开始id,如表2所示。
83.任务名称分片索引起始id结束idt_user01000100000
84.表2当历史数据全部迁移完成后,迁移计划内容如表3所示。
85.[0086][0087]
表3
[0088]
最终第二数据源b中的user表也存在这100w条的数据了。此时只保留最后一个分片,继续迁移后续新增的数据。
[0089]
在所述第一数据源和所述第二数据源中存在同样的数据id后,当所述第一数据源中的数据发生更新时,需要将所述第二数据源中同样的数据id的数据也进行同样的更新,使得所述第一数据源和所述第二数据源中具有同样的数据id的数据是一致的。本实施例提供的数据同步方法中,对于所述第一数据源和所述的第二数据源均存在的数据id对应的数据同步,提供了两种方式:基于时间戳的实现方式和基于触发器的实现方式。具体地,对于时间戳的实现方式,本实施例提供的数据同步方法,将读取到的各个所述目标数据同步至第二数据源中之后,还包括步骤:
[0090]
s410、获取第二同步任务,所述第二同步任务中包括同步时间戳;
[0091]
s420、根据所述同步时间戳在所述第一数据源中查找各个第一目标数据id,所述第一目标数据id对应的数据的更新时间戳不早于所述同步时间戳;
[0092]
s430、分别获取各个所述第一目标数据id对应的第一更新时刻和第二更新时刻,所述第一更新时刻为所述第一目标数据id在所述第一数据源中对应的数据的更新时刻,所述第二更新时刻为所述第一目标数据id在所述第二数据源中对应的数据的更新时刻;
[0093]
s440、当所述第一目标数据id对应的所述第一更新时刻晚于所述第二更新时刻时,从所述第一数据源中读取所述第一目标数据id对应的数据并进行第一预设处理,根据进行所述第一预设处理后的数据更新所述第二数据源中所述第一目标数据id对应的数据。
[0094]
在基于时间戳的同步方式中,同步任务中包括同步时间戳,所述第二同步任务在当前时刻不早于所述同步时间戳时被执行,如图5所示,在所述第二同步任务被执行时,首先从所述第一数据源中查询数据,具体地,根据所述同步时间戳在所述第一数据源中查找更新时间戳不早于所述同步时间戳的第一目标数据id,数据的更新时间戳对应的时刻为数据最后一次被修改的时刻。在获取到各个所述第一目标数据id后,分别获取所述第一目标数据id在所述第一数据源中对应的数据的更新时刻(即获取所述第一目标数据id在所述第一数据源中对应的数据的更新时间戳),和所述第一目标数据id在所述第二数据源中对应
的数据的更新时刻(即获取所述第一目标数据id在所述第二数据源中对应的数据的更新时间戳)。若所述第一目标数据id对应的所述第一更新时刻晚于所述第二更新时刻,则根据从所述第一数据源中读取所述第一目标数据id对应的数据更新所述第二数据源中所述第一目标数据id对应的数据,在一种可能的实现方式中,在从所述第一数据源中读取所述第一目标数据id对应的数据之后,还对数据进行第一预设处理后再根据处理后的数据更新所述的第二数据源中对应的数据。具体地,如图7所示,可以通过乐观锁的方式更新所述第二数据源中的数据。同样地,在根据从所述第一数据源中读取的数据更新所述第二数据源中的数据之后,还可以调用第二预设处理方法进行后处理,具体可以参见前文中对于第一预设处理和第二预设处理的说明。
[0095]
在根据所述第一预设处理后的数据更新所述第二数据源中所述第一目标数据id对应的数据之后,需要对所述第二同步任务的同步时间戳进行更新。具体地,所述根据进行所述第一预设处理后的数据更新所述第二数据源中所述第一目标数据id对应的数据之后,包括步骤:
[0096]
当所述第一数据源中更新时刻最晚的数据的更新时间戳与所述同步时间戳相同,对所述同步时间戳进行更新,更新后的所述同步时间戳对应的时刻晚于更新前的所述同步时间戳对应的时刻;
[0097]
当所述第一数据源中更新时刻最晚的数据的更新时间戳晚于所述同步时间戳,将所述同步时间戳更新为所述第一数据源中更新时刻最晚的数据的更新时间戳。
[0098]
更新时间戳不早于所述同步时间戳的数据包括更新时间戳与所述同步时间戳相同的数据和更新时间戳晚于所述同步时间戳的数据,当所述第一数据源中更新时刻最晚的数据的更新时间戳晚于所述同步时间戳时,将所述同步时间戳更新为所述第一数据源中更新时刻最晚的数据的更新时间戳,而当所述第一数据源中更新时间最晚的数据的更新时间戳等于所述同步时间戳时,若将将所述同步时间戳更新为所述第一数据源中更新时刻最晚的数据的更新时间戳,就会导致所述第二同步任务中的所述同步时间戳保持不变,可能会导致当次无新修改的待同步数据,在下次执行时,由于同步时间戳未更新,当前时间戳的数据又被查询到进行二次同步,因此,如图6所示,当所述第一数据源中更新时刻最晚的数据的更新时间戳与所述同步时间戳相同时,可以将所述同步时间戳更新为晚于但接近更新前的所述同步时间戳的时刻,具体地,可以设置一步进值,所述步进值可以是系统的最小时间单位,例如1微秒,将当前的所述同步时间戳加上步进值得到更新后的所述同步时间戳。
[0099]
以通过本实施例提供的数据同步方法将第一数据源a(sqlserver)的用户表t_user中发生更新的数据同步到第二数据源b(mysql)的用户表user中为例:
[0100]
数据源a和数据源b中的当前数据如表4和表5所示。
[0101]
t_user表数据:
[0102]
id姓名级别更新时间戳............111张三签约作家2021

01

01 12:05:23.352............
[0103]
表4user表数据:
[0104]
id姓名级别更新时间戳
............111张三作家2021

01

01 09:10:00.123............
[0105]
表5同步任务的计划表如表6所示。
[0106]
任务名称同步时间戳t_user2021

01

01 00:00:00.000
[0107]
表6
[0108]
首先获取同步任务中的同步时间戳。先检查是否有相同时间戳的数据,即以“last_mod_date=’2021

01

01 00:00:00.000’order by last_mod_date”为查询条件从t_user表进行数据查询,并依次通过id查询user表中的数据,并对比二者的更新时间戳,如果t_user表的更新时间戳更晚,则直接用其覆盖user表对应的数据。然后更新时间戳+1毫秒。
[0109]
此时同步任务的计划表如表7所示。
[0110]
任务名称同步时间戳t_user2021

01

01 00:00:00.001
[0111]
表7
[0112]
然后处理之前的时间戳后的数据,即以“last_mod_date>’2021

01

01 00:00:00.000’order by last_mod_date”为查询条件从t_user表进行数据查询,后续处理过程以上述过程一致。最终将最后一条数据的更新时间(假设为2021

01

01 12:05:23.352)作为同步计划的下次同步时间戳,此时同步任务的计划表如表8所示。
[0113]
任务名称同步时间戳t_user2021

01

01 12:05:23.352
[0114]
表8更新完成后,user表数据被更新,如表9所示。
[0115][0116]
表9
[0117]
具体地,对于触发器的实现方式,本实施例提供的数据同步方法,将读取到的各个所述目标数据同步至第二数据源中之后,还包括步骤:
[0118]
s510、获取第三同步任务,所述第三同步任务中包括同步计划表;
[0119]
s520、当所述第一数据源中的数据发生变更时,将发生变更的数据的数据id记录至所述同步计划表中并标记状态为处理成功;
[0120]
s530、从所述同步计划表中读取第二目标数据id,所述第二目标数据id为所述同
步计划表中状态为处理成功的数据id,若所述第二目标数据id在所述第一数据源中对应的数据的更新时间戳晚于在所述第二数据源中对应的数据的更新时间戳,则从所述第一数据源中读取所述第二目标数据id对应的数据并进行第一预设处理,根据进行所述第一预设处理后的数据更新所述第二数据源中所述第二目标数据id对应的数据;
[0121]
s540、将所述第二目标数据id在所述同步计划表中的状态修改为已处理;
[0122]
s550、清空所述同步计划表中状态为已处理的数据id。
[0123]
基于触发器的同步方式中,创建第三同步任务,所述第三同步任务中包括同步计划表,设置触发器afer update触发器,当所述第一数据源中的数据发生变更时,自动触发写入至所述同步计划表中,所述同步计划表的主体结构为:任务名称(一般为源表名)+唯一键(数据id)+更新时间戳+处理状态(默认为“处理成功”)。如图8所示,执行所述第三同步任务时,先读取所述第三同步任务对应的所述同步计划表,可以每隔预设时间处理一次所述同步计划表,具体地,每次处理所述同步计划表时,如图9所示,从所述同步计划表中读取状态为处理成功的第二目标数据id,并比较所述第二目标数据id在所述第一数据源中对应的数据的更新时间戳和所述第二目标数据id在所述第二数据源中对应的数据的更新时间戳,若所述第二目标数据id在所述第一数据源中对应的数据的更新时间戳晚于在所述第二数据源中对应的数据的更新时间戳,则从所述第一数据源中读取所述第二目标数据id对应的数据并进行第一预设处理,根据进行所述第一预设处理后的数据更新所述第二数据源中所述第二目标数据id对应的数据,即对根据所述第二目标数据id从所述第一数据源中读取对的数据进行第一预设处理(可选)后覆盖所述第二数据源中所述第二目标数据id对应的数据。将数据写入至所述第二数据源后,也可以选择性地进行第二预设处理。在更新了所述第二数据源中所述第二目标数据id对应的数据后,将所述第二目标数据id在所述同步计划表中的状态修改为已处理。每次处理所述同步计划表后,清空所述同步计划表中状态为已处理的数据id。
[0124]
以通过本实施例提供的数据同步方法将第一数据源a(sqlserver)的用户表t_user中发生更新的数据同步到第二数据源b(mysql)的用户表user中为例:
[0125]
当前t_user表和user表的数据如表10和表11所示。
[0126][0127]
表10
[0128][0129]
表11
[0130]
首先要在t_user表上创建after update触发器,当t_user数据发生如下变更,张三(id=111)的级别从签约作家更新为白金签约作家:
[0131]
t_user表数据如表12所示。
[0132][0133]
表12
[0134]
自动将变更记录到同步计划中,如表13所示。
[0135]
同步任务首先获取处理状态为“待处理”的所有同步计划,依此用唯一键从数据源b的user表中的数据,并对比二者的时间戳,如果同步计划的时间戳更晚,则从t_user表中查询最新数据,并用其覆盖user表对应的数据。
[0136]
同步后user表数据如表14所示。
[0137][0138]
表13
[0139][0140]
表14并更新同步计划的处理状态为“成功”,如表15所示。
[0141][0142]
表15最后清除所有处理状态为“成功”的同步计划,如表16所示。
[0143]
任务名称唯一键同步时间戳处理状态
ꢀꢀꢀꢀ
[0144]
表16
[0145]
基于时间戳的同步方式可以实现数据的及时同步,适合体量较小的数据源同步,而对于体量较大的数据源来说,数据发生更新的频率更加频繁,更适合基于触发器的同步方式。
[0146]
综上所述,本实施例提供一种数据同步方法,对于需要将多条数据从第一数据源同步至第二数据源的同步任务,将同步任务进行分片,对于每一个分片任务生成迁移计划,当迁移计划被执行时,根据分片任务中的数据id从第一数据源中读取对应的数据并同步至第二数据源中,在整个过程中,只需要根据数据id进行查找、读取和写入步骤,可以使用通用的语言实现,不依赖于第一数据源或第二数据源的结构,可以实现异构数据源之间的数据同步。
[0147]
应该理解的是,虽然本发明说明书附图中给出的的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,流程图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
[0148]
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以
通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取计算机可读存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本发明所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。
[0149]
实施例二
[0150]
基于上述实施例,本发明还相应提供了一种数据同步装置,如图10所示,所述数据同步装置包括:
[0151]
任务获取模块,所述任务获取模块用于获取第一同步任务,对所述第一同步任务进行分片,得到至少一个分片任务,其中,所述第一同步任务中包括多条数据id,各个所述分片任务分别包括若干个连续的数据id,具体如实施例一中所述;
[0152]
数据读取模块,所述数据读取模块用于根据各个所述分片任务生成迁移计划,当所述至少一个分片任务中的目标分片任务对应的迁移计划被执行时,根据所述目标分片任务中的数据id分别从第一数据源中读取对应的目标数据,具体如实施例一中所述;
[0153]
同步模块,所述同步模块用于将读取到的各个所述目标数据同步至第二数据源中,具体如实施例一中所述。
[0154]
实施例三
[0155]
基于上述实施例,本发明还相应提供了一种终端,如图11所示,所述终端包括处理器10以及存储器20。图11仅示出了终端的部分组件,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。
[0156]
所述存储器20在一些实施例中可以是所述终端的内部存储单元,例如终端的硬盘或内存。所述存储器20在另一些实施例中也可以是所述终端的外部存储设备,例如所述终端上配备的插接式硬盘,智能存储卡(smart media card,smc),安全数字(secure digital,sd)卡,闪存卡(flash card)等。进一步地,所述存储器20还可以既包括所述终端的内部存储单元也包括外部存储设备。所述存储器20用于存储安装于所述终端的应用软件及各类数据。所述存储器20还可以用于暂时地存储已经输出或者将要输出的数据。在一实施例中,存储器20上存储有数据同步程序30,该数据同步程序30可被处理器10所执行,从而实现本技术中数据同步方法。
[0157]
所述处理器10在一些实施例中可以是一中央处理器(central processing unit,cpu),微处理器或其他芯片,用于运行所述存储器20中存储的程序代码或处理数据,例如执行所述数据同步方法等。
[0158]
在一实施例中,当处理器10执行所述存储器20中数据同步程序30时实现以下步骤:
[0159]
获取第一同步任务,对所述第一同步任务进行分片,得到至少一个分片任务,其
中,所述第一同步任务中包括多条数据id,各个所述分片任务分别包括若干个连续的数据id;
[0160]
根据各个所述分片任务生成迁移计划,当所述至少一个分片任务中的目标分片任务被执行时,根据所述目标分片任务对应的迁移计划中的数据id分别从第一数据源中读取对应的目标数据;
[0161]
将读取到的各个所述目标数据同步至第二数据源中。
[0162]
其中,所述根据各个所述分片任务生成迁移计划,包括:
[0163]
当已生成的迁移计划的数量小于所述分片任务的数量时,检测分布式锁;
[0164]
根据获得分布式锁的所述分片任务生成迁移计划并重复执行所述检测分布式锁的步骤直至已生成的迁移计划等于所述分片任务的数量。
[0165]
其中,所述根据所述目标分片任务对应的迁移计划中的数据id分别从第一数据源中读取对应的目标数据,包括:
[0166]
根据所述目标分片任务对应的迁移计划的开始id从所述第一数据源中读取预设数量条目标数据;
[0167]
其中,所述目标分片任务对应的迁移计划的所述开始id的初始值为所述目标分片任务中包括的若干个连续的数据id中的第一个数据id。
[0168]
其中,所述将读取到的各个所述目标数据同步至第二数据源中,包括:
[0169]
对读取到的各个所述目标数据进行第一预设处理后写入至所述第二数据源中;
[0170]
对写入至所述第二数据源中的所述目标数据进行第二预设处理,并将各个所述目标数据中最后一条数据对应的id更新所述目标分片任务中的所述开始id;
[0171]
重复执行所述根据所述目标分片任务对应的迁移计划中的数据id分别从第一数据源中读取对应的目标数据的步骤,直至将所述目标分片任务对应的迁移计划中的结束id对应的数据写入至所述第二数据源中。
[0172]
其中,所述将读取到的各个所述目标数据同步至第二数据源中之后,还包括:
[0173]
获取第二同步任务,所述第二同步任务中包括同步时间戳;
[0174]
根据所述同步时间戳在所述第一数据源中查找各个第一目标数据id,所述第一目标数据id对应的数据的更新时间戳不早于所述同步时间戳;
[0175]
分别获取各个所述第一目标数据id对应的第一更新时刻和第二更新时刻,所述第一更新时刻为所述第一目标数据id在所述第一数据源中对应的数据的更新时刻,所述第二更新时刻为所述第一目标数据id在所述第二数据源中对应的数据的更新时刻;
[0176]
当所述第一目标数据id对应的所述第一更新时刻晚于所述第二更新时刻时,从所述第一数据源中读取所述第一目标数据id对应的数据并进行第一预设处理,根据进行所述第一预设处理后的数据更新所述第二数据源中所述第一目标数据id对应的数据。
[0177]
其中,所述根据进行所述第一预设处理后的数据更新所述第二数据源中所述第一目标数据id对应的数据之后,包括:
[0178]
当所述第一数据源中更新时刻最晚的数据的更新时间戳与所述同步时间戳相同,对所述同步时间戳进行更新,更新后的所述同步时间戳对应的时刻晚于更新前的所述同步时间戳对应的时刻;
[0179]
当所述第一数据源中更新时刻最晚的数据的更新时间戳晚于所述同步时间戳,将
所述同步时间戳更新为所述第一数据源中更新时刻最晚的数据的更新时间戳。
[0180]
其中,所述所述将读取到的各个所述目标数据同步至第二数据源中之后,还包括:
[0181]
获取第三同步任务,所述第三同步任务中包括同步计划表;
[0182]
当所述第一数据源中的数据发生变更时,将发生变更的数据的数据id记录至所述同步计划表中并标记状态为处理成功;
[0183]
从所述同步计划表中读取第二目标数据id,所述第二目标数据id为所述同步计划表中状态为处理成功的数据id,若所述第二目标数据id在所述第一数据源中对应的数据的更新时间戳晚于在所述第二数据源中对应的数据的更新时间戳,则从所述第一数据源中读取所述第二目标数据id对应的数据并进行第一预设处理,根据进行所述第一预设处理后的数据更新所述第二数据源中所述第二目标数据id对应的数据;
[0184]
将所述第二目标数据id在所述同步计划表中的状态修改为已处理;
[0185]
清空所述同步计划表中状态为已处理的数据id。
[0186]
实施例四
[0187]
本发明还提供一种计算机可读存储介质,其中,存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现如上所述的数据同步方法的步骤。
[0188]
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1