一种跨机房数据库同步方法及系统的制作方法

文档序号:6489997阅读:452来源:国知局
一种跨机房数据库同步方法及系统的制作方法
【专利摘要】本申请公开了一种跨机房数据库同步方法,用于目标数据库跨机房的从源数据库同步数据,包括如下步骤:步骤100、在源数据库端监听源数据库的变更;步骤110、利用多个顺序编号的并行进程依次提取源数据库的变更数据;步骤120、各个并行进程将提取到的数据经合并、压缩后进行发送;步骤130、在目标数据库端接收各个并行进程发送的数据,按照各并行进程的次序进行加载得到待同步数据,利用该待同步数据更新目标数据库。本申请采用多线程并行处理的思路,利用SQL语义执行的特性,通过对数据的合并、压缩、并行处理等完整的传输方案,来缓解目前跨机房、跨地区网络的同步延迟问题。
【专利说明】一种跨机房数据库同步方法及系统
【技术领域】
[0001 ] 本申请涉及计算机及网络【技术领域】,尤其涉及一种跨机房数据库同步传输方法和系统。
【背景技术】
[0002]目前针对一些大型网站业务,在系统可用性上往往会考虑数据库的跨机房镜像复制,容灾备份等,在发生不可抗力因素导致当地数据不可用时,能够快速的通过异步的数据库备份或者镜像提供系统访问。
[0003]在做数据库同步时,目前一般的做法是通过数据库DML/DDL的变更日志解析,发送给目标库后再重新执行一次数据库DML/DDL变更,以达到两边的数据库保持一致。这种做法针对跨机房,跨地区网络的数据库同步,存在的一个问题就是数据的传输量以及重新执行的代价,源数据库和目标数据库完全是1:1的模式,源库的一次变更,就会有一份数据传输以及一次DDL/DML执行。
[0004]目前杭州到青岛的单个tcp包的网络延迟为70ms,杭州到美国的单个tcp包的网络延迟为200ms,一旦同一时间数据库的变更达到一个高峰,数据库的同步过程会因为网络传输和重新执行而造成阻塞,从而导致数据库同步延迟。因此,针对一些跨机房,跨地区网络的数据库同步,如何减少传输数据以及减少重新执行的代价就非常关键。
[0005]现有的技术通常是利用数据库自带的解决方案,比如使用比较广泛的mysql数据库同步。mysql同步会将数据库变更的记录存入binlog文件,并提供socket服务,由需要执行同步的目标库发起一次数据同步请求。
[0006]目前mysql5版本自带数据库复制方案,同步系统本身与mysqlserver进行了集成,作为一个mysql组件存在。例如源数据库为A,目标数据库为B,同步系统为C,同步过程如下:
[0007]I)同步系统通过单个socket链接和数据库建立链接,开始监听数据变更;
[0008]2)原始数据在数据库A中发生insert/update/delete等操作;
[0009]3)数据库A会在本地生成变更日志数据;
[0010]4)同步系统监听到数据变更,通过建立的socket开始获取变更数据;
[0011]5)在异步接收完整个变更数据包后,解析为内部执行对象;
[0012]6)根据数据库A上的变更操作,在目标数据库B上重新执行insert/update/delete等操作。
[0013]但现有技术mysql同步主要存在以下问题:
[0014]I)为保证同步顺序性,mysql采用了 tcp长链接的方式进行数据传输。
[0015]2)为保证数据的可靠性,mysql采用了 ack请求的回馈模式+顺序传输。只有上一批数据完全获取成功后,才会去获取下一批数据,并且同一时间只有一份数据在传输。
[0016]3) mysql变更日志文件binlog详细记录每次数据库的变更,可以提供DBA (数据库管理员)详细查看后用于分析数据库的历史变更记录,并不是仅仅为数据库的高效同步而特殊设计的,所以存在很多冗余数据,造成数据量巨大。
[0017]针对跨机房,跨地区网络的同步业务,传统的单tcp工作模式面对高峰时期的数据库变更同步时,会产生数据堆积,造成网络拥堵。

