主备数据库同步的方法和装置制造方法
【专利摘要】本发明涉及一种主备数据库同步的方法和装置,用于主数据库和备数据库间的数据同步,该方法包括:事务派发步骤,将从主数据库读取的各个事务或各个事务的标识派发至写队列;事务写入步骤,采用多个写线程并行将各写线程对应的写队列中的事务或标识对应的事务写入备数据库。本发明采用多个写线程同时并行执行写入操作,减少了时延,可及时实现主备数据库同步,提高了同步效率。
【专利说明】主备数据库同步的方法和装置
【技术领域】
[0001]本申请涉及数据处理领域,尤其是一种数据库主备数据库同步的方法和装置。
【背景技术】
[0002]MySQL是互联网行业广泛使用的开源数据库软件。很多大型网站都在使用MySQL数据库,随着业务规模不断的增长,一台MySQL数据库会无法支撑庞大的访问量。
[0003]有一个有效的解决方案就是建立MySQL主备集群,备数据库是主数据库的完全镜像。写请求只落在主数据库上,读请求会均衡的分布到所有数据库上,这样整个集群可以提供更大容量的读写服务。MySQL主数据库在接收新增变更数据后,再通过同步工具,把变更数据实时同步到备数据库。
[0004]Mysql binlog日志是一种二进制日志,包括三种格式,分别为ROW(行)格式、Statement (SQL语句)格式、MIX (混合)格式。其中ROW格式记录了每次数据变更的整行完整的旧值和新值。信息丰富完整,并且拥有重复复制到从库,得到的最终数据还是一致的特性。
[0005]MySQL官方提供社区版,主备同步采用的是单线程同步。当主数据库有较高的写入负载时,主从同步的延时增加,导致从库不能及时的读取到最新的数据,降低了整个集群的可用性。
【发明内容】
[0006]本申请要解决的技术问题是提供一种主备数据库同步的方法和装置,以解决现有主备数据库同步效率低下的问题。
[0007]为解决上述技术问题,本申请提供了一种主备数据库同步的方法,用于主数据库和备数据库间的数据同步,该方法包括:
[0008]事务派发步骤,将从主数据库读取的各个事务或各个事务的标识派发至写队列;
[0009]事务写入步骤,采用多个写线程并行将各写线程对应的写队列中的事务或标识对应的事务写入备数据库。
[0010]进一步地,所述派发步骤前,该方法还包括:
[0011 ] 预处理步骤,依次提取各个事务的主键,为各个事务创建主键列表,根据各个事务的主键列表,依次将各个事务的标识放入各个事务的主键对应的主键事务队列中,处于主键事务队列的队首的事务获得该主键对应的虚拟记录锁;
[0012]派发事务或写入事务的前提为该事务的虚拟记录锁总数等于该事务的主键列表中主键的总数。
[0013]进一步地,所述预处理步骤中,去除重复的主键后创建所述主键列表。
[0014]进一步地,所述派发步骤还包括:对于已经写入备数据库的事务,删除位于主键事务队列队首的该事务的事务标识,将虚拟记录锁传递给该主键事务队列的下一个节点。
[0015]进一步地,所述事务派发步骤由派发线程执行,预处理步骤中,为各个事务创建虚拟记录锁计数器,该事务每获得一个虚拟记录锁,该虚拟记录锁计数器加1,所述派发线程或写线程根据所述虚拟记录锁计数器判断当前事务的虚拟记录锁总数等于该事务的主键列表中主键的总数。
[0016]进一步地,事务派发步骤中,根据写队列最短原则或事务哈希值为当前事务选择写队列。
[0017]进一步地,述事务的哈希值是将各个事务的第一个主键转换成字符串,再通过哈希计算得到的。
[0018]进一步地,事务写入步骤之后,该方法还包括删除步骤,删除已写入备数据库的事务对象。
[0019]为解决上述技术问题,本发明还提供了一种主备数据库同步的装置,该装置包括:
[0020]派发单元,用于依次将从主数据库读取的各个事务或各个事务的标识派发至写队列;
[0021]写入单元,用于采用多个写线程并行将各写线程对应的写队列中的事务或标识对应的事务写入备数据库;
[0022]若干个写队列,用于存放派发单元派发的事务或事务的标识,一个写队列对应一个写线程。
[0023]相较于现有技术,本申请技术方案同步的最小单位是事务;在同步过程中确保了事务的原子性;且采用多个写线程同时并行执行写入操作,减少了时延,可及时实现主备数据库同步,提高了同步效率,增加了集群的可用性。
【专利附图】
【附图说明】
[0024]图1为本申请主备数据库同步的方法实施例1的示意图;
[0025]图2为本申请主备数据库同步的方法实施例2的示意图;
[0026]图3为本申请主备数据库同步的方法实施例3的示意图;
[0027]图4为本申请主备数据库同步的方法实施例4的示意图;
[0028]图5是本申请给出的一个应用实例的示意图;
[0029]图6为本发明主备数据库同步的装置的模块结构示意图;
[0030]图7为本发明主备数据库同步的装置的另一模块结构示意图。
【具体实施方式】
[0031 ] 下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。显然,所描述的实施例仅仅是本申请一部分实施例,而非全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
[0032]实施例1
[0033]本申请实施例主备数据库同步的方法,如图1所示,用于主数据库和备数据库间的数据同步,该方法包括:[0034]步骤101:事务派发步骤,依次将从主数据库读取的各个事务或各个事务的标识派发至写队列;
[0035]本申请实施例从主数据库读出的事务的读出的顺序为其在主数据库中提交并写入日志的顺序。
[0036]该事务派发步骤由一个派发线程实现。
[0037]事务派发步骤中,根据写队列最短原则或事务哈希值为当前事务选择写队列。
[0038]较佳地,采用写队列最短原则,即将当前待派发的事务派发至最短的写队列(即任务量最少的写队列),如此,可以较好地达到负载均衡。
[0039]本申请对获得事务的哈希值的方法不做限定,可选地,事务的哈希值可将各个事务的第一个主键转换成字符串,再通过哈希计算得到的。
[0040]步骤102:事务写入步骤,采用多个写线程并行将各写线程对应的写队列中的事务或标识对应的事务写入备数据库。
[0041]本申请中,同步的最小单位是事务;写入备数据库时,可以确保事务不被打散,SP主数据库是一个事务写入的记录,从库中也会在一个事务中写入,在同步过程中确保了事务的原子性。
[0042]可理解地,即使利用单线程将事务的标识串行派发至写队列,其速度仍然较快,而在事务写入备数据库时,采用多个写线程同时并行执行写入操作,减少了时延,可及时实现主备数据库同步,提高了同步效率,增加了集群的可用性。
[0043]实施例2
[0044]本申请主备数据库同步的方法,如图2所示,用于主数据库和备数据库间的数据同步,该方法包括:
[0045]步骤201:预处理步骤,依次提取从主数据库读取的各个事务的主键,为各个事务创建主键列表,根据各个事务的主键列表,依次将各个事务的标识放入各个事务的主键对应的主键事务队列中,处于主键事务队列的队首的事务该主键对应的虚拟记录锁;
[0046]本文中,一个主键对应一个主键事务队列,不同的主键对应不同的主键事务队列。一个事务在写入备数据库之前,需要获得该事务每条记录对应的主键所对应的虚拟记录锁。
[0047]例如,事务A的N个行记录的主键均为a,则该主键a的主键事务队列中包括该事务A的N个标识,当该主键事务队列的队首存放事务A的标识时,该事务A依次获得该主键的N个虚拟记录锁。
[0048]每个主键对应一个主键事务队列(PK Tran Queue)。各个主键的虚拟记录锁按如下方式维护:事务标识处于主键事务队列的队首的事务,获得该主键对应的虚拟记录锁;当队首的事务标识对应的事务已经写入备数据库后,删除队首,将虚拟记录锁传递给该队列的下一个节点。
[0049]步骤202:事务派发步骤,当事务的虚拟记录锁总数等于该事务的主键列表中主键的总数时将该事务派发至写队列;
[0050]该事务派发步骤由一个派发线程实现。
[0051]事务派发步骤中,根据写队列最短原则或事务哈希值为当前事务选择写队列。
[0052]较佳地,采用写队列最短原则,即选择最短的写队列派发事务,可以较好地达到负载均衡。
[0053]本申请对获得事务的哈希值方法不做限定,可选地,事务的哈希值可将各个事务的第一个主键转换成字符串,再通过哈希计算得到的。
[0054]步骤203:事务写入步骤,采用多个写线程并行将各写线程对应的写队列中的事务或标识对应的事务写入备数据库。
[0055]可理解地,即使利用单线程将事务标识串行派发至写队列,其速度仍然较快,而在写入备数据库时,采用多个写线程同时并行执行写入操作,减少了时延,可及时实现主备数据库同步,提高了同步效率,增加了集群的可用性。
[0056]可优化地,以上实施例2中,步骤201预处理步骤中,为各个事务创建虚拟记录锁计数器,该事务每获得一个虚拟记录锁,该虚拟记录锁计数器加1,步骤202事务派发步骤中,派发线程根据所述虚拟记录锁计数器判断当前事件的虚拟记录锁总数是否等于该事务的主键列表中主键的总数,进而决定是否将该事务派发至写队列。
[0057]可选地,以上实施例2的步骤201预处理步骤中,创建的主键列表前,可删除其中重复的主键,例如,事务A的N个行记录的主键均为a,则删除重复的主键后,此时主键a仍然对应事务A的N个行记录。该主键a的主键事务队列中包括该事务A的一个标识(比如指针),相应的,当事务A的标识排在主键a对应的主键事务队列的队首时,该事务A获得该主键的I个虚拟记录锁。步骤202事务派发步骤中,派发线程仍然通过判断该事件获得的虚拟记录锁总数是否等于该事务的主键列表中主键的总数来触发事务派发。
[0058]实施例3
[0059]本申请主备数据库同步的方法,如图3所示,用于主数据库和备数据库间的数据同步,该方法包括:
[0060]步骤301:预处理步骤,依次提取各个从主数据库读取的事务的主键,并去除重复的主键,为各个事务创建主键列表;根据各个事务的主键列表,依次将各个事务的标识(比如指针)放入该事务各个主键对应的主键事务队列中,事务标识处于主键事务队列的队首的事务获得该主键对应的虚拟记录锁;
[0061]步骤301中,依次从事务的各个行记录中提取主键,去除重复的主键后,一个主键对应一个或若干个行记录。
[0062]各个主键的虚拟记录锁按如下方式维护:处于主键事务队列队首的事务标识对应事务,获得该主键对应的虚拟记录锁;当队首的的事务标识对应事务已经写入备数据库后,删除队首,将虚拟记录锁传递给该队列的下一个节点。
[0063]步骤302:事务派发步骤,依次将各个事务或各个事务的标识派发至写队列;
[0064]该事务派发步骤由一个派发线程实现。
[0065]事务派发步骤中,根据写队列最短原则或事务哈希值为当前事务选择写队列。
[0066]较佳地,采用写队列最短原则,即选择最短的写队列派发事务,可以较好地达到负载均衡。
[0067]本申请对获得事务的哈希值方法不做限定,可选地,事务的哈希值可将各个事务的第一个主键转换成字符串,再通过哈希计算得到的。
[0068]步骤303:事务写入步骤,采用多个写线程并行实现,写线程判断位于写队列队首的事务的虚拟记录锁总数等于该事务的主键列表中主键的总数时,将该事务写入备数据库。
[0069]可理解地,即使利用单线程将事务标识串行派发至写队列,其速度仍然较快,而在写入备数据库时,采用多个写线程同时并行执行写入操作,减少了时延,可及时实现主备数据库同步,提高了同步效率,增加了集群的可用性。
[0070]可优化地,以上实施例3中,步骤301预处理步骤中,为各个事务创建虚拟记录锁计数器,该事务每获得一个虚拟记录锁,该虚拟记录锁计数器加1,步骤303事务写入步骤中,写线程根据所述虚拟记录锁计数器判断当前事务的虚拟记录锁总数等于该事务的主键列表中主键的总数。
[0071]实施例4
[0072]如图4,本实施例中大量使用了队列(Queue)和哈希(Hash)计算,所以本文也称本申请为哈希队列算法。
[0073]本实施例中包括输入队列(Input Queue),源队列(Source Queue)、主键事务队列(PK Tran Queue)、写队列(Wrtier Queue)、待释放队列(Free Queue)、预处理线程(Preprocess Thread),派发线程(Dispatcherd Thread),写线程(WrtierThread);其中只有写线程(Writer Thread)和写队列(Writer Queue)根据配置创建多个,其他均为单个实例;一个写线程对应一个写队列。
[0074]如图各个关键模块中维护和管理了一些队列,接下来按照数据流转的过程,介绍本方案的实施过程和关键模块:
[0075]步骤401,对输入队列(Input Queue)中的事务进行预处理;
[0076]输入队列(Input Queue)中存放着本申请的输入数据,即一个个事务的指针,按照主数据库中读出事务的顺序,先读出,先存入其事务指针,先消费。
[0077]预处理线程(Preprocess Thread),把输入队列中的事务指针对应的事务做如下处理:
[0078]创建事务队列节点(BinlogItem),包括如下属性:输入的事务,该事务的主键列表(PK List),事务的Hash值,虚拟记录锁计数器。
[0079]提取事务的主键,去除重复主键,对每个事务创建一个主键列表,包括事务中的每行记录对应的主键;
[0080]计算事务哈希(Hash)值,提取事务队列中的第一个主键,把他转换成字符串,例如“库名.表名.列名.值”,再通过Hash计算,把主键字符串映射为64位的长整形Hash值,作为事务派发到写队列中使用的Hash值。
[0081]初始化虚拟记录锁计算器的值为零。
[0082]源队列(Source Queue),事务预处理完成后,就放入到源队列(SourceQueue)。源队列只是用来暂存做完预处理的事务队列节点(BinlogItem);
[0083]主键事务队列(PK Tran Queue),即一个主键对应一个队列,这个队列中按先进先出的模式存放着预处理完的事务队列节点(BinlogItem)的指针;事务队列节点的指针位于主键事务队列的队首,即标志着对应的事务取得了该主键对应的虚拟记录锁;
[0084]一个事务有多少个不同主键,就进入多少个不同的主键事务队列;进入的对象直接是事务队列节点(BinlogItem)的指针,这个对象指向整个事务,事务由是由所有记录组成。[0085]根据各个事务的主键列表,依次将各个事务的事务队列节点的指针放入该事务各个主键对应的主键事务队列中,处于主键事务队列队首的事务队列节点的指针对应的事务即获得该主键对应的虚拟记录锁。
[0086]回收事务的记录占有的虚拟记录锁,当事务已经写入备数据库后,释放主键事务队列(PK Tran Queue)中的事务队列节点指针对应的事务。从该事务的事务主键列表中,逐个获得每个主键,再获得该主键对应的主键事务队列(PK Tran Queue),并删除队首,然后把虚拟记录锁传递给该主键事务队列(PKTran Queue)中的下一个节点(BinlogItem),即下一个节点对应的事务的虚拟记录锁计数器加I ;如果该队列已经是空的,即可删除释放该队列,完成本步骤后再释放队列节点对象。
[0087]待释放队列(Free Queue),先进先出队列,用来存放已经写入到备数据库的事务队列节点的指针;
[0088]派发线程根据待释放队列中的事务队列节点的指针,释放内存中对应的事务对象,此时写线程已将对应事务写入了备数据库,完成了同步。
[0089]虚拟记录锁,每条记录对应一个虚拟记录锁,虚拟记录锁有两种状态,锁定、未锁定;锁定状态是表示这条记录在本系统中已经锁定,把该记录写入备数据库,不会产生数据冲突;未锁定状态,表示该记录还不具备写入备数据库的先决条件。本申请中,一个事务在写入备数据库之前,需要获得该事务每条记录对应的主键所对应的虚拟记录锁;一个事务中所有不同记录的虚拟记录锁,采用事务队列节点(BinlogItem)的虚拟记录锁计数器属性来描述。获得一条记录的虚拟记录锁,即表示锁定该记录,或者说该记录的虚拟记录锁状态被设置为锁定。
[0090]虚拟记录锁计数器,是一个整形计数器,初始值为0,最大值等于步骤I预处理后事务的主键列表的大小(即主键列表中主键的总数);对应的事务每次获得一个虚拟记录锁,对应的数值就加1,当一个事务获得的所有虚拟记录锁的总数等于主键列表的大小时,表示该事务可以写入备数据库,而不会产生任何数据冲突了。
[0091]虚拟记录锁计算器是对单个事务而言,是否已经具写到从库的条件的标志。因为一个事务可能排在部分主键事务队列的队首,同时排在部分主键事务队列的队中,此种情况下,根据本申请,该事务就不具备执行派发或写入的前置条件,除非该事务获得所有虚拟记录锁。
[0092]步骤402:派发事务到写队列;
[0093]派发事务有两种方式:
[0094]a.先获得所有虚拟记录锁,再派发:先把事务队列节点的指针放到该事务队列节点所有主键对应的主键事务队列(PK Tran Queue)的队尾中,如果事务队列节点的指针已经排在队首,那么对应的事务队列节点即获得该主键对应的虚拟记录锁,该事务队列节点的虚拟记录锁计数器属性加I ;否则主键事务队列中事务队列节点就等待获取虚拟记录锁,当一个事务队列节点获得了所有的虚拟记录锁之后,即可被派发到写队列,派发的算法可以是,遍历写队列,把事务队列节点的指针或事务指针放入最短的写队列;也可以根据步骤I生成的事务哈希值,通过哈希算法派发,例如Tran Hash Value % WriteQueue Size即用事务哈希值取模队列数,得到的数值作为写队列数组的下标;
[0095]b.直接派发:先把事务队列节点的指针放到其所有主键对应的主键事务队列(PKTran Queue)中,如果事务队列节点的指针已经排在队首,那么对应的事务队列节点即获得该主键对应的虚拟记录锁;无论事务队列节点是否获得所有虚拟记录锁,都派发事务队列节点的指针到写队列。派发的算法可以据步骤I生成的事务哈希值,通过哈希算法派发。采用这种派发方式,写线程在把每个事务写入备数据库前需要检查该事务是否获得所有虚拟记录锁,如果没有则等待事务获得所有虚拟记录锁后再写入。
[0096]步骤403,并行写入事务,
[0097]写队列(Wrtier Queue)也是一个先进先出(FIFO)队列,存放由步骤402派发来的事务队列节点的指针;每个写线程对应一个写队列;
[0098]如果步骤403中采用a方式,则每个写线程根据自己的写队列中的事务队列节点的指针去内存取事务,按照数据库事务的标准写入事务(即开始事务,逐条写入记录,提交事务),写入完成后,把事务队列节点的指针的从写队列中移除,并放回到待释放队列(FreeQueue)。
[0099]如果步骤403中采用b方式,则写入之前,写线程先检查该事务队列节点是否获得所有虚拟记录锁,如果是那么写入;如果否那么等待该事务队列节点获得所有虚拟记录锁再执行写入操作
[0100]本申请采用C/C++会有较好的性能,但是也可以采用其他高级语言编写。在本申请的实施实验中,确定本申请可以使得备数据库写入达到极限;
[0101]本申请中预处理和派发事务到写队列是串行执行的,而写入步骤是并行执行,如此,对修改了相同记录的事务依次串行写入备数据库,对于不相关的事务即修改的是完全不同记录的事务,并行处理。
[0102]如图5所示,输入数据为三个有序的事务,事务I (Tran I)和事务2(Tran 2)都更新了同一条记录B,那么事务I和事务2应该串行,并且顺序必须是先写入事务1,再写入事务2。事务3和事务1、事务2都没关系,所以也可以并行写入。采用本申请机制,可以同时执行事务I和事务3的写入操作。而事务2,因为没有获得足够的虚拟记录锁,只好等待,直到它获得足够的虚拟记录锁,即可写入备数据库。从而对事务的并行和串行进行了有效控制,达到可以并行的并行,应该串行的串行。
[0103]在事务I和事务2的事务队列节点不写入同一个写队列时,在事务I写入前,如果是403a,则执行事务2的写线程会被挂起,直到事务I写完,并释放完虚拟记录锁;如果是403b,那么事务2在事务I写入之前都不会被派发至写队列。
[0104]以上实施例中,输入队列主要是为了保证其中的节点对应的事务是按照主数据库中事务读出的顺序,具体的输入队列的节点是事务、事务的指针对本发明实质不会产生影响。
[0105]源队列中的节点是根据输入队列中的顺序生成的事务队列节点,各事务队列节点包括事务的各个属性参数及本发明特有的事务的虚拟记录锁计数器。
[0106]每个主键事务队列对应一个特定的主键,其中存放的节点是该主键对应的、根据输入队列或源队列(即能保证事务时序)中的事务时序存放的事务指针或事务队列节点的指针,其主要用于对事务的虚拟记录锁进行计数以及事务获得虚拟记录锁的时序进行控制。
[0107]写队列和待释放队列中的节点是事务的指针或事务队列节点的指针,主要用于指示写线程对哪个事务进行写入操作或完成了写入操作。
[0108]综上可以看出,事务的指针或事务队列节点的指针均具有标识事务的作用,可统称事务标识。从主数据库输出的事务仅需要缓存一次,待写队列中事务标识对应的事务写入备数据库后,删除待释放队列中事务标识对应的事务即可。
[0109]采用事务的标识可减少缓存资源的占用,提高处理效率。
[0110]为实现上述方法,本发明还提供了一种主备数据库同步的装置,如图6所示,该装置包括:
[0111]派发单元,用于依次将从主数据库读取的各个事务或各个事务的标识派发至写队列;
[0112]派发单元根据写队列最短原则或事务哈希值为当前事务选择写队列。
[0113]所述事务哈希值是将各个事务的第一个主键转换成字符串,再通过哈希计算得到的。
[0114]写入单元,用于采用多个写线程并行将各写线程对应的写队列中的事务或标识对应的事务写入备数据库;
[0115]若干个写队列,用于存放派发单元派发的事务或事务的标识,一个写队列对应一个写线程。
[0116]如图7所示,与图6不同的是,所述装置还包括:
[0117]预处理单元,用于依次提取各个事务的主键,为各个事务创建主键列表;还用于根据各个事务的主键列表,依次将各个事务的指针放入该事务各个主键对应的主键事务队列中,事务的指针处于队首的事务即获得该主键对应的虚拟记录锁;
[0118]若干个主键事务队列,用于存储各个事务的标识;
[0119]所述派发单元或写入单元,当事务获得的虚拟记录锁总数等于该事务的主键列表中主键的总数时,派发事务或写入事务。
[0120]优选地,所述预处理单元去除重复的主键后创建事务的主键列表。
[0121]优选地,所述派发单元,还用于删除各个主键事务队列队首的已经写入备数据库的事务的事务标识,将虚拟记录锁传递给该队列的下一个节点。
[0122]优选地,所述派发单元由派发线程实现,预处理单元还用于为各个事务创建虚拟记录锁计数器,该事务每获得一个虚拟记录锁,该虚拟记录锁计数器加1,所述派发单元或写入单元根据所述虚拟记录锁计数器判断当前事件的虚拟记录锁总数等于该事务的主键列表中主键的总数。
[0123]本申请技术方案具有以下优点:
[0124]同步的最小单位是事务;写入备数据库时,可以确保事务不被打散,即主数据库是一个事务写入的记录,从库中也会在一个事务中写入,在同步过程中确保了事务的原子性;
[0125]采用多个写线程同时并行执行写入操作,减少了时延,可及时实现主备数据库同步,提高了同步效率,增加了集群的可用性;
[0126]通过虚拟记录锁,使得不同事务间可以并行写入备数据库而又可以确保时序和不产生死锁;
[0127]在同一个派发线程(Dispatcher Thread)中处理虚拟记录锁的回收、分配,避免了多线程争用记录锁,提升了性能,降低了程序复杂度;
[0128]可以先派发事务到写队列,让写线程去校验是否获得所有记录锁;也可以获得所有记录锁后再派发事务入写队列,而后直接写入备数据库;事务写到备数据库后,都要放回到待释放队列;
[0129]采用本申请,可以对数据库同步,进行并行同步,提高数据写入速度超过500%的同时、控制最大延时在I秒以内,即提高了吞吐量,减少了时延,并且还能确保同步的过程中事务不被打散,具有事务强一致性的优点。
【权利要求】
1.一种主备数据库同步的方法,用于主数据库和备数据库间的数据同步,其特征在于,该方法包括: 事务派发步骤,将从主数据库读取的各个事务或各个事务的标识派发至写队列; 事务写入步骤,采用多个写线程并行将各写线程对应的写队列中的事务或标识对应的事务写入备数据库。
2.如权利要求1所述的方法,其特征在于:所述派发步骤前,该方法还包括: 预处理步骤,依次提取各个事务的主键,为各个事务创建主键列表,根据各个事务的主键列表,依次将各个事务的标识放入各个事务的主键对应的主键事务队列中,处于主键事务队列的队首的事务获得该主键对应的虚拟记录锁; 派发事务或写入事务的前提为该事务的虚拟记录锁总数等于该事务的主键列表中主键的总数。
3.如权利要求2所述的方法,其特征在于:所述预处理步骤中,去除重复的主键后创建所述主键列表。
4.如权利要求2所述的方法,其特征在于,所述派发步骤还包括:对于已经写入备数据库的事务,删除位于主键事务队列队首的该事务的事务标识,将虚拟记录锁传递给该主键事务队列的下一个节点。
5.如权利要求4所述的方法,其特征在于:所述事务派发步骤由派发线程执行,预处理步骤中,为各个事务创建虚拟记录锁计数器,该事务每获得一个虚拟记录锁,该虚拟记录锁计数器加1,所述派发线程或 写线程根据所述虚拟记录锁计数器判断当前事务的虚拟记录锁总数等于该事务的主键列表中主键的总数。
6.如权利要求1所述的方法,其特征在于:事务派发步骤中,根据写队列最短原则或事务哈希值为当前事务选择写队列。
7.如权利要求6所述的方法,其特征在于:所述事务的哈希值是将各个事务的第一个主键转换成字符串,再通过哈希计算得到的。
8.如权利要求1所述的方法,其特征在于:事务写入步骤之后,该方法还包括删除步骤,删除已写入备数据库的事务对象。
9.一种主备数据库同步的装置,其特征在于,该装置包括: 派发单元,用于依次将从主数据库读取的各个事务或各个事务的标识派发至写队列; 写入单元,用于采用多个写线程并行将各写线程对应的写队列中的事务或标识对应的事务写入备数据库; 若干个写队列,用于存放派发单元派发的事务或事务的标识,一个写队列对应一个写线程。
10.如权利要求9所述的装置,其特征在于:所述装置还包括: 预处理单元,用于依次提取各个事务的主键,为各个事务创建主键列表;还用于根据各个事务的主键列表,依次将各个事务的指针放入该事务各个主键对应的主键事务队列中,事务的指针处于队首的事务即获得该主键对应的虚拟记录锁; 若干个主键事务队列,用于存储各个事务的标识; 所述派发单元或写入单元,当 事务获得的虚拟记录锁总数等于该事务的主键列表中主键的总数时,派发事务或写入事务。
11.如权利要求10所述的装置,其特征在于,所述派发单元,还用于删除已经写入备数据库的事务对应的主键事务队列队首的事务标识,将虚拟记录锁传递给该队列的下一个节点。
12.如权利要求10所述的装置,其特征在于:所述派发单元由派发线程实现,预处理单元还用于为各个事务创建虚拟记录锁计数器,该事务每获得一个虚拟记录锁,该虚拟记录锁计数器加1,所述派发单元或写入单元根据所述虚拟记录锁计数器判断当前事件的虚拟记录锁总数等于该事务的主键列表中主键的总数。
13.如权利要求9所述的装置,其特征在于:派发单元根据写队列最短原则或事务哈希值为当前事务选择写队列。
14.如权利要求10所述的装置,其特征在于:所述事务哈希值是将各个事务的第一个主键转换成字 符串,再通过哈希计算得到的。
【文档编号】G06F17/30GK103885986SQ201210564590
【公开日】2014年6月25日 申请日期:2012年12月21日 优先权日:2012年12月21日
【发明者】叶晖俊 申请人:阿里巴巴集团控股有限公司