发明的详细描述
定义
以下术语贯穿整个描述使用,这里提供了其定义来帮助理解本发明的不同方面。
源复制品:变化发源的数据组。
目标复制品:变化传播到的数据组。
局部复制品:从源发行至目标,包含源复制品的数据的子集的数据组。
分区:数据的子集,所有接收同一数据子集的复制品被认为是处于同一分区中并分配相同的分区标识符。
分区重对齐:导致目标复制品中行的分区成员资格变化的更改。例如,如果一个分区复制品中的行的成员资格预言为使用WHERE子句,则任何更新一列至不同值的行更改将构成分区重对齐。例如,如果在表Customers上使用过滤器“where state=‘WA’”,则一行中列“state”的值的变化将导致该行的分区重对齐。
之前值:恰好在更新操作之前的值。
之后值:恰好在更新操作之后的值。
行过滤器:允许表中行的一个子集从源发行至目标的过滤器。行过滤器使用查询的WHERE子句并且限制包含在基于特定标准的分区中的行。
联合过滤器:当一个表的过滤器是基于发行中的另一个表时,个允许跨表关系可以在复制过滤器的定义中使用的过滤器。联合过滤器定义了同步会话中将要强迫执行的两表之间的一种关系;它类似于在两表之间指定一种联接。联合过滤器命名了两个表,并指定了联接条件来代表两表之间的关系。联接条件通常的形式为TABLE1.COLUMN1=TABLE2.COLUMN2。
动态过滤器:使用了函数来从目标复制品中检取值,然后根据该值来过滤数据的行过滤器。该过滤器被定义一次,但是具有资格的合成集对每一目标复制品来说可以不同,并允许目标复制品仅接收为其需求而定制的数据的子集。
同步:将从源到目标复制品的数据集收敛成最终收敛状态的进程。
同步标记:确定两个复制品的不同步程度的实体。通常模拟为描述最后两个复制品同步的时间的“逻辑时钟实体”。
冲突检测:同步中出现的进程,查询源复制品和目标复制品的元数据来确定更改是否冲突。
冲突分解:同步中出现的进程,一旦出现冲突能确定该冲突中的优胜者和失败者。
现在参考附图来描述本发明,整个附图中使用相同的数字标识相同的元件。在以下描述中,为了解释,提出大量的特定细节来提供对本发明的彻底理解。然而,可能很明显,本发明可以不使用这些特定细节来实践。在其它实例中,以结构图的形式展示了众所周知的结构和装置以便于描述本发明。
如在本应用中使用的,术语“组件”和“系统”参考计算机相关实体,在执行中可以是硬件、硬件和软件的组合、软件或执行中的软件。例如,组件可以是,但不限于,运行在处理器上的进程、处理器、对象、可执行、执行线程、程序和/或计算机。作为说明,运行在服务器上的应用程序和该服务器都可以是组件。一个或多个组件可以驻留在进程和/或执行线程中,并且组件可以在一个计算机上本地化和/或在两个或更多计算机之间分布。
现在参考图1,说明了本发明的系统结构图。以下讨论从系统操作中源和多重目标先前已同步的点开始。每一目标分别对其各自的数据库作了改变,现在重新与源建立通信来请求数据库同步。
服务器(或源)100从N个客户(或目标)接收同步请求。源100包括中央处理单元(CPU)102用来处理同步请求并控制所有的源系统操作。CPU 102与源(或主)数据库104相接口,来储存多个目标使用的数据库入口。这样,源数据库104,也称为源复制品,实质上包含了潜在需要发行至N个目标的信息。
在从N个目标接收到多重同步请求后,源100选择第一目标106来同步。第一目标106包括储存所有与目标106相关的数据库入口的第一目标数据库108,包括在最后一次同步之后最近的变化。因此,在第一目标数据库108上储存了与源100的主数据库104的数据不同的数据。
在选择第一目标106之后,源100确定在先前与目标数据库108的同步会话之后完成的数据库更新集,以查明源数据库104和目标数据库108之间的数据差异(或变化)。源100包括分区计算算法110,该算法生成变化数据的分区,分区仅定义与第一目标106相关的变化。该分区作为成员资格元数据保持在源100上,并指示在先前同步进程之后变化的目标数据库108的那些行入口。成员资格元数据114储存在源100上,用于与随后的剩余的目标2...N的同步会话一起使用。
在第一目标通过第一复制品数据112与源100同步之后,第一目标106的同步完成。
现在需要通过合并复制将第一目标106的更新数据库信息传播至一些或所有等候同步的目标2...N。根据本发明的一个方面,随后的目标同步不需要执行所有在第一目标106的同步中执行的计算操作,而是受益于第一同步保持的成员资格元数据114。因此,使用成员资格元数据114来生成复制品用于下载至目标2...N。这使源100相比常规结构大量地节省了处理时间,因为常规结构需要为所有随后的同步重新计算分区成员资格。更重要地,由于分区计算在实际更新时执行而不是在同步时执行,其昂贵的成本将摊销到大量同步会话中。这一技术在大量同步会话相对源复制品并发运行的重负载下仍能伸缩良好。
在操作中,源100选择具有第二目标数据库118的第二目标116来同步。源100获取与第二目标116相关联的过滤标准,并根据第二目标116的分区成员资格精确地确定哪一变化与向第二目标116的传播相关。
同步进程继续剩余的N个目标,使得源100使用成员资格元数据来与具有第N个数据库124的第N个目标122同步。获取、分析第N个目标122的过滤标准,并且如果需要的话,将其应用到成员资格元数据114中来生成变化集126用于下载至第N个目标122。如果确定保持在给定复制品上的同步元数据安全用于清除(如,根据基于保留的政策,即,不允许在一段给定持续时间内未同步的复制品进行随后的同步),相应的分区成员资格元数据也确定为安全用于清除。
注意,虽然本描述是在客户/服务器的环境的情况下提供的,但本发明可应用于对任意需要同步的同质数据收集。同样,本发明可应用在点对点计算环境中。例如,当有至少两个需要与源数据收集同步的目标数据收集时,数据收集可以根据这里描述的新方面来同步。
现在参考图2,说明了本发明的复制进程的流程图。为简化解释的目的,虽然可把方法示为或描述为一系列行动,但可以认为并理解成本发明不受行动顺序的限制,因为根据本发明,有些行动可能与这里示出并描述的其它行动不同顺序和/或并发出现。例如,本领域的技术人员可以认为并理解成方法可以作为选择作用一系列相互相关的状态或事件来表示,如在状态图表中。而且,可以不需要所有示出的行动来实现符合本发明的方法。
在200,多个目标1...N请求与源同步。在202,源选择第一目标来同步。可以用多种方法来确定选择进程,包括但不限于,首先请求同步的目标,以及使用请求同步的目标的优先级方案。一旦选择了第一目标,源确定第一目标数据库中的变化行集来建立其当前状态,如204所示。在206,源使用用于检查的分区计算算法确定源数据库和第一目标数据库之间的差异,来确定哪一变化将要传播至剩下的目标2...N中所选择的目标。在208,分区计算算法以一个或多个元数据表的形式创建第一成员资格元数据,并在源上储存成员资格元数据。在210,第一分区复制品下载至第一目标用于更新。一旦完成更新,第一目标的同步完成。
在212,源选择下一用于同步的目标。在214,源获取下一目标的过滤器标准来确定同步是否恰恰被请求用于第一目标的该特定数据集的下一目标。如果是的话,在216,源同时使用过滤器标准和第一成员资格元数据来创建第二分区复制品用于下一目标(或第二目标)。在218,下载第二分区复制品,并且在220,执行分区更新来完成下一目标的同步进程的这一部分。进程循环回212的输入来选择下一目标来同步。
进程继续直至所有请求同步的目标接收第一目标的变化信息,在这之后,同步跨所有其它目标继续第二目标的改变的数据,依此类推,直到目标N。
现在参考图3,说明了用于计算目标的成员资格元数据的计算组件使用的元数据表300的相互关系。主要使用了六个表来捕捉目标数据库中的变化信息。分区元数据表302(表示为PartitionsMetadata)通过三个其它表来映射:当前变化元数据表306(表示为CurrentChangesPartitionMapping)、过去变化元数据表306(表示为PastChangesPartitionMapping)、以及生成分区元数据表308(表示为GenerationPartitionMapping)。GenerationPartitionMapping表308映射至生成元数据表310(表示为GenerationMetadata),表310也通过行元数据表312(表示为RowMetadata)映射。应该理解成可以根据特定的实现来使用任何合适数量的表和/或元数据。
使用的用于计算复制品上行的分区成员资格的三个元数据包括:相异分区(使用PartitionsMetadata表302),标识目标复制品的分区;行的当前分区成员资格(使用CurrentChangesPartitionMapping表304) 以及,行的过去分区成员资格(使用PastChangesPartitionMapping表306)。当前和过去成员资格信息允许分区更新向其它目标复制品的更有效传播。优选保持行先前所属的分区的相关知识,因为这允许“删除”的传播。删除是在目标复制品中不再需要的数据(或行)。
PartitionsMetadata表302持续跟踪过滤器函数的有意思的估算。如果目标复制品与源复制品同步,并且相标识目标复制品的相异分区当前不在分区表302中,则创建具有“分区值”的新入口,并分配新partition_id参数。当第一次选择新目标时,每一入口在PartitionsMetadata表302中采用各自的分区值登记,并被分配一个新partition_id。
如果动态过滤器对Employee(雇员)的表达式是“当TerritoryID=fn_EmployeeTerritory()时”,则fn_EmployeeTerritory列添加至PartitionsMetadata表302中。当对Employee行作出变化,使用单个基于集查询来计算变化行所属的所有分区,该查询使用过滤器表达式作为联接子句将Employee与PartitionsMetadata表302相连接,将fn_EmployeeTerritory()替换为PartitionsMetadata.fn_EmployeeTerritory。
只要每一变化行仅属于所有partition_id的一个小子集,或者最好的情况,属于恰好一个partition_id的良好分区数据的一个小子集,即使有大量登记的partition_id,该基于集的查询的性能也可以伸缩良好。
CurrentChangesPartitionMapping表304跟踪给定的行的向其相关分区的当前映射。因此,表304包括该表中的partition_id列,该列为从PartitionsMetadata表302派生的一个值。CurrentChangesPartitionMapping表304的row_id列包含复制所使用的给定行的唯一标识符。
PastChangesPartitionMapping表306跟踪给定行向其可能属于的任意分区的任意过去映射。因此,表306包括partition_id列,该列是从分区表302派生的一个值。表306的row_id列包含了复制使用的给定行的唯一标识符。同步标记列(synch_anchor列)逻辑上包含行的分区映射何时变化的信息。在分区更新时捕捉同步标记允许同步进程将分区更新从源100仅传播至从源和目标最后一次同步之后尚未接收到这些变化的目标。在样本数据中,为简化,sync_anchor列将使用UTC时间(订正世界时坐标)形式的值或者格林威治平均时间值。
生成分区表308包括generation_id列,该列是分配给一组变化的同步标记。当变化从目标传播至源100时,在源100给变化分配新generation_id。由于作为该生成的一部分的行属于一个相异分区P1,GenerationPartitionMapping表308包括partition_id列,用于映射到目标的partition_id P1。然而,注意,通常来说,生成可以映射到多于一个分区标识符。这与partition_id为特定值“-1”的生成不同。当属于另一相异分区P2的不同目标复制品与源100同步时,生成映射消除P1生成。partition_id的特殊的-1值表明生成是全局的,因此与所有分区相关。
生成表310包括generation_id用于为每一生成分配唯一的生成ID。生成分区表308包括generation_id,映射该表310,并追踪哪一生成已传播至当前复制品,哪一生成代表本地变化。它允许同步进程派生需要为给定会话考虑的相关生成的列表。
RowMetadata表312在一行接一行的基础上跟踪复制元数据,并且包含关于行何时通过使用逻辑时钟来代表时间而发生变化的信息。表312也包含了哪一复制品贡献给该行的这一版本的信息,以及列的当前版本的信息。生成分区表308和RowMetadata表312都映射到生成表310。
以下是表1,总结了不同的元数据表及其相应功能。
表1元数据表及总结
元数据表名称 |
目的 |
RowMetadata |
在一行接一行的基础上跟踪复制元数据,并包含关于行何时发生变化(采用逻辑时钟来代表时间)的信息以及行和列版本矢量。 |
GenerationMetadata |
跟踪哪一生成已传播至当前复制品,哪一生成代表本地变化;允许同步进程派生需要为已知会话所考虑的相关生成的列表 |
PartitionsMetadata |
包含代表目标复制品的每一分区值的相异入口 |
GenerationPartitionMapping |
包含GenerationMetadata表中的哪一生成与哪一分区相关的映射信息 |
CurrentChangesPartitionMapping |
包含哪一变化当前与哪一分区相关的元数据 |
PastChangesPartitionMapping |
包含哪一变化先前与哪一分区相关的元数据 |
用于变化的有效传播的生成分区
本发明的一个新方面也便于在变化传播中所使用的最优化。合并复制当前使用“生成”的概念来逻辑上将从源传播至目标复制品的变化分组。GenerationMetadata表310跟踪哪一生成已传播到当前复制品,哪一生成代表本地变化。生成分区也允许同步进程派生需要为给定会话考虑的相关生成的列表。
当在源复制品上发生变化时,源为表上的集变化分配一个生成值,该生成值是一个逻辑时钟实体。如果从可能被中断的先前同步会话,或者通过具有不同源复制品的同步会话接收到变化组,分组概念允许目标复制品能够有效地标识。本质上,当前不在目标复制品中的生成值的列表反映了与从源向目标的传播需要考虑的相关的变化。如果目标复制品从源复制品接收数据的一个子集,如,目标复制品,则满足复制品的分区标准的变化是传播至目标的唯一变化。
然而,合并复制的当前版本仍需要将源复制品上的现有的所有生成的信息传播到目标复制品,而不管这些生成包含的变化是否与目标复制品相关。这是由于没有元数据跟踪作为源复制品处生成的一部分的变化是否与有意义的分区相关。
标识行的分区成员资格的分区组允许从源向目标复制品的生成传播的效率。由于变化集已映射到分区标识符,作为行的分组的生成也可以映射到分区标识符。因此,当目标复制品对在源复制品上可用的特定分区感兴趣时,包含与目标复制品不相关的分区中的变化的生成值能够快速地在计算相关变化集中消除。除提供计算效率之外,该算法也具有更好的网络性能特征,因为只有与目标分区相关的生成在网络上传播。
现在参考图4,说明了使用过滤和扩充的样本更新模式。该示例的前提是重定位的雇员。更新进程包括将重定位的雇员的用户数据重新分配给另一雇员。在该示例中,客户信息至少包括用户信息、用户订单信息以及用户订单细节。分区表是Employees分区表400,采用EmployeeID参数唯一地标识了重定位的雇员。在该示例中,表400至少包括三列:FirstName列、LastName列以及TerritoryID列。如果Employees分区的动态联合过滤器表达式为“当TerritoryID=fn_EmployeeTerritory()时”,则fn_EmployeeTerritory列被添加到雇员分区元数据表400。
当新分区第一次达到同步时,新分区使用其各自的分区值在表400中注册入口,并被分配一个新partition_id。当对Employees表400的行的值作出变化,使用单个基于集的查询来计算变化行所属的所有分区,该查询使用过滤器表达式作为联接子句来将雇员和雇员分区元数据表400相联接。然后,函数调用fn_EmployeeTerritory()由PartitionsMetadata.fn_EmployeeTerritory替换。
例如,如果Employees分区表400中的TerritoryID列被估算为美国的51个不同地理区域,Employees分区表400将为这些51个不同值的每一个分配一个唯一的分区身份。如果目标与源100同步,并且标识目标复制品的相异分区不在Employees表400中,则使用相异的“分区值”创建一个新入口并被分配一个新partition_id。
下表(表2)是Employees PartitionsMetadata表400的一个样本,没有雇员的姓和名的列。最后一列提供了样本数据的解释,但不是该模式所必须的部分。
表2样本PartitionsMetadata表
Partition_id |
fn_EmployeeTerritory |
表的解释(非本模式的部分) |
1 |
“WA” |
PartitionID=1与华盛顿地域相应 |
2 |
“CA” |
PartitionID=2与加利福尼亚地域相应 |
3 |
“OR” |
PartitionID=3与俄勒冈地域相应 |
...... |
...... |
...... |
只有每一变化行仅属于所有partition_id的一个小子集,或者最好的情况,属于恰好一个partition_id的良好分区的数据的一个小子集,即使有大量注册的partition_id,该基于集的查询的性能仍能够伸缩良好。
如上所述,所有客户信息都需要和雇员一起传播。采用联合过滤器,通过定义将在同步进程中使用的跨表关系来方便这一进程。在样本模式中,Employees表400中行的分区成员资格采用Employees表400上的“行过滤器”定义来预测。Customers表404中行的分区成员资格基于Employees表400中采用Employees和Customers之间的联合过滤器定义402预测的行的成员资格。Orders表408中行的成员资格基于Customers表404中采用Customers和Orders之间的联合过滤器定义预言的行的成员资格。同样,Order Details表412中行的成员资格基于Orders表408中采用Orders和OrderDetails之间的联合过滤器定义预言的行的成员资格。
因此,第一联合过滤器402定义了Employees表400和Customers表404之间的跨表关系(Customers.EmployeeID=Employees.EmployeeID)。Customers表404与唯一标识用户的CustomerID相关联,并至少包括映射到Employees表400的EmployeeID列,以及其它与用户帐号信息,如姓名、地址、邮政编码以及联系电话和信息相关的列。第二联合过滤器406定义了Customers表404和Orders表408之间的表关系(Orders.CustomerID=Customers.CustomerID)。Orders表408与唯一标识Customers表404的订单信息的OrderID相关联,并至少包括映射到Customers表404的CustomerID列。表408包括其它与用户订单,如运送信息、税率以及货运收费相关的信息列。
第三联合过滤器410定义了Orders表408和Order Details表412之间的表关系(OrderDetails.OrderID=Orders.OrderID)。Order Details表412与唯一标识Orders表408的订单细节信息的OrderDetailID相关联,并至少包括映射到Orders表408的OrderID列。表412包括将Order Details表412映射到产品表416的ProductID列。表412也包括提供所定购的产品的信息的Quantity列和UnitPrice列。因此,OrderDetails表412需要来自Products表416的UnitPrice信息。
第四联合过滤器416定义了Order Details表412和Products表416之间的表关系(OrderDetails.ProductID=Products.ProductID)。Products表416与唯一的ProductID相关联,并进一步包括ProductName和UnitPrice列。
因此,扩充算法与联合过滤器一起便于所有与客户购买的产品、购买产品的订单细节、包括细节和特定产品的订单以及定购产品的用户相关的信息连同EmployeeID一起的传播。
使用以下在图5中描述的样本数据,在Customers表404上的分区更新导致Customers行的过去和当前映射被重新计算。然后,根据Customers表404和Orders表408之间的联合过滤器406,父分区成员资格已变化的所有Orders行将被重新估算各自的过去和当前分区映射。根据Orders表408和OrderDetails表412之间的联合过滤器410,父分区成员资格已变化的所有Order Details行都被重新估算各自的过去和当前分区映射。最后,根据Order Details表412和Products表416之间的联合过滤器414,父分区成员资格已变化的所有Products行都被重新估算各自的过去和当前分区映射。然后,该算法终止,因为Products表416没有任何子行。当扩充算法终止,元数据表精确地反映了行的分区成员资格。在行从源复制品传播到目标复制品之前不需要进一步的分区计算。
为反映这一算法,为子表生成的数据库景象参考为其直接父表生成的景象。在样本模式中,Customers景象参考Employees景象。同样,Orders景象参考Customers景象。同样,Order Details景象参考Orders景象。顶层父景象,在本示例中为Employees表400,使用PartitionsMetadata表302来估算行的分区成员资格,进一步使用样本中过滤列(TerritoryID)的值。
为说明目的,为样本模式使用以下景象定义。
Employees表的景象定义(view_partition_Employees)
从Employees,PartitionsMetadata中,在PartitionsMetadata.fn EmployeeTerritory=Employees.TerritoryID时,选择[Employees].*,partition_id=PartitionsMetadata].[partition_id]。
Customers表的景象定义(view_partition_Customers)从Customers.[view_partition_Employees]Employees中,在Customers.EmployeeID=Employees.EmployeeID时,选择[Customers].*,partition_id=[Employees].[partition_id]。
Orders表的景象定义(view_partition_Orders)
从[Orders],[view_partition_Customers][Customers]中,在(Orders.CustomerID=Customers.CustomerID)时,选择[Orders].*,partition_id=[Customers].partition_id。
Order_Details表的景象定义(view_partition_OrderDetails)
从[OrderDetails],[view_partition_Orders][Orders]中,在(Order_Details.OrderID=Orders.OrderID)时,选择[Order_Details].*,partition_id=[Orders].partition_id。
子行的分区成员资格由通过变化行集的景象选择变化行集来确定。所有从“之前”值计算所得的过去分区映射保持在PastChangesPartitonMapping表306中,所有当前分区映射保持在CurrentChangesPartitionMapping表304中。
下表(表3)是CurrentChangesPartitionMapping表304的样本,反映了作为同步更新的一部分的变化,雇员Joe从CA地域迁移到WA地域。最后一列仅作解释作用,并非本模式所必须的部分。
表3 CurrentChangesPartitionMapping表的样本
row_id |
partition_id |
表的解释(不是模式的部分) |
R1 |
1 |
R1行与Territory=“WA”的雇员“Joe”相对应 |
R2 |
2 |
R2行与Territory=“CA”的雇员“Mary”相对应 |
R3 |
3 |
R3行与Territory=“OR”的雇员“Jane”相对应 |
...... |
...... |
...... |
以下是表4,为PastChangesPartitionMapping表306的样本,表示Joe先前分配给CA地域。最后一行提供了样本数据的解释,但并非本模式的必须部分。
表4 PastChangesPartitionMapping表的样本
Row_id |
Partition_id |
同步标记 |
表的解释(不是模式的部分) |
R1 |
2 |
星期二,2002年10月8日,上午10:27 |
行R1与地域曾经是“CA”直到星期二,2002年10月8日,上午10:27为止的雇员“Joe”相对应 |
R2 |
3 |
星期一,2002年10月7日,上午12:25 |
行R2与地域曾经是“OR”直到星期一,2002年10月7日,上午12:25的雇员“Mary”相对应 |
...... |
...... |
...... |
...... |
现在参考图5,说明了用户数据从一个雇员重新分配到另一个雇员的示例分区更新。对“Joe”的EmployeeID的现有例示的表关系如下。Employee1表500描述了Employee1行,该行具有表示“Joe”的EmployeeID列,以及具有将Employee1表500连接回Employees PartitionsMetadata表400的“WA”的入口的TerritoryID列。Customer1表502,作为Employee1表500的子表,描述了Customer1行,该行具有“Alfred”的CustomerID列入口,以及将Customer1表502连接回Employee1表500的EmployeeID入口“Joe”。
Customer1表502有三个子实体:第一Order_1实体504、第二Order_2实体506以及第三Order_3实体508。Order_1实体504描述了Order_1行,该行含有具有“1”入口的OrderID列,以及具有将实体504连接回父Customer1表502的“Alfred”入口的CustomerID列。Order_2实体506描述了Order_2行,该行含有具有“2”入口的OrderID列,以及具有将实体506连接回父Customer1表502的“Alfred”入口的CustomerID列。Order_3实体508描述了Order_3行,该行含有具有入口“3”的OrderID列,以及具有将表508连接回父Customer1表502的“Alfred”入口的CustomerID列。
第一Order_1实体有四个子OrderDetail实体,定义了特定OrderID=1的订单细节。OrderDetail1实体510描述了OrderDetail1行,该行含有具有将实体510连接回父实体504的“1”入口的OrderID列,以及其它未示出的列细节。OrderDetail2实体512描述了OrderDetail2行,该行含有具有将实体512连接回父实体504的入口“1”的OrderID列,以及其它未示出的列细节。OrderDetail3实体514描述了OrderDetail3行,该行含有具有将实体514连接回父实体504的“1”入口的OrderID列,以及其它未示出的列细节。OrderDetail4实体516描述了OrderDetail4行,该行含有具有将实体516连接回父实体504的“1”入口的OrderID列,以及其它未示出的列细节。
Order_2实体506有一个子实体,OrderDetail5实体518,描述了OrderDetail5行,该行含有具有将实体518连接回父实体506的“2”入口的OrderID列,以及其它未示出的列细节。
Order_3实体508有两个子实体,OrderDetail6实体520和OrderDetail7实体522。OrderDetail6实体520描述了OrderDetail6行,该行含有具有将实体520连接回父实体508的“3”入口的OrderID列,以及其它未示出的列细节。OrderDetail7实体522描述了OrderDetail7行,该行含有具有将实体522连接回父实体508的“3”入口的OrderID列,以及其它未示出的列细节。
Customer1表502中Customer1行的EmployeeID列将从“Joe”更新为“Mary”。Employee2表524描述了Employee2行,该行含有具有“Mary”入口的列,以及具有“CA”入口的TerritoryID列。该更新本质上将Customer 1行分区成员资格从“Joe”变为“Mary”。因此,Order行、Order_1、Order_2和Order_3的分区成员资格也从“Joe”变为“Mary”。同样,OrderDetails实体510、512、514、516、518、520和522中相应的OrderDetails行现在也属于不同的分区,即,“Mary”。为将行的分区成员资格从父实体传播到子实体,执行扩充进程。
复制进程——变化跟踪和变化枚举
受影响的复制进程的两个主要阶段牵涉变化跟踪和变化枚举。当在用户数据库中出现数据变化时,用户数据库中的变化跟踪机制跟踪复制元数据,该元数据随后允许这些变化在后面的一个时间点上与其它复制品同步。变化枚举是同步进程的一个阶段,它枚举了从源和目标之间的先前同步以来该复制品中出现的变化。
复制进程的变化调和和变化应用阶段在任何重要的方式中都不受影响。
现在描述当行被插入、更新或删除时关于对复制元数据的修改的变化跟踪机制。当行被插入时,估算该行的当前分区成员资格并将该信息保持在CurrentChangesPartitionMapping表304中。在已知行的子行已存在的极少情况下,新行的插入会造成子行的分区成员资格使用扩充进程也被估算。
当使用非过滤器列更新来更新行时,如果在元数据表中没有该给定行的元数据,则估算该行的当前分区成员资格,并且将该信息保持在CurrentChangesPartitionMapping表304中。如果元数据已存在,则不估算分区成员资格,因为那表示分区成员资格之前已估算过。
当使用过滤的列更新来更新行时,在更新之前使用变化跟踪中可用的“之前”值估算该行过去所属的分区。由于子行的分区成员资格受父行的分区成员资格影响,使用扩充进程来为子行估算过去分区映射。所有的过去分区映射储存在PastChangesPartitionMapping表306中。另外,分区更新出现的逻辑时间记录进过去变化表306中的同步标记列。这允许同步进程抑止分区更新传播至在之前同步会话中或者通过与不同源复制品同步已看见该变化的复制品。注意,估算过去分区映射本质上清除了CurrentChangesPartitionMapping表304中的任何入口,因为这些入口由于分区更新已变为无效。
当通过过滤的列更新来更新行时,在更新之后使用变化跟踪中可用的“之后”值估算该行当前所属的分区。由于子行的分区成员资格受父行的分区成员资格影响,使用扩充进程来为子行估算当前分区映射。所有当前分区映射储存在CurrentChangesPartitionMapping表304中。
当进行删除时,使用变化跟踪中可用的“之前”值来估算删除前该行先前所属的分区。由于子行的分区成员资格受父行的分区成员资格影响,使用扩充进程来为子行估算过去分区映射。所有过去分区映射储存在PastChangesPartitionMapping表306中。另外,分区更新出现的逻辑时间记录进表306的同步标记列中。这避免了同步进程冗余地将分区更新传播到之前同步会话中已看见该变化的复制品。由于在删除之后分区中不存在该行及其子行,因此不需要在CurrentChangesPartitionMapping表304中创建任何入口。注意,估算过去分区映射本质上清除了CurrentChangesPartitionMapping表304中的任何入口,因为这些入口由于行删除进程已变为无效。
分区更新需要变化跟踪机制来更新元数据,使得该更新以有效的方式传播到目标复制品。关键方面是当行的分区成员资格改变时,行的partition_id必须被更新,并且任何分区成员资格因父行的更新而改变的子行必须重新估算其partition_id。使用扩充进程来捕捉该信息,该扩充进程在这里提供的示例中被使用。
变化枚举机制使用分区成员资格元数据来有效地将变化从源复制品传播到目标复制品。由于变化跟踪机制已估算了分区并执行了扩充,很大程度上简化了运行时刻的变化枚举的复杂性。
删除和分区更新造成具有“过去分区映射入口”的变化集。通过从PastChangesPartitionMapping表306中选择其同步标记比与会话协商的同步标记更新近,并且partition_id与目标复制品的partition_id相匹配的行来枚举这些变化集。这些行随后将作为删除传播到目标复制品。
分区和非分区的插入和更新造成具有“当前分区映射入口”的变化集。通过从RowMetadata表312中选择其同步标记比与会话协商同步标记更新近,并且在CurrentChangesPartitionMapping表304中具有partition_id与目标复制品partition_id相匹配的入口的行来枚举这些变化集。这些行作为更新传播至目标复制品。
一旦枚举了已知分区的变化,然后通过使用现有技术的冲突检测和分解机制来传播这些变化。同样,一旦枚举了已知分区的变化,并且冲突被检测并分解,然后通过使用现有技术的变化应用机制传播这些变化。
生成分区
如在源复制品上维护的行映射到分区允许对将要在源和目标复制品之间传播的相关生成的列表的有效计算。例如,GenerationPartitionMapping表308包含generation_id列,该列是分配给一组生成的同步标记。当变化从目标复制品传播到源复制品时,在源复制品上对变化分配新的generation_id。由于作为该生成的一部分的行属于相异分区P1,该生成映射到目标的partition_idP1。当属于另一相异分区P2的不同目标复制品与源复制品同步时,生成映射消除P1生成。partition_id的一个特殊值-1表明该生成是全局的,因此与所有分区相关。
以下的表5是GenerationPartitionMapping表308的样本。最后一列提供了样本数据的解释,并非本模式需要的部分。
表5GenerationPartitionMapping表的样本
generation_id |
partition_id |
表的解释(非模式的部分) |
G1 |
1 |
生成G1与Territory=“WA”的分区相关 |
G2 |
2 |
生成G2与Territory=“CA”的分区相关 |
G3 |
-1 |
生成G3是全局生成,需要向所有分区传播 |
...... |
...... |
...... |
生成的分区是建立在本发明的分区分组方面上的最优化,并提供了三个好处:不相关变化的有效消除;即使许多目标复制品已与源复制品同步,同步会话的可预言持续时间;以及因生成传播而增强的网络性能。
在源复制品与许多目标复制品同步的拓扑中,每一目标复制品具有其相异分区,生成分区使同步进程能够有效地消除不相关变化。例如,考虑一种拓扑,其中,一个源复制品向目标复制品提供数据的相异子集,每一子集包含对一个销售人员特定的销售信息。如果假设最初,1,000个目标复制品传播10,000个变化至源复制品,然后该10,000个变化放入源复制品上的100个相异生成中,当所有1,000个目标复制品将其变化传播到源复制品时,总数为1,000×10,000,或者说10,000,000个变化放入源复制品的100,000个生成中。结果,GenerationPartitionMapping表308将有100个生成集的100,000个入口,每一入口都映射到单个分区。
当相异partition_id=P1001的第一目标复制品与源复制品同步时,由于所有生成映射到与分区P1-P1000相对应的分区,所有100,000个生成(因此有10,000,000个变化)将与partition_id=P1001的第一目标复制品不相关。另一方面,如果partition_id=P500的第二目标复制品与源复制品同步,同步将有效地枚举恰好100个与第二目标复制品(partition_id=P500)相关的生成,并且因此传播恰好100,000个变化至第二目标复制品。
生成分区最优化的另一优点是,由于它能够控制相对于与该分区相关的变化数的目标复制品检查的同步元数据的量,因此源复制品和目标复制品之间的同步会话的持续时间是可预测的。作为示例,假设partition_id=P500的目标复制品很长时间未与源复制品同步。在现有的合并复制的版本中,当该目标复制品最终与源复制品同步时,将对其进行处罚,因为它将必须枚举已积累在源复制品上的所有生成。也就是说,如果例如,1,000个目标复制品每个传播100个生成,该相关和不相关生成集总数为100,000个生成,这是重大的。一旦考虑100,000个生成,“每一同步会话分区计算”算法将消除不相关的变化,仅传播相关变化到目标复制品。
考虑一种生成被分区进入相关分区标识符的情况。根据本发明的方面,与目标复制品(如partition_id=P500)的同步会话将不会被处罚,因为它能够立即标识相关生成。对生成分区的网络特征的影响是重大的,因为避免了不相关生成向目标复制品的传播。继续该示例,这相当于节省了100,000万减100,或者说99,900个生成(不需要向目标复制品传播的生成)。无论何时在源复制品上做出本地变化,即使该变化仅与单个分区或分区集相关,可以更优选并更有效地将这些本地变化作为全局生成来传播。基于它的前提是源复制品的变化与实际上所有目标复制品相关,而目标复制品的变化仅与共享同一partition_id的目标复制品相关。
应理解成本发明的方面具有其它应用。例如,在可由大量客户用户访问的服务器集群中,对第一服务器的特定用户出现的分区变化能够用来确定该用户是否应该与第一服务器分离并且与第二服务器重新关联。这一“关联”进程可以根据预定标准自动执行,使得一旦跟踪到对数据库信息的特定字段作出变化,能够自动触发关联进程。
还应理解成尽管本发明是在数据库变化的环境下描述的,它并不限于此,而已应用于需要跨全异源的数据同步的任何环境。例如,本发明应用于目录服务,在该服务中,每一用户的姓名、慨貌信息、用户帐户、网络许可以及机器地址和网络上的资源得以协调。
现在参考图6,说明了可操作执行所揭示的结构的计算机的结构图。为向本发明的各种方面提供附加的环境,图6及以下讨论将提供合适计算环境600的简要综合描述,在该计算环境中可以实现本发明的各种方面。尽管上文在运行于一个或多个计算机上的计算机可执行指令的一般环境下描述本发明,但本领域的技术人员认识到,本发明也可以连同其它程序模块和/或硬件和软件的组合一起实现。通常来说,程序模块包括完成特定的任务或实现特定的抽象数据类型的例程、程序、组件、数据结构等等。而且,本领域的技术人员应理解成本发明方法可以使用其它计算机系统配置来实践,包括单处理器或多处理器计算机系统、小型机、大型机、以及个人计算机、手持式计算装置、基于多处理器或可编程消费电子产品等等,每一都可以操作上与一个或多个关联装置相耦合。本发明的例示方面也可以在分布式计算环境中实践,在该环境中,特定的任务由通过通信网络连接的远程处理装置完成。在分布式计算环境中,程序模块可以位于本地和远程内存存储装置中。
再参考图6,实现本发明的各种方面的示例性环境600包括计算机602,该计算机602包括处理单元604,系统内存606以及系统总线608。系统总线608将系统组件,包括但不限于系统内存606,耦合至处理单元604。处理单元604可以是任意各种商业上可用处理器。也可以采用双微处理器和其它多处理器结构作为处理单元604。
系统总线608可以是几种类型总线结构的任意一种,包括内存总线或内存控制器、使用各种商业可用总线结构的外围总线和本地总线。系统内存606包括只读内存(ROM)610和随机存储内存(RAM)612。基本输入/输出系统(BIOS)储存在ROM610中,包括帮助如在启动时在计算机602内元件之间传输信息的基本例程。
计算机602还包括硬盘驱动器614、磁盘驱动器616(如从可移动硬盘618读出或写入)以及光盘驱动器620,(如读CD-ROM盘622或从其它光媒介读出或写入)。硬盘驱动器614、磁盘驱动器616和光盘驱动器620可以分别通过硬盘驱动器接口624、磁盘驱动器接口626和光盘驱动器接口628连接至系统总线608。驱动器及其关联的计算机可读媒介提供数据、数据结构、计算机可读指令等等的非易失存储。对于计算机602,驱动器和媒介以合适的数据格式容纳广播编程的存储。尽管上述对计算机可读媒介的描述是硬盘、可移动磁盘和CD,本领域的技术人员应理解成,计算机可读的其它类型的媒介,如压缩驱动器、盒式磁带、闪存卡、数字视频盘、盒式磁盘等等,也可以在示例性操作环境中使用,并且更进一步,任何这类媒介可以包含计算机可读指令来执行本发明的方法。
一些程序模块,包括操作系统630、一个或多个应用程序632、其它程序模块634和程序数据636,可以存储在驱动器和RAM612中。应理解成本发明可以使用各种商业可用操作系统或操作系统的组合来实现。
用户可以通过键盘和指向设备,如鼠标640向计算机602输入命令和信息。其它输入设备(未示出)可以包括麦克风、IR远程控制、操纵杆、游戏板、圆盘式卫星电视天线、扫描仪等等。这些和其它输入设备经常通过与系统总线608耦合的串行端口接口642连接至处理单元604,也可以通过其它接口连接,如并行端口、游戏端口、通用串行总线(“USB”)、IR接口等等。监视器644和其它类型的显示设备也通过接口,如视频适配器646,连接至系统总线608。除监视器644之外,计算机通常包括其它外围输出设备(未示出),如扬声器、打印机等等。
计算机602可以在建立网络的环境中操作,该环境使用逻辑连接至一个或多个远程计算机,如远程计算机648。远程计算机648可以是工作站、服务器计算机、路由器、个人计算机、便携式计算机、基于微处理器的娱乐器具、对等装置或其它普通网络节点,并通常包括许多或所有所述与计算机602有关的元件,尽管为简要的目的,仅示出了内存存储设备650。所述的逻辑连接包括LAN 652和WAN 654。这类常见的网络环境有办公室、企业范围计算机环境、企业内部互联网和因特网。
当在LAN网络环境中使用时,计算机602通过网络接口或适配器656连接至本地网络652。当在WAN网络环境中使用时,计算机602通常包括调制解调器658,或连接至LAN上的通信服务器,或具有其它在WAN 654,如因特网上建立通信的装置。调制解调器658可以是内置的或外置的,通过串行端口接口642连接至系统总线608。在建立网络的环境中,所述与计算机602或其部分有关的程序模块可以储存在远程内存存储装置650中。应理解成这里示出的网络连接是示例性的,也可以采用在计算机之间建立通信链路的其它装置。
现在参考图7,说明了根据本发明的样本计算环境700的示意结构图。系统700包括一个或多个客户702。客户702可以是硬件和/或软件(如线程、进程、计算装置)。例如,客户702可以采用本发明来容纳小文本文件(cookie)和/或关联的前后关系信息。系统700也包括一个或多个服务器704。服务器704也可以是硬件和/或软件(如线程、进程、计算装置)。例如,服务器704可以采用本发明来容纳线程来执行变换。客户702和服务器704之间的一个可能的通信可以是数据包的形式,适合在两个或更多计算机进程间发送。例如,数据包可以包括小文本文件和/或关联的前后关系信息。系统700包括通信主机706,可以采用该主机以便于客户702和服务器704之间的通信。客户702可操作地连接到一个或多个客户数据存储708,客户数据存储可以用来存储对客户702本地的信息(如小文本文件和/或关联的前后关系信息)。同样,服务器704可操作地连接至一个或多个服务器数据存储710,服务器数据存储可以用来储存对服务器704本地的信息。
以上所描述的包括本发明的示例。当然,为描述本发明,不可能描述每一可想到的组件或方法的组合,但是本领域的技术人员认识到本发明的许多另外组合和改变都是可能的。因此,本发明旨在包含所有属于后附权利要求书的构思和范围之内的替代品、修改和变化。而且,在详细描述中或者权利要求书中使用的术语“包括”意味着该术语旨在以与术语“包含”类似的方式包括在内,如同把它作为权利要求书中的过渡词语来使用对“包含”所作的解释。