【发明内容】

[0018]本申请提出了一种高效、可靠的数据库同步方法及系统,采用多线程并行处理的思路,利用SQL语义执行的特性,通过对数据的合并、压缩、并行处理等完整的传输方案,来缓解目前跨机房、跨地区网络的同步延迟问题。
[0019]一种跨机房数据库同步方法,用于目标数据库跨机房的从源数据库同步数据,包括如下步骤:
[0020]步骤100、在源数据库端监听源数据库的变更;
[0021]步骤110、利用多个顺序编号的并行进程依次提取源数据库的变更数据;
[0022]步骤120、各个并行进程将提取到的数据经合并、压缩后进行发送;
[0023]步骤130、在目标数据库端接收各个并行进程发送的数据,按照各并行进程的次序进行加载得到待同步数据,利用该待同步数据更新目标数据库。
[0024]所述步骤100中,在源数据库端通过socket和源数据库建立链接,监听数据变更,所述源数据库的变更为Insert、Update、Delete至少一种事件的触发。
[0025]源数据库发生insert、update或delete事件时会在本地生成变更日志数据,通过建立的socket可以获取变更数据。
[0026]步骤110具体包括:
[0027]步骤111、开启多个并行进程并对每个并行进程赋以编号;
[0028]步骤112、各个并行进程按照编号依次提取源数据库的变更数据,且在提取的同时进行解析得到若干内部对象,即步骤120所述的提取到的数据。
[0029]所述步骤110中,按照系统并行度的设置开启多个并行进程,编号在前的并行进程先提取源数据库的变更数据,满足设定的数据量后,下一个并行进程再开始提取,以此类推。
[0030]所述步骤112中,通过与源数据库相匹配的协议格式解析得到所述内部对象,该内部对象的数据结构包括事件类型、主键信息和变更字段。
[0031]本申请中内部对象的数据结构采用常用数据库的数据结构类型,例如使用比较广泛的mysql数据库等。
[0032]步骤120中,所述的合并包括:
[0033]步骤121、同一并行进程中,将主键信息相同的内部对象构建为子链表;
[0034]步骤122、将同属一个子链表的所有内部对象按照对应的变更字段依次进行运算,处理得到合并后的内部对象。
[0035]源数据库的变更过程中,每一次事件的触发以及所涉及的变更数据可对应一个内部对象,若在一个并行进程中包含了多次的变更操作,在进行数据提取和解析后就对应的生成多个内部对象,在步骤121中,将同一并行进程的所有内部对象进行分类,每一类构建生成一个子链表,同一子链表中的各个内部对象具有相同的主键信息。
[0036]在所述步骤122中,按照子链表内各个内部对象的顺序(按照内部对象中所涉及的变更操作的发生时间),依次的进行运算,例如首先将前两个内部对象进行运算得到运算后的内部对象,再将该运算后的内部对象与第三个内部对象进行运算,以此类推,直至完成同一子链表中所有内部对象的运算,得到合并后的内部对象。
[0037]在步骤130中,目标数据库端可以同时接收各个并行进程发送的数据,由于各并行进程是按次序编号的,因此,目标数据库端在对接收的数据进行恢复和加载时,也要按照并行进程的编号进行,直至完成所有变更数据的处理。
[0038]本申请还提供一种跨机房数据库同步系统,用于目标数据库跨机房的从源数据库同步数据,包括:
[0039]监听模块,用于在源数据库端监听源数据库的变更;
[0040]提取模块,用于利用多个顺序编号的并行进程依次提取源数据库的变更数据;
[0041]数据处理模块,用于各个并行进程将提取到的数据经合并、压缩后进行发送;
[0042]接收模块,用于在目标数据库端接收各个并行进程发送的数据,按照各并行进程的次序进行加载得到待同步数据,利用该待同步数据更新目标数据库。
[0043]所述监听模块中,源数据库的变更为Insert、Update、Delete至少一种事件的触发。
[0044]所述提取模块包括:
[0045]进程启动模块,用于开启多个并行进程并对每个并行进程赋以编号;
[0046]解析模块,用于各个并行进程按照编号依次提取源数据库的变更数据,且在提取的同时进行解析得到若干内部对象,即数据处理模块中所述的提取到的数据。
[0047]所述解析模块,通过与源数据库相匹配的协议格式解析得到所述内部对象,该内部对象的数据结构包括事件类型、主键信息和变更字段。
[0048]所述数据处理模块包括依次对提取到的数据进行相应处理的合并模块、压缩模块和发送模块,其中所述合并模块包括:
[0049]建子链表模块,用于同一并行进程中,将主键信息相同的内部对象构建为子链表;
[0050]运算合并模块,用于将同属一个子链表的所有内部对象按照对应的变更字段依次进行运算,处理得到合并后的内部对象。
[0051]本申请跨机房数据库同步方法及系统的有益效果:
[0052]相比于现有的同步模式,引入了数据的合并,使数据传递最小化。采用并行同步过程,尽可能将数据传递并行化,网络传输的时间延迟仅发生在第一个并行过程所需要的网络传输时间,针对跨机房、跨地区网络的同步中,可避免数据堆积。
【专利附图】

