具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
在本申请实施中,异地的服务器和数据库的结构关系仍可以参考图1,在图1所示的结构关系的基础上,本申请实施例中提供一种数据同步方法,如图2所示,具体包括以下步骤:
S201:第一服务器接收写请求。
其中,第一服务器与第一数据库相匹配。
所述的第一服务器,是在线系统后台用于处理业务的服务器,可以认为,第一服务器在对业务进行处理时,用于向第一数据库写入数据,这里的写入数据包括对数据的修改、删除、增加等操作。也就是说,在本申请实施例中,第一服务器用于执行写操作。当然,在实际应用中,第一服务器可以具备对第一数据库中的数据进行查询、读取的操作,在本申请中将针对第一服务器执行写操作的场景进行说明,这并不构成对本申请的限定。
所述的第一数据库,具体是一种写数据库,也即,第一数据库可接收第一服务器写入数据。在实际应用中,第一数据库和第一服务器处于同一位置(即如图1所示)。
正如前述,第一服务器可以执行写操作,所以,第一服务器可对相应业务的写请求进行处理。本申请实施中,写请求由相应的业务发出。这里并不作具体限定。
S202:根据所述写请求,将与所述写请求对应的数据写入至所述第一数据库。
上述写请求对应的数据就是需要进行增加、删除或修改等操作的数据,那么,第一服务器在接收到写请求后,就会将相应的数据写入至与第一服务器相匹配的第一数据库中。
S203:将写入的数据作为待同步数据加载至该第一服务器的第一缓存中。
作为在本申请实施例中的一种方式,所述的第一缓存可以是第一服务器在其内存中创建的缓存,而在本申请实施例中的另一种方式下,若在A地有多台服务器,那么,第一缓存可由单独的缓存设备实现,也即,多台服务器共用第一缓存。这两种方式将根据实际应用的需要进行设定,并不构成对本申请的限定。
当第一服务器将相应的数据写入至第一服务器后,为了保证该第一缓存中的数据与第一数据库内的数据的一致性,所以,第一服务器还会将写入至第一数据库中的数据加载至第一缓存中。可以认为,第一服务器加载至第一缓存中的数据在后续过程中将同步至第二缓存中,故第一服务器加载至第一缓存中的数据也称为待同步数据(此时还未进行缓存之间的数据同步操作)。之后将执行缓存之间的数据同步操作,也即,执行下述步骤S204。
S204:根据第一缓存中加载的待同步数据,生成缓存同步数据发送给第二服务器,使得所述第二服务器根据所述缓存同步数据,将待同步数据写入该第二服务器的第二缓存中,完成数据同步。
需要说明的是,在实际应用时,第一数据库和第二数据库之间会保持实时的数据同步,也就是说,经过前述步骤后,第一服务器写入至第一数据库中的数据将同步是第二数据库中。但此时,第二缓存内的数据未被同步,其中的数据已成为过期数据。
基于此,在本申请实施例中,当第一服务器将写入至第一数据库中的数据加载至第一缓存中后,为了保证第二缓存内的数据也能够同步,故第一服务器会将第一缓存中加载的待同步数据,发送给第二服务器,使得第二服务器完成对第二缓存的数据同步操作。
当然,对于上述的第二服务器而言,可以是在线系统后台用于处理查询业务的服务器(即,在实际应用时,第二服务器所处理的请求通常时读请求)。此外,对于第二缓存而言,与上述的第一缓存相类似,既可以是由第二服务器在其内存中所创建的,也可以是由相应的缓存设备实现,供多台服务器使用。这里并不构成对本申请的限定。
通过上述步骤,当第一服务器根据写请求将相应的数据写入至第一数据库,并将写入的数据加载至第一缓存后,会向位于异地的第二服务器发送缓存同步数据,以使得第二服务器根据缓存同步数据,将待同步的数据写入第二缓存中,从而完成缓存中数据的同步操作。这样的方式可以有效保证第二缓存中的数据实时获取同步更新,不会因长时间不更新导致第二缓存中的数据失效。
对于本申请的上述内容需要说明的是,在实际应用中,第一服务器在向第二服务器发送缓存同步数据时,通常是以消息体的方式发送,其中,消息体是一种数据载体,用于传输数据,如:超文本传输协议(HyperText Transfer Protocol,HTTP)消息体。消息体所承载的数据大小有限,而第一缓存中的待同步数据的大小可能超过消息体所能承载的数据容量大小,这种情况下将影响两个异地的服务器之间的数据传输。
而考虑到在实际应用中,数据库可提供一种能够起到标识作用的sequence数据,那么,如果使用sequence数据来代替数据大小过大的待同步数据,则能够保证异地的两个服务器之间正常的数据传输。
因此,在本申请实施例中,在将与所述写请求对应的数据写入至所述第一数据库之前,所述方法还包括:所述第一服务器向所述第一数据库申请sequence数据,建立该sequence数据与所述写请求对应的数据的关联关系。
sequence数据具体是一种不重复、具有唯一性的序列,由第一数据库提供。具体地,第一数据库将根据第一服务器的申请,为第一服务器提供sequence数据(一次申请获得一个sequence数据),第一服务器在获得了sequence数据后,就会建立sequence数据和写请求对应的数据之间的关联关系。并将sequence数据和对应的数据一并写入至第一数据库中。
也即,对于前述步骤S202中,将与所述写请求对应的数据写入至所述第一数据库,具体包括:将所述数据以及与该数据相关联的sequence数据写入至所述第一数据库。
在实际应用时,第一数据库将构建一张数据表,用以记录sequence数据与写请求对应的数据之间的关联关系。
例如:如表1所示,为第一数据库所构建的sequence数据表,其中,sequence数据表记录了sequence数据和由第一服务器所写入的数据之间的关联关系。
表1
在表1中可见,由第一服务器写入至第一数据库中的数据,都会有相应的sequence数据与其对应。当然,如表1所示的sequence表将存储于第一数据库中,这里并不构成对本申请的限定。
之后,第一服务器也会将sequence数据加载至第一缓存中,即,对于上述步骤S203中,将写入的数据作为待同步数据加载至该第一服务器的第一缓存中,具体包括:将所述数据以及与该数据相关联的sequence数据加载至所述第一缓存中。
这样一来,此时第一缓存中就存储了sequence数据以及第一服务器写入第一数据库中的数据。
在此情况下,上述步骤S204中,根据第一缓存中加载的待同步数据,生成缓存同步数据发送给第二服务器,具体包括:判断加载至第一缓存中的数据大小是否超过预设的消息体容量阈值,若是,则根据所述第一缓存中的sequence数据生成缓存同步数据,发送给第二服务器,否则,则根据所述第一缓存中的待同步数据生成缓存同步数据,发送给第二服务器。
也就是说,如果要进行同步的数据的大小超过了消息体能够承载的数据容量,那么,就将sequence数据作为缓存同步数据发送给第二服务器,相反地,如果要进行同步的数据的大小在消息体能够承载的数据容量之内,那么,可以直接将待同步的数据作为缓存同步数据发送给第二服务器。
具体而言,在实际应用中的一种方式下,加载至第一缓存内的数据格式通常为键值对的形式,如:<key,value>。如果数据大小超过消息体的容量阈值,那么,就以<key,sequence>的方式作为缓存同步数据;而如果数据大小并未超过消息体的容量阈值,那么,就直接以<key,value>的方式作为缓存同步数据。
通过上述内容可见,正是通过使用sequence数据的方式,能够在进行缓存数据同步的过程中,有效避免因为传输的数据大小超过消息体容量阈值,导致数据传输过程受到影响。
以上内容是基于第一服务器侧的描述,对于异地的第二服务器而言,本申请实施例中还提供一种数据同步方法,如图3所示,具体包括以下步骤:
S301:第二服务器接收由第一服务器发送的缓存同步数据。
其中,所述缓存同步数据是第一服务器将数据写请求对应的数据写入至第一数据库中,并将写入的数据作为待同步数据加载至第一缓存中的。
S302:根据所述缓存同步数据,将待同步数据写入该第二服务器的第二缓存中,完成数据同步。
如前所述,由第一服务器发送的缓存同步数据可能有两种情况,一种情况为:缓存同步数据中包含写请求对应的数据。另一种情况为:缓存同步数据中包含与写请求对应的数据具有关联关系的sequence数据。若为第一种情况,那么,第二服务器可以直接将缓存同步数据加载至第二缓存中,而若为第二种情况,第二服务器需要从与之匹配的第二数据库中,查找与sequence数据相对应的数据。
具体而言:
在所述缓存同步数据中包含写请求对应的数据的场景下,上述步骤S302中,加载所述缓存同步数据至所述第二服务器的第二缓存中,具体包括:直接将所述缓存同步数据加载至所述第二服务器的第二缓存中。
在所述缓存同步数据中包含sequence数据的场景下,上述步骤S302中,加载所述缓存同步数据至所述第二服务器的第二缓存中,具体包括:根据所述sequence数据,从与所述第二服务器相匹配的第二数据库中查找与该sequence数据相关联的数据,将查找到的、与sequence数据相关联的数据懒加载至所述第二服务器的第二缓存中。
从上述内容中可见,sequence数据起到了数据标识的作用,通过sequence数据,能够有效减少在异地的两个服务器之间所传输的数据的大小,便于数据的传输,当第二服务器接收到了sequence数据,就可以根据sequence数据从第二数据库中查找与该sequence数据相匹配的数据,加载至第二缓存中,也保证了第二缓存中的数据能够及时得到同步更新。
当然,在本申请实施例中的一种方式下,第二服务器采用懒加载的方式,将与sequence数据具有关联关系的数据加载至第二缓存中。其中,懒加载是指在有需求时才进行加载,换言之,只有当第二服务器接收到了相应的查询请求后,才会将查询请求所要查询的数据从第二数据库中加载至第二缓存中,这样的方式能够减缓第二服务器的运行负荷。
这里需要说明的是,若第二服务器采用上述懒加载的方式,那么,当第二服务器接收到了包含有sequence数据的缓存同步数据后,将删除第二缓存中当前同属于同一业务的数据,这样以便于后续根据查询请求对相应的数据进行懒加载。
此外,在实际应用时,处于异地的两个数据库之间进行数据同步时,第二数据库中的数据可能并未及时完成同步(可能由网络延迟、数据库的工作负荷等原因所导致,这里不作具体限定),在这样的情况下,所述方法还包括:若未查找到与sequence数据相关联的数据,则进行重试,并在重试指定次数后,向第一服务器发送同步失败通知。
例如,当第二服务器根据sequence数据在第二数据库中未查找到对应的数据时,第二服务器可以重试3次,并在重试了3次均未查找到时,则将发送同步失败通知。
结合上述如图2和图3所示的数据同步方法,在实际应用时,具体如图4所示,包括:
S401:第一服务器接收写请求。
S402:根据所述写请求,将与所述写请求对应的数据写入至所述第一数据库。
S403:将写入的数据作为待同步数据加载至该第一服务器的第一缓存中。
S404:根据第一缓存中加载的待同步数据,生成缓存同步数据发送给第二服务器。其中,若缓存同步数据中包含写请求对应的数据,则执行步骤S405;若缓存同步数据中包含sequence数据,则执行步骤S406及步骤S407。
S405:第二服务器直接将所述缓存同步数据加载至所述第二服务器的第二缓存中。
S406:第二服务器根据所述sequence数据,从第二数据库中查找与该sequence数据相关联的数据。
S407:第二服务器将查找到的、与sequence数据相关联的数据懒加载至第二缓存中。
以上为本申请实施例提供的数据同步方法基于同样的思路,本申请实施例还提供一种数据同步装置,如图5所示。在图5中,所述数据同步装置包括:接收模块501、写入模块502、加载模块503、数据同步模块504,其中,
接收模块501,用于接收写请求,其中,所述第一服务器与第一数据库相匹配。
写入模块502,用于根据所述写请求,将与所述写请求对应的数据写入至所述第一数据库。
加载模块503,用于将写入的数据作为待同步数据加载至该第一服务器的第一缓存中。
数据同步模块504,用于根据第一缓存中加载的待同步数据,生成缓存同步数据发送给第二服务器,使得所述第二服务器根据所述缓存同步数据,将待同步数据写入该第二服务器的第二缓存中,完成数据同步。
在本申请实施例中,所述装置还包括:sequence数据模块505,用于在写入模块502执行之前,向所述第一数据库申请sequence数据,建立该sequence数据与所述写请求对应的数据的关联关系。
基于上述的sequence数据,写入模块502,具体用于将所述数据以及与该数据相关联的sequence数据写入至所述第一数据库。并且,此场景下,加载模块503,具体用于将所述数据以及与该数据相关联的sequence数据加载至所述第一缓存中。
进一步地,数据同步模块504,具体用于判断加载至第一缓存中的数据大小是否超过预设的消息体容量阈值,若是,则根据所述第一缓存中的sequence数据生成缓存同步数据,发送给第二服务器;否则,则根据所述第一缓存中的待同步数据生成缓存同步数据,发送给第二服务器。
在上述装置的基础上,本申请实施例还提供一种数据同步装置,如图6所示。在图6中,所述数据同步装置包括:接收模块601、数据同步模块602,其中,
接收模块601,用于接收由第一服务器发送的缓存同步数据;其中,所述缓存同步数据是第一服务器将数据写请求对应的数据写入至第一数据库中,并将写入的数据作为待同步数据加载至第一缓存中的。
数据同步模块602,用于根据所述缓存同步数据,将待同步数据写入该第二服务器的第二缓存中,完成数据同步。
若缓存同步数据中包含写请求对应的数据,则数据同步模块602,具体用于直接将所述缓存同步数据加载至所述第二服务器的第二缓存中。
若缓存同步数据中包含sequence数据,则数据同步模块602,具体用于根据所述sequence数据,从与所述第二服务器相匹配的第二数据库中查找与该sequence数据相关联的数据,将查找到的、与sequence数据相关联的数据懒加载至所述第二服务器的第二缓存中。
此外,数据同步模块602,还用于若未查找到与sequence数据相关联的数据,则进行重试,并在重试指定次数后,向第一服务器发送同步失败通知。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。