【附图说明】
[0053]图1为本申请跨机房数据库同步方法流程图;
[0054]图2为本申请跨机房数据库同步方法中各个并行进程提取源数据库数据变更流程图;
[0055]图3为本申请跨机房数据库同步方法数据合并步骤流程图;
[0056]图4为本申请跨机房数据库同步系统示意图;
[0057]图5为本申请跨机房数据库同步方法示意图(以3个并行进程为例);[0058]图6为本申请跨机房数据库同步方法数据合并步骤示意图。
【具体实施方式】
[0059]以下结合附图对本申请技术方案进行进一步的描述。
[0060]参见图1、图5,以mysql系统为例,源数据库与目标数据库处在不同的机房,利用本申请的数据库同步方法,可以高效的完成目标数据库与源数据库的同步更新,本申请跨机房数据库同步方法包括:
[0061]步骤100、在源数据库端与源数据库按照协议格式定义,建立socket链接,通过socket链接监听数据变更,源数据库的变更为Insert、Update、Delete至少一种事件的触发。
[0062]其中,源数据库与目标数据库遵循mysql同步协议,比如mysql数据同步协议;文档:http: //forge, mysql.com/wiki/MySQL_Internals_Binary_Log。通过mysql server 提供的数据变更socket服务,进一步的获取对应的变更数据。
[0063]步骤110、利用多个顺序编号的并行进程依次提取源数据库的变更数据,参见图
2,具体包括:
[0064]步骤111、按照系统并行度的设置开启多个并行进程并对每个并行进程赋以编号;例如开启5个并行进程,有序递增的编号为并行进程1、并行进程2、并行进程3、并行进程
4、并行进程5。
[0065]步骤112、各个并行进程按照编号依次通过socket链接向获取源数据库的变更数据。
[0066]编号在前的并行进程先提取源数据库的变更数据,满足设定的数据量后,下一个并行进程再开始提取,按序号从小到大依次进行数据提取,整个过程为串行。
[0067]在提取的同时通过协议格式解析mysql server返回的binlog数据,解析为同步系统的内部对象(Entry),在源数据库的变更过程中,每一次事件的触发对应得到一个内部对象。
[0068]Entry的数据结构如下:
[0069]a)事件类型:
[0070]主要分为DDL/DML执行,数据同步主要针对DML操作事件,DML操作事件主要分为Insert、Update、Delete 三种事件。
[0071]b)主键信息
[0072]数据库中表的主键字段,包括主键名,主键值。
[0073]c)变更字段
[0074]数据库中表的当前变更字段,包括变更字段名,变更前值,变更后值。
[0075]步骤120、各个并行进程将提取到的数据经合并、压缩后进行发送;如图3所示,其中的合并过程具体包括:
[0076]步骤121、同一并行进程中,将主键信息相同的内部对象构建为子链表;即对同一并行进程的所有内部对象进行分类,每一类构建生成一个子链表,同一子链表中的各个内部对象具有相同的按照主键信息。
[0077]参见图6,例如将具有相同主键信息A的各个内部对象构建生成子链表pkl,在子链表pkl中各个内部对象的数据变更的类型(insert、update或delete)可能相同也可能不相同。
[0078]同理,将具有相同主键信息B的各个内部对象构建生成子链表pk2,将具有相同主键信息C的各个内部对象构建生成子链表pk3,以此类推。
[0079]就每个并行进程而言,可以包含一个或多个子链表,根据每个并行进程的数据容量而定。
[0080]步骤122、将同属一个子链表的所有内部对象按照对应的变更字段依次进行运算,处理得到合并后的内部对象。
[0081]运算主要针对DML操作事件(Insert、Update、Delete),运算时首先将前两个内部对象进行运算得到运算后的内部对象,再将该运算后的内部对象与第三个内部对象进行运算,以此类推,直至完成同一子链表中所有内部对象的运算,得到合并后的内部对象。
[0082]两个进行运算的内部对象中,若变更字段不同,则将不同变更字段的变更类型以及变更前后的值合并至运算后的内部对象;
[0083]例如前一个Entry的变更类型为Insert,插入内容为A的字段,而后一个Entry的变更类型为Update,即对原有的内容为B的字段进行了更新而得到内容B',那么运算后的Entry则视为存在两个变更,即插入内容为A的字段以及对原有的内容为B的字段进行了更新而得到内容B'。
[0084]两个进行运算的内部对象中,若变更字段相同,则将该变更字段经两次变更后的值合并至运算后的内部对象。
[0085]变更字段相同时的具体运算规则如下:
[0086]a) Entry (Insert 类型)+Entry (Update 类型)=> Entry (Insert 类型);即将Entry (Update类型)对应的变更字段,替换掉Entry (Insert类型)中同名的变更字段。
[0087]例如在同一子链表中,前一个Entry的变更类型为Insert,插入了 3个字段:A字段(A内容)、B字段(B内容)、C字段(C内容)。
[0088]而后一个Entry的变更类型为Update,更新了 I个字段得到B字段(B’内容)',那么运算后的Entry:A字段(A内容)、B字段(B’内容)、C字段(C内容),即B字段使用了第二次update的内容,其他字段的都使用第一次insert的内容。
[0089]b) Entry (Insert 类型)+Entry (Delete 类型)=> Entry (Delete 类型),即直接返回 Entry (Delete 类型)。
[0090]例如在同一子链表中,前一个Entry的变更类型为Insert,插入A字段(A内容),而后一个Entry的变更类型为Delete,即删除A字段(A内容),那么运算后的Entry则视为删除A字段(A内容)。
[0091]c) Entry (Update 类型)+Entry (Update 类型)=> Entry (Update 类型),即同名字段以后者变更字段覆盖前者。
[0092]例如在同一子链表中,前一个Entry的变更类型Update,得到变更后的3个字段:A字段(A内容)、B字段(B内容)、C字段(C内容)。
[0093]而后一个Entry的变更类型也为Update,变更了 2个字段得到:C字段(C’内容)、D字段(D内容)。
[0094]运算后的Entry:A字段(A内容)、B字段(B内容)、,C字段(C’内容)、D字段(D内容),可见C字段使用了第二次update的内容,字段为两次变更字段的合集。
[0095]又例如在同一子链表中,前一个Entry的变更类型Update,变更了 3个字段后得到A字段(A内容)、B字段(B内容)、C字段(C内容)。
[0096]而后一个Entry的变更类型也为Update,变更了 2个字段得到D字段(D内容)、E字段(E内容)。
[0097]运算后的Entry:A字段(A内容)、B字段(B内容)、C字段(C内容)、D字段(D内容)、E字段(E内容),即两次变更没有交集,合并的结果为5个字段,字段为两次变更字段的合集。
[0098]d) Entry (Update 类型)+Entry (Delete 类型)=> Entry (Delete 类型),直接返回 Entry (Delete 类型)。
[0099]例如在同一子链表中,前一个Entry的变更类型为Update,即对A字段(A内容)进行了更新得到A字段(A’内容),而后一个Entry的变更类型为Delete,即删除A字段,那么运算后的Entry则视为删除更新后的A字段。
[0100]e) Entry (Delete 类型)+Entry (Insert 类型)=> Entry (Insert 类型),直接返回 Entry (Insert 类型)。
[0101]例如在同一子链表中,前一个Entry的变更类型Delete,即删除A字段(A内容),而后一个Entry的变更类型为Insert,即插入A字段(A内容),那么运算后的Entry则视为插入A字段(A内容)。
[0102]在步骤120中经以上处理得到合并后的内部对象,再进行压缩和发送,其中压缩时首先通过数据对象序列化将合并后的内部对象转化为二进制,具体算法可以采用高效数据对象序列化算法:google protobuf ;
[0103]文档:https: //developers, google, com/protocol-buffers/docs/overview。
[0104]针对序列化后的数据再通过压缩算法进一步压缩,具体算法可以采用高效数据压缩算法:gzip ;文档:http://www.gzip.0rg/。
[0105]完成压缩后可以利用传统的tcp传输方式,可靠的将数据传递给目标数据库端。
[0106]步骤130、在目标数据库端接收各个并行进程发送的数据(压缩后的数据),按照各并行进程的次序进行加载得到待同步数据,利用该待同步数据更新目标数据库。
[0107]在目标数据库端按照mysql server同步协议,顺序的重新执行变更数据,在进行数据库重新执行变更记录之前,会进行并行过程重排。按照原先的数据获取顺序,也就是按并行过程序号从小到大,先加载并行进程I的数据,再加载并行进程2的数据,最后依次加载直到完成,此整个过程为串行。
[0108]整个同步过程中,源数据库端与目标数据库端一直维护已经开启的并行进程,以避免通信的间断。
[0109]本实施例还提供一种跨机房数据库同步系统,用于目标数据库跨机房的从源数据库同步数据,如图4所示,包括:
[0110]监听模块200,用于在源数据库端监听源数据库的变更,源数据库的变更为Insert、Update、Delete至少一种事件的触发;
[0111]提取模块210,用于利用多个顺序编号的并行进程依次提取源数据库的变更数据;[0112]数据处理模块220,用于各个并行进程将提取到的数据经合并、压缩后进行发送;
[0113]接收模块230,用于在目标数据库端接收各个并行进程发送的数据,按照各并行进程的次序进行加载得到待同步数据,利用该待同步数据更新目标数据库。
[0114]提取模块210包括:
[0115]进程启动模块211,用于开启多个并行进程并对每个并行进程赋以编号;
[0116]解析模块212,用于各个并行进程按照编号依次提取源数据库的变更数据,且在提取的同时进行解析得到若干内部对象,解析时通过与源数据库相匹配的协议格式解析得到所述内部对象,该内部对象的数据结构包括事件类型、主键信息和变更字段。
[0117]数据处理模块220包括依次对提取到的数据进行相应处理的合并模块221、压缩模块222和发送模块223,其中合并模块221包括:
[0118]建子链表模块2211,用于同一并行进程中,将主键信息相同的内部对象构建为子链表;
[0119]运算合并模块2212,用于将同属一个子链表的所有内部对象按照事件类型的不同组合依次进行运算,处理得到合并后的内部对象。
[0120]本申请跨机房数据库同步方法和系统引入了数据的合并,使数据传递最小化,采用并行进程,每个并行进程拿到数据后,在各自的进程中会依次进入数据的合并、压缩和传送,多个并行进程互不干扰,这样在针对跨机房、跨地区网络的同步中,提高的效率,避免数据堆积。
[0121]本申请跨机房数据库同步系统的各个模块可以集成于一体,也可以分离部署,或进一步拆分成多个子模块。各个模块可以按照实施例描述分布于实施例的系统中,也可以进行相应变化位于不同于本实施例的一个或多个系统中。
[0122]本领域的技术人员应该明白,本申请的实施例可提供成为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。
[0123]本申请的各模块或各步骤可以用通用的计算装置来实现,可选地,它们可以用计算装置可执行的程序代码来实现,从而可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。因此,本申请不限制于任何特定的硬件和软件结合。
[0124]以上公开的仅为本申请的具体实施例,但是本申请并非局限于此,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。显然这些改动和变型均应属于本申请要求的保护范围保护内。
【权利要求】
1.一种跨机房数据库同步方法,用于目标数据库跨机房的从源数据库同步数据,其特征在于,包括如下步骤: 步骤100、在源数据库端监听源数据库的变更; 步骤110、利用多个顺序编号的并行进程依次提取源数据库的变更数据; 步骤120、各个并行进程将提取到的数据经合并、压缩后进行发送; 步骤130、在目标数据库端接收各个并行进程发送的数据,按照各并行进程的次序进行加载得到待同步数据,利用该待同步数据更新目标数据库。
2.如权利要求1所述的跨机房数据库同步方法,其特征在于,步骤100中,所述源数据库的变更为Insert、Update、Delete至少一种事件的触发。
3.如权利要求1所述的跨机房数据库同步方法,其特征在于,步骤110具体包括: 步骤111、开启多个并行进程并对每个并行进程赋以编号; 步骤112、各个并行进程按照编号依次提取源数据库的变更数据,且在提取的同时进行解析得到若干内部对象,即步骤120所述的提取到的数据。
4.如权利要求3所述的跨机房数据库同步方法,其特征在于,步骤112中,通过与源数据库相匹配的协议格式解析得到所述内部对象,该内部对象的数据结构包括事件类型、主键信息和变更字段。
5.如权利要求4所述的跨机房数据库同步方法,其特征在于,步骤120中,所述的合并包括: 步骤121、同一并行进程中,将主键`信息相同的内部对象构建为子链表; 步骤122、将同属一个子链表的所有内部对象按照对应的变更字段依次进行运算,处理得到合并后的内部对象。
6.一种跨机房数据库同步系统,用于目标数据库跨机房的从源数据库同步数据,其特征在于,包括: 监听模块,用于在源数据库端监听源数据库的变更; 提取模块,用于利用多个顺序编号的并行进程依次提取源数据库的变更数据; 数据处理模块,用于各个并行进程将提取到的数据经合并、压缩后进行发送; 接收模块,用于在目标数据库端接收各个并行进程发送的数据,按照各并行进程的次序进行加载得到待同步数据,利用该待同步数据更新目标数据库。
7.如权利要求6所述的跨机房数据库同步系统,其特征在于,所述监听模块中,源数据库的变更为Insert、Update、Delete至少一种事件的触发。
8.如权利要求6所述的跨机房数据库同步系统,其特征在于,所述提取模块包括: 进程启动模块,用于开启多个并行进程并对每个并行进程赋以编号; 解析模块,用于各个并行进程按照编号依次提取源数据库的变更数据,且在提取的同时进行解析得到若干内部对象,即数据处理模块中所述的提取到的数据。
9.如权利要求8所述的跨机房数据库同步系统,其特征在于,所述解析模块,通过与源数据库相匹配的协议格式解析得到所述内部对象,该内部对象的数据结构包括事件类型、主键信息和变更字段。
10.如权利要求9所述的跨机房数据库同步系统,其特征在于,所述数据处理模块包括依次对提取到的数据进行相应处理的合并模块、压缩模块和发送模块,其中所述合并模块包括: 建子链表模块,用于同一并行进程中,将主键信息相同的内部对象构建为子链表;运算合并模块,用于将同属一个子链表的所有内部对象按照对应的变更字段依次进行运算, 处理得到合并后的内部对象。
【文档编号】G06F17/30GK103778136SQ201210400979
【公开日】2014年5月7日 申请日期:2012年10月19日 优先权日:2012年10月19日
【发明者】楼江航 申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1