CN109992628A - 数据同步的方法、装置、服务器及计算机可读存储介质 - Google Patents
数据同步的方法、装置、服务器及计算机可读存储介质 Download PDFInfo
- Publication number
- CN109992628A CN109992628A CN201910301461.5A CN201910301461A CN109992628A CN 109992628 A CN109992628 A CN 109992628A CN 201910301461 A CN201910301461 A CN 201910301461A CN 109992628 A CN109992628 A CN 109992628A
- Authority
- CN
- China
- Prior art keywords
- data
- library
- data item
- state
- standby
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/14—Error detection or correction of the data by redundancy in operation
- G06F11/1402—Saving, restoring, recovering or retrying
- G06F11/1446—Point-in-time backing up or restoration of persistent data
- G06F11/1458—Management of the backup or restore process
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2201/00—Indexing scheme relating to error detection, to error correction, and to monitoring
- G06F2201/80—Database-specific techniques
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请提供了一种数据同步的方法、系统、装置、服务器及计算机可读存储介质,涉及数据库领域。该方法包括:当满足预设的数据同步条件时,主库获取待同步的数据项;依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库,以使得所述备库针对所述数据项进行数据同步;其中,所述状态类型包括当前态、历史态和全态。本发明实施例可以将主库中的待存储的数据按照其状态类型存储至对应的备库,从而完成一主库与多备库的数据同步,保证对各种状态类型的数据均进行存储,不会造成数据的浪费,从而充分利用了数据整个生命周期的价值;同时,针对不同的业务需求,有针对性的提供业务支持,提高了访问效率。
Description
技术领域
本申请涉及数据库技术领域,具体而言,本申请涉及一种数据同步的方法、系统、装置、服务器及计算机可读存储介质。
背景技术
当前数据可用性在各个领域都非常重要,数据库作为数据管理的核心,主要采用主备架构来提供高效且稳定的数据服务。因此,数据库主备同步技术是实现高效的数据库主备架构的核心技术。
数据从产生到消亡的整个生命周期都是具有价值的,比如,监管部门要求提供某账户的全部充值、消费记录,就为全态数据的存储和读取提出了需求。因此,全态数据的管理对原有关系数据库提供的数据管理范围进行了扩展。历史态数据的存储使得数据量剧增,在剧增的数据量背景下,怎么提高数据库主备同步效率是一个挑战。
目前,数据库主备同步包括以下三个方式:
第一,基于数据文件的主备同步技术。
一种最基本的主备同步技术就是定期将主机中的数据文件拷贝到备机上,这一类方法归纳为基于数据文件的主备同步技术。其大致同步流程为定期在主机上拷贝一份数据文件副本,并将其传到备机上,然后替换备机的数据文件。这种方式可以较为简单的完成主备数据同步的任务。
但是该方法也会带来一定的问题,例如主数据块出现损坏(在传输或者拷贝过程中出现损坏),则备机也受到影响,主备同步将会失败。并且单纯的使用物理数据块来进行主备同步,数据块中可能会包含不一致数据,因此会造成主备数据库数据不一致的发生。
第二,基于物理日志的主备同步技术。
为了解决基于数据文件的主备同步技术中的不足,当前数据库产品(如Oracle,PostgreSQL,SQL Server等)普遍采用基于物理日志的主备同步技术。主备数据库之间通过网络通信同步重做日志,当备机接收到重做日志后,使用“ARIES算法”原理,进行基于重做日志的数据回放工作,目的是达到同步点时刻的数据的一致性。
该方法是一种较为成熟且有效的数据库主备同步实现方式,较好的支持系统自动控制的主备复制的操作,但是重做日志的解析和回放相对复杂,且对于全态数据的支持不足,大数据量下的备库回放操作会较为耗时。
第三,基于逻辑日志的主备同步技术。
有的数据库产品(如MySQL)采用基于逻辑日志的主备同步技术,PostgreSQL近年也提供了基于逻辑日志进行主备同步的技术。
下面以MySQL为例,来展示基于日志的主备同步技术的大概流程。MySQL基于系统中的binlog来进行主备同步,binlog记录了数据库中的操作,通过特定的格式描述了数据改动,表结构改动等操作。记录在binlog中的操作都是已经完成(提交或回滚)的,因此基于binlog来进行主备同步可以避免数据不一致的问题。
图1展示了MySQL数据库集群中的主备同步流程。当主备数据库之间建立连接时,主机会维护一个Dump-Thread线程与备机对接(多个备机,就有多个线程对接)。与每一次的主备同步操作都采用如下流程:
1)备机向主机发送已经同步的binlog的信息(包括文件名和文件内位置),来帮助确定当前已同步的位置。
2)主机的Dump-Thread负责将还未同步的部分binlog发送到备机。
3)备机通过IO-Thread接收主机同步过来的binlog数据,并把数据写入Relay-Log的文件中。
4)备机通过SQL-Thread从Relay-Log中读取binlog并执行语句,从而增量的将数据重放到备库中。
该方法需要数据库提供逻辑日志来对数据库已经完成的操作进行记录,能够方便的实现主备同步的功能。但该方法由于采用了逻辑日志,会降低数据库的吞吐量,且占用较多的存储空间,需要对这部分逻辑日志进行单独的维护,成本较高。
发明内容
本申请提供了一种数据同步的方法、装置、服务器及计算机可读存储介质,可以解决现有技术中数据同步时出现的主备数据库数据不一致,不支持全态数据的同步、同步耗时较久,逻辑日志占用空间、维护成本高的问题。所述技术方案如下:
第一方面,提供了一种数据同步的方法,该方法包括:
当满足预设的数据同步条件时,主库获取待同步的数据项;依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库,以使得所述备库针对所述数据项进行数据同步;其中,所述状态类型包括当前态、历史态和全态。
优选地,所述当满足预设的数据同步条件时,主库获取待同步的数据项的步骤,包括:
当主库接收到提交的事务时,确定所述事务结束后,被所述事务变更的第一数据项,并将所述第一数据项作为待同步的数据项;
或,
以预设的时间间隔,确定该预设的时间间隔内所述主库中所有发生更新的第二数据项,并将所述第二数据项作为待同步的数据项。
优选地,所述当主库接收到提交的事务时,确定所述事务变更的第一数据项的步骤包括:
当所述主库接收到提交的事务时,获取所述事务变更的数据项;其中,所述事务变更的数据项包括当前态数据、历史态数据、过渡态数据中的至少一种;
对于当前态数据和历史数据,发生变更的数据项包括物理数据块和物理日志块;其中,当发生变更的数据项中发生变更的元组的比例超过预设阈值时,将发生变更的物理元组作为第一数据项;当发生变更的数据项中发生变更的元组的比例未超过预设阈值,将发生变更的逻辑元组作为第一数据项;
对于过渡态数据,将发生变更的逻辑元组作为第一数据项。
优选地,所述以预设的时间间隔,确定所述主库中所有发生更新的第二数据项的步骤,包括:
获取常规快照和最后一次完成数据同步的快照点之间,发生更新的数据项;其中,所述发生更新的数据项包括当前态数据、历史态数据、过渡态数据中的至少一种;
对于当前态数据和历史数据,发生变更的数据项包括物理数据块和物理日志块;其中,当发生变更的数据项中发生变更的元组的比例超过预设阈值时,将发生变更的物理元组作为第二数据项;当发生变更的数据项中发生变更的元组的比例未超过预设阈值时,将发生变更的逻辑元组作为第二数据项;
对于过渡态数据,将发生变更的逻辑元组作为第二数据项。
优选地,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库,包括以下任一情形:
若所述数据项的状态类型为当前态数据,则将所述当前态数据发送至当前态备库中,以使得所述当前态备库针对所述当前态数据进行数据同步;
若所述数据项的状态类型为全态数据,则将所述全态数据中的当前态数据分别发送至当前态备库和全态备库中,并将所述全态数据中的历史态数据分别发送至历史态备库和全态备库中,以使得所述当前态备库、所述历史态备库和所述全态备库分别针对对应的数据项进行数据同步。
优选地,所述将所述全态数据中的历史态数据分别发送至历史态备库和全态备库中的步骤,包括:
对所述全态数据中的过渡态数据进行转换,得到转换后的历史态数据;
将所述历史态数据和所述转换后的历史态数据,发送至历史态备库和全态备库中。
优选地,所述方法还包括:
当接收到所述当前态备库、历史态备库,以及全态备库中的任一备库返回的同步响应信息时,确定所述任一备库的数据同步完成。
优选地,所述同步响应信息包括以下任一项:
确认回放;确认接收;确认发送。
优选地,在所述当满足预设的数据同步条件时,主库获取待同步的数据项的步骤之前,还包括以下至少一种情形:
当任一备库与所述主库之间未进行过数据同步时,未进行过数据同步的备库与所述主库进行元信息同步;
当所述主库的元信息发生更新时,所述主库与各个备库分别进行元信息同步;
当任一备库的元信息与所述主库的元信息不一致时,与所述主库的元信息不一致的备库与所述主库进行元信息同步。
优选地,所述主库设置有第一进程和第二进程,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
通过所述第一进程将所述待同步的数据项发送至预置的流缓冲区中;
依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库。
优选地,所述依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
若所述数据项的状态类型为当前态,则通过所述第二进程将所述流缓冲区中的当前态数据发送至当前态备库。
优选地,所述依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
若所述数据项的状态类型包括当前态和历史态,则通过所述第二进程将所述流缓冲区中的当前态数据,同时发送至当前态备库和全态备库,以及将所述流缓冲区中的历史态数据,同时发送至历史态备库和全态备库。
优选地,所述依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
若所述数据项的状态类型包括当前态、历史态和转换后的历史态,则通过所述第二进程将所述流缓冲区中的当前态数据,同时发送至当前态备库和全态备库,以及将所述流缓冲区中的历史态数据、转换后的历史态数据,同时发送至历史态备库和全态备库。
第二方面,提供了一种数据同步的方法,该方法包括:
当满足预设的数据同步条件时,主库获取待同步的数据项;
依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库;其中,所述状态类型包括当前态、历史态和全态;
所述备库接收到待同步的数据项后,对所述待同步的数据项进行数据回放。
优选地,所述主库设置有第一进程和第二进程;
当待同步的数据项为逻辑元组时,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
所述第一进程将逻辑元组转化为DML语句,并为每个DML语句增加并行回放ID标识和SEQ_NO序列标识,生成更新后的DML语句;其中,同一记录的多个版本将记录相同的回放ID标识,并且SEQ_NO表明版本产生的先后顺序;
将更新后的DML语句发送至预置的流缓冲区中;
所述第二进程采用多线程从所述流缓冲区中获取所述更新后的DML语句,并发送至状态类型相匹配的至少一个备库。
优选地,所述备库设置有第三进程和第四进线程;
所述备库接收到待同步的数据项后,对所述待同步的数据项进行数据回放的步骤,包括:
所述第三进程采用多线程接收所述更新后的DML语句,并存储至回放缓冲区中;
所述第四进程从所述回放缓冲区中获取所述更新后的DML语句,并根据回放ID标识数申请对应个数的线程,对于回放ID标识相同的将在同一个线程内进行回放,在每个线程内按照SEQ_NO指定的顺序进行回放。
优选地,当待同步的数据项为物理元组时,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
所述第一进程将所述物理元组发送至预置的流缓冲区中;
所述第二进程采用多线程从所述流缓冲区中获取所述物理元组,并发送至状态类型相匹配的至少一个备库。
优选地,所述备库接收到待同步的数据项后,对所述待同步的数据项进行数据回放的步骤,包括:
所述第三进程采用多线程接收所述物理元组,并存储至回放缓冲区中;
所述第四进程从所述回放缓冲区中获取所述物理元组,并将所述物理元组分配至不同的线程进行数据回放。
优选地,在所述当满足预设的数据同步条件时,主库获取待同步的数据项的步骤之前,所述方法还包括:
各个备库采用指定的建立通信指令与所述主库建立通信。
优选地,所述系统还包括:
若任一备库的数据同步失败,则所述备库采用指定的数据同步指令重新进行数据同步。
优选地,所述当满足预设的数据同步条件时,主库获取待同步的数据项的步骤,包括:
当主库接收到提交的事务时,确定所述事务结束后,被所述事务变更的第一数据项,并将所述第一数据项作为待同步的数据项;
或,
以预设的时间间隔,确定该预设的时间间隔内所述主库中所有发生更新的第二数据项,并将所述第二数据项作为待同步的数据项。
优选地,所述当主库接收到提交的事务时,确定所述事务变更的第一数据项的步骤包括:
当所述主库接收到提交的事务时,获取所述事务变更的数据项;其中,所述事务变更的数据项包括当前态数据、历史态数据、过渡态数据中的至少一种;
对于当前态数据和历史数据,发生变更的数据项包括物理数据块和物理日志块;其中,当发生变更的数据项中发生变更的元组的比例超过预设阈值时,将发生变更的物理元组作为第一数据项;当发生变更的数据项中发生变更的元组的比例未超过预设阈值,将发生变更的逻辑元组作为第一数据项;
对于过渡态数据,将发生变更的逻辑元组作为第一数据项。
优选地,所述以预设的时间间隔,确定所述主库中所有发生更新的第二数据项的步骤,包括:
获取常规快照和最后一次完成数据同步的快照点之间,发生更新的数据项;其中,所述发生更新的数据项包括当前态数据、历史态数据、过渡态数据中的至少一种;
对于当前态数据和历史数据,发生变更的数据项包括物理数据块和物理日志块;其中,当发生变更的数据项中发生变更的元组的比例超过预设阈值时,将发生变更的物理元组作为第二数据项;当发生变更的数据项中发生变更的元组的比例未超过预设阈值时,将发生变更的逻辑元组作为第二数据项;
对于过渡态数据,将发生变更的逻辑元组作为第二数据项。
优选地,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库,包括以下任一情形:
若所述数据项的状态类型为当前态数据,则将所述当前态数据发送至当前态备库中,以使得所述当前态备库针对所述当前态数据进行数据同步;
若所述数据项的状态类型为全态数据,则将所述全态数据中的当前态数据分别发送至当前态备库和全态备库中,并将所述全态数据中的历史态数据分别发送至历史态备库和全态备库中,以使得所述当前态备库、所述历史态备库和所述全态备库分别针对对应的数据项进行数据同步。
优选地,所述将所述全态数据中的历史态数据分别发送至历史态备库和全态备库中的步骤,包括:
对所述全态数据中的过渡态数据进行转换,得到转换后的历史态数据;
将所述历史态数据和所述转换后的历史态数据,发送至历史态备库和全态备库中。
优选地,所述方法还包括:
当接收到所述当前态备库、历史态备库,以及全态备库中的任一备库返回的同步响应信息时,确定所述任一备库的数据同步完成。
优选地,所述同步响应信息包括以下任一项:
确认回放;确认接收;确认发送。
优选地,在所述当满足预设的数据同步条件时,主库获取待同步的数据项的步骤之前,还包括以下至少一种情形:
当任一备库与所述主库之间未进行过数据同步时,未进行过数据同步的备库与所述主库进行元信息同步;
当所述主库的元信息发生更新时,所述主库与各个备库分别进行元信息同步;
当任一备库的元信息与所述主库的元信息不一致时,与所述主库的元信息不一致的备库与所述主库进行元信息同步。
优选地,所述主库设置有第一进程和第二进程,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
通过所述第一进程将所述待同步的数据项发送至预置的流缓冲区中;
依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库。
优选地,所述依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
若所述数据项的状态类型为当前态,则通过所述第二进程将所述流缓冲区中的当前态数据发送至当前态备库。
优选地,所述依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
若所述数据项的状态类型包括当前态和历史态,则通过所述第二进程将所述流缓冲区中的当前态数据,同时发送至当前态备库和全态备库,以及将所述流缓冲区中的历史态数据,同时发送至历史态备库和全态备库。
优选地,所述依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
若所述数据项的状态类型包括当前态、历史态和转换后的历史态,则通过所述第二进程将所述流缓冲区中的当前态数据,同时发送至当前态备库和全态备库,以及将所述流缓冲区中的历史态数据、转换后的历史态数据,同时发送至历史态备库和全态备库。
第三方面,提供了一种数据同步的装置,该装置包括:
获取模块,用于当满足预设的数据同步条件时,主库获取待同步的数据项;
发送模块,用于依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库,以使得所述备库针对所述数据项进行数据同步;其中,所述状态类型包括当前态、历史态和全态。
优选地,所述获取模块包括:
第一确定子模块,用于当主库接收到提交的事务时,确定所述事务结束后,被所述事务变更的第一数据项,并将所述第一数据项作为待同步的数据项;
第二确定子模块,用于以预设的时间间隔,确定该预设的时间间隔内所述主库中所有发生更新的第二数据项,并将所述第二数据项作为待同步的数据项。
优选地,所述第一确定子模块包括:
第一数据项确定单元,用于当所述主库接收到提交的事务时,获取所述事务变更的数据项;其中,所述事务变更的数据项包括当前态数据、历史态数据、过渡态数据中的至少一种;
第一判定单元,对于当前态数据和历史数据,发生变更的数据项包括物理数据块和物理日志块;其中,当发生变更的数据项中发生变更的元组的比例超过预设阈值时,所述第一判定单元用于将发生变更的物理元组作为第一数据项;当发生变更的数据项中发生变更的元组的比例未超过预设阈值,所述第一判定单元用于将发生变更的逻辑元组作为第一数据项;
对于过渡态数据,所述第一判定单元用于将发生变更的逻辑元组作为第一数据项。
优选地,所述第二确定子模块包括:
第二数据项确定单元,用于获取常规快照和最后一次完成数据同步的快照点之间,发生更新的数据项;其中,所述发生更新的数据项包括当前态数据、历史态数据、过渡态数据中的至少一种;
第二判定单元,对于当前态数据和历史数据,发生变更的数据项包括物理数据块和物理日志块;其中,当发生变更的数据项中发生变更的元组的比例超过预设阈值时,所述第二判定单元用于将发生变更的物理元组作为第二数据项;当发生变更的数据项中发生变更的元组的比例未超过预设阈值时,所述第二判定单元用于将发生变更的逻辑元组作为第二数据项;
对于过渡态数据,所述第二判定单元用于将发生变更的逻辑元组作为第二数据项。
优选地,所述发送模块具体用于执行以下任一情形:
若所述数据项的状态类型为当前态数据,则将所述当前态数据发送至当前态备库中,以使得所述当前态备库针对所述当前态数据进行数据同步;
若所述数据项的状态类型为全态数据,则将所述全态数据中的当前态数据分别发送至当前态备库和全态备库中,并将所述全态数据中的历史态数据分别发送至历史态备库和全态备库中,以使得所述当前态备库、所述历史态备库和所述全态备库分别针对对应的数据项进行数据同步。
优选地,所述发送模块包括:
转换子模块,用于对所述全态数据中的过渡态数据进行转换,得到转换后的历史态数据;
发送子模块,用于将所述历史态数据和所述转换后的历史态数据,发送至历史态备库和全态备库中。
优选地,所述装置还包括:
接收模块,用于当接收到所述当前态备库、历史态备库,以及全态备库中的任一备库返回的同步响应信息时,确定所述任一备库的数据同步完成。
优选地,所述同步响应信息包括以下任一项:
确认回放;确认接收;确认发送。
优选地,所述装置还包括:元信息同步模块,用于执行以下至少一种情形:
当任一备库与所述主库之间未进行过数据同步时,未进行过数据同步的备库与所述主库进行元信息同步;
当所述主库的元信息发生更新时,所述主库与各个备库分别进行元信息同步;
当任一备库的元信息与所述主库的元信息不一致时,与所述主库的元信息不一致的备库与所述主库进行元信息同步。
优选地,所述主库设置有第一进程和第二进程,所述发送模块包括:
第一进程启动子模块,用于启动所述第一进程,并通过所述第一进程将所述待同步的数据项发送至预置的流缓冲区中;
第二进程启动子模块,用于依据所述数据项的状态类型,启动所述第二进程,并通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库。
优选地,所述第二进程启动子模块具体用于:若所述数据项的状态类型为当前态,则通过所述第二进程将所述流缓冲区中的当前态数据发送至当前态备库。
优选地,所述第二进程启动子模块具体用于:若所述数据项的状态类型包括当前态和历史态,则通过所述第二进程将所述流缓冲区中的当前态数据,同时发送至当前态备库和全态备库,以及将所述流缓冲区中的历史态数据,同时发送至历史态备库和全态备库。
优选地,所述第二进程启动子模块具体用于:若所述数据项的状态类型包括当前态、历史态和转换后的历史态,则通过所述第二进程将所述流缓冲区中的当前态数据,同时发送至当前态备库和全态备库,以及将所述流缓冲区中的历史态数据、转换后的历史态数据,同时发送至历史态备库和全态备库。
第四方面,提供了一种服务器,其特征在于,其包括:
处理器、存储器和总线;
所述总线,用于连接所述处理器和所述存储器;
所述存储器,用于存储操作指令;
所述处理器,用于通过调用所述操作指令,可执行指令使处理器执行如本申请的第一方面所示的数据同步的方法对应的操作。
第五方面,提供了一种计算机可读存储介质,所述计算机可读存储介质应用于服务器,该计算机可读存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,该指令、该程序、该代码集或该指令集由处理器加载并执行时实现本申请第一方面所示的数据同步的方法。
本申请提供的技术方案带来的有益效果是:
相较于相关技术中的仅持久的维护当前态数据,暂时维护过渡态数据,而历史态数据会被清理,导致过渡态数据和历史态的数据无法被存储,使得这部分数据的价值也无法被充分利用,本发明实施例可以将主库中的待存储的数据按照其状态类型存储至对应的备库,从而完成一主库与多备库的数据同步,保证对各种状态类型的数据均进行存储,不会造成数据的浪费,从而充分利用了数据整个生命周期的价值。
进一步,因为将当前态数据、历史态数据、全态数据分别进行存储,所以,在针对只需要访问当前态数据,或者历史态数据,或者全态数据的业务需求时,可以有针对性的提供业务支持,提高了访问效率。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对本申请实施例描述中所需要使用的附图作简单地介绍。
图1为现有技术中MySQL主备同步流程示意图;
图2为本申请一个实施例提供的一种数据同步的应用环境的示意图;
图3为本申请一个实施例提供的数据库的数据项结构示意图;
图4为本申请一个实施例提供的数据库的事务状态数据页结构图;
图5本申请一个实施例提供的一种数据同步的方法的流程示意图;
图6为本申请中主备库的各个进程之间的完整流程交互图;
图7为本申请另一实施例提供的一种数据同步的方法的流程示意图;
图8-1为本申请又一实施例提供的一种数据同步的装置的结构示意图;
图8-2为本申请另一实施例提供的一种数据同步的装置的结构示意图;
图9为本申请又一实施例提供的一种服务器的结构示意图。
具体实施方式
下面详细描述本申请的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本申请,而不能解释为对本发明的限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本申请的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
本申请提供的数据同步的方法、装置、服务器和计算机可读存储介质,旨在解决现有技术的如上技术问题。
下面以具体地实施例对本申请的技术方案以及本申请的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本申请的实施例进行描述。
本发明实施例提供了一种数据同步的应用环境,参见图2,该应用环境包括:主服务器101,备服务器102,主服务器101中包括主数据库1011,备服务器中包括当前态备库1021、历史态备库1022、全态备库1023,在实际应用中,备库还可以是上述三个备库中的任意一个,或者任意两个;而且,三个备库可以在一个备服务器里,也可以在不同的备服务器里,本发明实施例对此不作限制。本发明实施例以备库包括上述三个备库,且在一个备服务器里进行详细说明。
其中,当前态备库1021为采用当前态模式进行数据同步的数据库,历史态备库1022为采用历史态模式进行数据同步的数据库,全态备库1023为采用全态模式进行数据同步的数据库。
在本发明实施例中,主库和备库可以采用MVCC(Multi-Version ConcurrencyControl,多版本并发访问控制)技术,来记录每个数据项的多个版本;其中,各个数据库中存储至少一个元组,一个元组存储一个数据项的一个或多个版本数据。
具体的,MVCC首先会将数据项的修改变换为对数据项版本的修改,每一次的更新操作逻辑上不会修改原有的数据,而是产生一个新的数据版本,作为更新后的新数据项。并且每一个事务在开始时都会创建一个事务粒度的快照,来记录当前数据库系统中的并发事务状态。当有多个事务在读取或修改某一数据项的情况下,MVCC技术通过结合对应事务快照,运用可见性判断算法,指出每一个事务所能访问的数据项版本,从而将多个事务的操作隔离开来,使得多个并发事务之间可以互不影响。
在MVCC数据库中,通用的数据项结构如图3所示,所包含的系统字段包括:trx_min表示产生该版本的事务ID,trx_max表示将该版本修改为历史版本的事务ID,roll_ptr代表指向前一版本的指针,info_bit标识该版本的操作状态。其中,事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。数据库操作可以包括增加、删除、修改、查询四种,一个事务可以包括四种操作中的任意一种或多种的组合,比如,一个事务可以只包括查询操作,也可以包括三个增加操作和两个删除操作。一个事务对应一个用户。
进一步,基于MVCC技术和快照隔离级别,可以将通用的事务快照的创建过程和重要数据结构进行描述,事务开始时,就会创建对应的数据快照来保存数据库中并发事务的情况,表明当前新事务执行时刻,当前系统哪些数据是可读的,哪些是并发/并行的事务其数据不能被本事务获取。这样结合数据项上的系统列,可以保证并发事务的正确执行。
本发明实施例需要用到已经结束的事务的快照,所以,需要对事务的状态进行管理,来达到事务快照同样的效果。具体而言,用16个字节来存储每个事务的开始时间,结束时间和目前的状态,对每一个属性的详细描述如下:a)开始时间(7字节):代表事务开始的时间戳。b)结束时间(7字节):代表事务结束的时间,对于还在进行的事务,此值为空。c)状态(2字节):用于表示当前事务的状态,包括未开始、正在进行、已提交和已终止四种。
每个事务都通过事务ID(trx_id)来进行唯一标识。存储事务状态的数据页结构如图4所示,事务ID与每条事务状态的存放位置之间可以相互转换。每条记录中没有存储事务ID,通过记录所在的页面ID(page_id)和页内偏移量(offsets)即可快速计算出事务ID,如公式(1)所示。每个数据页中存储有num_per_page条事务状态记录,由页面大小page_size除以事务状态记录大小info_record_size得到,如公式(2)所示。公式(3)(4)给出了通过事务ID计算得到页面ID和页内偏移量的方法。
trx_id=page_id*num_per_page+offsets/info_record_size
(1)
num_per_page=page_size/info_record_size
(2)
page_id=trx_id/num_per_page
(3)
offsets=(trx_id%num_per_page)*info_record_size
(4)
在相关技术中,仅持久的维护当前态的数据,暂时维护过渡态的数据,而历史态的数据会被清理。由于数据从产生到消亡的整个生命周期都是具有价值的,数据项的历史态数据不能丢失,所以,当该数据项的历史态数据被清除后,就无法从数据库中追踪到历史态数据,进而无法进行数据追踪和分析。
而在本发明实施例中,对于数据库中数据项的历史态数据,可以通过转储的方式来存储,而不会通过清理的方式清理掉,即数据库中存储了一个数据项的全态数据。
本发明实施例将数据项的多个版本根据所处的状态进行了划分,从而利用多版本的特性,来对数据的生命周期进行描述。数据的生命周期分为三个阶段,每个阶段刻画数据的不同状态属性,以标识数据的生命周期轨迹中所处的状态,我们将这三个阶段合称为数据全态(Full State),或称为全态数据,包括:
1、当前态(Current State):数据项的最新版本的数据,是处于当前阶段的数据。在MVCC机制下,能被读取到的最新版本的数据即为当前态数据。
2、历史态(Historical state):数据项在历史上的一个状态,其值是旧值,不是当前值。一个数据项的历史态,可以有多个,反映了数据的状态变迁的过程。处于历史态的数据,只能被读取不能再被修改或删除。在MVCC机制下,当前活跃事务列表中最小的事务之前的事务所产生的历史版本,其状态处于历史态。
3、过渡态(Transitional State):不是数据项的最新的版本也不是历史态版本,处于从当前态向历史态转变的过程中。处于过渡态的数据,称为半衰数据。MVCC机制下,被读取的版本上尚有活跃事务(非最新相关事务)在使用,因最新相关事务修改了数据项的值,其最新值已经处于一个当前态,被读取到的值相对当前态已经处于一个历史状态,故其数据状态介于当前态和历史态之间,所以称为过渡态。
需要说明的是,该数据项的当前态数据是指该数据项的最新的k个版本数据;该数据项的过渡态数据是指存储在过渡页面中的数据;该数据项的历史态数据是指该数据项的数据中除该当前态数据和过渡态数据以外的其他数据。k的取值可以根据需要进行设置并更改,在本发明实施例中,对k的取值不作具体限定。例如,k的默认取值可以为10。
进一步,在进行数据同步之前,还需要建立各个数据库之间的主备关系。
具体而言,在主库启动且正常运行情况下,可以在各个备库上通过CLI(命令行)执行如下SYNC_START命令,建立主备关系。需要注意的是,该命令只能最多被正确执行一次,即一个备库不能同时与多个主库建立主备关系;而且,该命令的语法仅用于表达语义,其形式不限制于如下格式:
SYNC_START -h host -u user -p passwd -t FULL/CUR/HIS[-D db_name][-Ttable_name][-C SYNC/ASYNC][-L APL/RCV/SND];
其中,通过-h、-u、-p参数指定主数据库的IP、用户名、密码,从而在主备库之间建立长连接通信,来保证数据通信的稳定性并尽量降低网络开销。
通过-D、-T参数指定主备同步的作用域。-D指定数据库,可以支持一个或多个数据库的同步,库名间用逗号间隔,参数缺省为全部数据库;-T指定数据表,可以支持一个或多个数据表,表名间用逗号间隔,缺省为全部数据表。
通过-t参数指定同步模式,本发明实施例支持全态模式(FULL)、当前态模式(CUR)、历史态模式(HIS)三种同步模式;具体如下:
a)当前态模式:对当前态数据进行数据同步,当前态备库中包含当前态数据;适用于频繁访问当前态数据的场景。比如,为在线网页提供服务的场景,因为每次数据同步都是符合事务一致性的,所以备机可以对外提供只读服务以满足OLAP应用的需求。
b)历史态模式:对历史态数据进行数据同步,历史态备库中包含历史态数据;适用于只需要访问历史上发生过的事务(即次新事务修改过的数据,最新事务修改过的数据对应的是当前态数据),比如,离线数据分析等应用。
c)全态模式:对全态数据进行数据同步,全态备库中包含全态数据;全态数据库可以对全态数据的访问提供支持,这样全态数据存在多副本,适用于对于数据重要性和可用性看重的场景,比如,金融服务场景。
通过-C参数指定复制机制,本发明实施例支持同步(SYNC)、异步(ASYNC)两种复制机制,缺省为异步机制;具体如下:
a)同步复制:主备数据复制将与事务提交紧密相关,每次事务提交阶段都会发起一次主备数据复制,将当前事务修改的数据同步到备库,主库等待备库回放完成后,才将当前事务状态置为“已提交”。
b)异步复制:主备数据复制与事务提交不相关。主库提交事务不会发起主备数据复制,满足提交条件即可进行事务提交。主备数据复制将按照指定的时间间隔发起,将这段时间内主库上发生修改的数据复制到备库。
通过-L参数指定确认级别,本发明实施例支持确认回放(APL)、确认收到(RCV)、确认发送(SND)三种确认级别,缺省为确认回放级别;具体如下:
a)确认回放级别:只有当所有备库返回“Applied”指令,主库才认为当前主备复制任务完成。强同步保证每次的主备复制是原子的,即主备复制整体要不成功、要不失败。如果失败,则整体进行重做。
b)确认接收级别:当所有备库返回“Received”指令,主库就认为当前主备复制任务完成。弱同步保证除了数据回放,其余操作都是原子的。即如果数据回放失败,不会使得主备同步整体重做。
c)确认发送级别:当主库完成数据发送操作后,主库就认为当前主备复制任务完成。不能保证主备复制操作的原子性,但主备库间互不影响,即有备库发送宕机异常等异常情况时,不会阻塞主机发起复制任务,对于其余备库的主备复制仍可以正常进行。
其中,“原子”操作是指不会被线程调度机制打断的操作。这种操作一旦开始,就一直运行到结束,中间不会切换到另一个线程。
如果需要删除数据库主备关系,则在各个备库上通过CLI(命令行)执行SYNC_STOP命令,即可断开与主库的连接。
在所述数据同步的应用环境中,可以执行一种数据同步的方法,如图5所示,该方法包括:
步骤S501,当满足预设的数据同步条件时,主库获取待同步的数据项;
其中,预设的数据同步条件包括主库接收到提交的事务,或者,经过了预设的时间间隔。
步骤S502,依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库,以使得所述备库针对所述数据项进行数据同步;其中,所述状态类型包括当前态、历史态和全态。
其中,数据项的状态类型包括当前态、历史态和过渡态,这三种状态类型的数据合称为“全态数据”,当前态备库用于存储当前态数据,历史态备库用于存储历史态数据,以及将过渡态数据转换后得到转换后的历史态数据,全态备库用于存储当前态数据、历史态数据,以及转换后的历史态数据。
具体地,待同步的数据项若只有当前态数据,那么将待同步的数据项同步到当前态备库即可;待同步的数据项若包括当前态数据和历史态数据,那么就将当前态数据同步到当前态备库和全态备库,历史态数据同步到历史态备库和全态备库,也就是三个备库同时进行数据同步;待同步的数据项若包括当前态数据和过渡态数据,那么就将当前态数据同步到当前态备库和全态备库,并对全态数据中的过渡态数据进行转换,得到转换后的历史态数据(其它数据正在被事务占用),将转换后的历史态数据同步到历史态备库和全态备库;待同步的数据项若包括当前态数据、历史态数据和过渡态数据,也是三个备库同时进行数据同步。
进一步,主库中的每个数据项都会记录有多个版本,在进行数据同步的时候,依据待同步的数据项的版本就可以确定待同步的数据项的状态类型,然后同步至对应的备库了。
相较于相关技术中的仅持久的维护当前态数据,暂时维护过渡态数据,而历史态数据会被清理,导致过渡态数据和历史态的数据无法被存储,使得这部分数据的价值也无法被充分利用,本发明实施例可以将主库中的待存储的数据按照其状态类型存储至对应的备库,从而完成一主库与多备库的数据同步,保证对各种状态类型的数据均进行存储,不会造成数据的浪费,从而充分利用了数据整个生命周期的价值。
进一步,因为将当前态数据、历史态数据、全态数据分别进行存储,所以,在针对只需要访问当前态数据,或者历史态数据,或者全态数据的业务需求时,可以有针对性的提供业务支持,提高了访问效率。
在另一个实施例中继续对如图5所示的一种数据同步的方法进行详细说明。
步骤S501,当满足预设的数据同步条件时,主库获取待同步的数据项;
在本发明一种优选实施例中,当包括以下至少一种情形时,进行元信息同步;
当任一备库与所述主库之间未进行过数据同步时,未进行过数据同步的备库与所述主库进行元信息同步;当所述主库的元信息发生更新时,所述主库与各个备库分别进行元信息同步;当任一备库的元信息与所述主库的元信息不一致时时,与所述主库的元信息不一致的备库与所述主库进行元信息同步。
具体而言,元信息是数据库中表结构、表空间等的定义,数据库定义了元信息后,才能进行数据存储。而且,在数据存储的过程中,如果改变了元信息,那么数据库中已经存储的数据就全部没用了。简单来说,更改数据库的元信息相当于对数据库进行了格式化。
应用于本发明实施例,为了保证主库中的数据与备库中的数据的一致性,各个备库需要与主库采用相同的元信息。因此,当备库与主库第一次进行数据同步,也就是备库中没有任何主库中的数据之前,主库需要将元信息发送至备库,备库先进行元信息的同步,元信息同步完成后,再进行数据同步。
或者,当主库的元信息发生更新的时候,各个备库都要与更新后的主库进行元信息同步;再或者,当任一备库的元信息与所述主库的元信息不一致的时候,该备库就需要与主库进行元信息同步。当备库的元信息同步完成,备库与主库就需要重新开始数据同步了。
需要说明的是,元信息通常通过文件的形式直接存储,并且一般都很小,所以,元信息同步的时候,主库将元信息文件直接发送至备库即可完成元信息的同步。
本发明实施例支持同步复制和异步复制两种复制机制,所以,触发数据同步的预设条件也包括两种情况:
当主库接收到提交的事务时,确定所述事务结束后,被所述事务变更的第一数据项,并将所述第一数据项作为待同步的数据项;
或,
以预设的时间间隔,确定该预设的时间间隔内所述主库中所有发生更新的第二数据项,并将所述第二数据项作为待同步的数据项。
针对同步复制,主库接收到的事务可以是对数据项进行修改的事务,比如插入数据、删除数据等,当事务对数据项修改完成后,主库就可以获取被修改的数据项,作为待同步的数据项了。
针对异步复制,在一个预设的时间间隔内,主库中被各个事务所修改的所有的数据项,都是待同步的数据项。
进一步,在实际应用中,事务在访问数据库的过程中会产生脏数据,通俗的讲,当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。比如,事务A更新了某个数据项X,但是由于某种原因,事务A出现了问题,于是要把A回滚。但是在回滚之前,另一个事务B读取了数据项X的值(A更新后),A回滚了事务,数据项恢复了原值。事务B读取的就是数据项X的就是一个“临时”的值,就是脏数据。因此,当数据项中存在脏数据时,就不需要对脏数据进行同步了。
进一步,针对不同的复制模式,本发明实施例会采用两种方式来获取待同步的数据项,包括:
a)物理复制,指的是数据流中传输的最小单位为物理数据块或物理日志块(REDOLOG),数据块中存有物理数据记录或日志记录,物理复制基于物理数据块或物理日志块进行;
b)逻辑复制,指的是数据流中传输的最小单位为逻辑元组。逻辑元组指的是将符合复制条件的数据组织为DML语句的形式,备库可以通过执行语句的形式进行数据回放。
具体而言,针对同步复制,当所述主库接收到提交的事务时,获取所述事务变更的数据项;其中,所述发生更新的数据项包括当前态数据、历史态数据、过渡态数据中的至少一种;对于当前态数据和历史数据,发生变更的数据项包括物理数据块和物理日志块;其中,当发生变更的数据项中发生变更的元组的比例超过预设阈值时,将发生变更的物理元组作为第一数据项;当发生变更的数据项中发生变更的元组的比例未超过预设阈值时,将发生变更的逻辑元组作为第一数据项;对于过渡态数据,将发生变更的逻辑元组作为第一数据项。
例如,某项事务变更的数据项中包括100个元组(包括物理数据块和物理日志块),但是实际上发生变更的元组只有18个,而预设阈值为20%,此时,发生变更的元组数量小于预设阈值的数量(18个小于20个),就不需要将100个元组全部进行同步,将发生变更的18个元组作为待同步的数据项即可,也就是逻辑复制;如果实际上发生变更的元组有88个,大于预设阈值的20个,此时,就可以将整个数据项作为待同步的数据项,也就是物理复制。
针对异步复制,获取常规快照和最后一次完成数据同步的快照点之间,发生更新的数据项;其中,所述发生更新的数据项包括当前态数据、历史态数据、过渡态数据中的至少一种;对于当前态数据和历史数据,发生变更的数据项包括物理数据块和物理日志块;其中,当发生变更的数据项中发生变更的元组的比例超过预设阈值时,将发生变更的物理元组作为第二数据项;当发生变更的数据项中发生变更的元组的比例未超过预设阈值时,将发生变更的逻辑元组作为第二数据项;对于过渡态数据,将发生变更的逻辑元组作为第二数据项。
与同步复制的区别在于,异步复制确定待同步的数据项的方式可以为快照差技术,即,获取常规快照和LastSyncPtr(最后一次完成数据同步的快照点)之间,发生更新的数据项。
需要说明的是,上述事例中的20%仅为举例说明,在实际应用中,可以根据实际需求调整具体数值,本发明实施例对此不作限制。
步骤S502,依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库,以使得所述备库针对所述数据项进行数据同步;其中,所述状态类型包括当前态、历史态和全态。
本发明实施例中,备库包括当前态备库、历史态备库和全态备库,在进行数据同步时,可以将待同步的数据项发送与状态类型相匹配的至少一个备库,包括以下任一情形:
若所述数据项的状态类型为当前态数据,则将所述当前态数据发送至当前态备库中,以使得所述当前态备库针对所述当前态数据进行数据同步;
若所述数据项的状态类型为全态数据,则将所述全态数据中的当前态数据分别发送至当前态备库和全态备库中,并将所述全态数据中的历史态数据分别发送至历史态备库和全态备库中,以使得所述当前态备库、所述历史态备库和所述全态备库分别针对对应的数据项进行数据同步。其中,备库中写入待同步的数据项的过程就叫做回放。
具体而言,待同步的数据项若只有当前态数据,那么将待同步的数据项同步到当前态备库即可;待同步的数据项若包括当前态数据和历史态数据,那么就将当前态数据同步到当前态备库和全态备库,历史态数据同步到历史态备库和全态备库,也就是三个备库同时进行数据同步;待同步的数据项若包括当前态数据和过渡态数据,那么就将当前态数据同步到当前态备库和全态备库,并对全态数据中的过渡态数据进行转换,得到转换后的历史态数据(其它数据正在被事务占用),将转换后的历史态数据同步到历史态备库和全态备库;待同步的数据项若包括当前态数据、历史态数据和过渡态数据,也是三个备库同时进行数据同步。
在本发明一种实施例中,所述主库设置有第一进程和第二进程,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库,包括:
通过所述第一进程将所述待同步的数据项发送至预置的流缓冲区中;
依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库。
具体而言,当主库与各个备库建立通信成功后,会开启后台第一进程SyncReport和后台第二进程SyncSend,相应的,备库也会开启后台进程SyncRecv和SyncApply。
上述各个进程之间的一次完整交互过程如下,如图6所示:
a)主库SyncReport获取待同步的数据项,将待同步的数据项存入预置的流缓冲区中,之后让出CPU并等待被唤醒;
b)主库SyncSend进程被唤醒,负责将流缓冲区中的待同步数据发送到备库中。发送完成后,进程进入等待;
c)备库SyncRecv进程接收到由主库发来的待同步的数据项,并放入备库中的回放流缓冲区。数据接收完成后,将发送“Received”指令给主库,代表备库数据接收完成;
d)备库SyncApply进程读取回放流缓冲区中的数据进行回放操作。回放完成后,通知SyncRecv进程发送“Applied”指令给主库,代表备库回放完成;
e)根据预设的确认级别,主库SyncSend在收到备库相应的响应信息后,将LastSyncPtr位点更新为当前快照点,并转换为就绪状态,并通知SyncReport进程转换为就绪状态。在同步复制的情况下,还需通知事务管理器提交当前事务。
这样,通过主库将待同步的数据项存入流缓冲区,然后另一个进程从流缓冲区中获取数据并发送给备库的方式,实现了将待同步的数据项采用基于流缓冲区的数据流的形式进行数据传输,提升了数据同步的效率。
进一步,为了保证主备复制下的数据一致性,主库支持读写事务,备库提供只读事务支持。用户对主备数据库进行全态数据、当前态数据、历史态数据的查询时,只能选取当前LastSyncPtr快照点以及之前的快照进行查询,即对于主备库都只能查到确认同步的数据,从而保证了用户在主备上查询得到的数据是一致的。
结合上述各个进程之间的一次完整交互过程,以下对主库与各个备库进行一次数据同步的过程进行分别描述。
1、主库与当前态备库的一次数据同步过程:
a)主库SyncReport获取待同步的数据项,将待同步的数据项存入预置的流缓冲区中,之后让出CPU并等待被唤醒;
其中,主库SyncReport获取待同步的数据项包括:
对于同步复制,获取到当前事务改变的物理数据块和物理日志块,基于流缓冲区发送至当前态备库;对于异步复制,根据常规快照和上一次复制任务完成时记录的LastSyncPtr快照点,获取物理数据块和物理日志块,基于流缓冲区发送至当前态备库。
其中,如果待同步的数据项中的部分元组待同步,则当待同步元组比例超过阈值,比如20%时,对数据项采用物理复制的方式,存入流缓冲区中;当比例不超过阈值时,对数据项中待同步的元组采取逻辑复制的方式,将每个逻辑元组转换为REPLACE语句的形式,存入流缓冲区中;
b)主库SyncSend进程被唤醒,负责将流缓冲区中的待同步数据发送到备库中。发送完成后,进程进入等待;
c)备库SyncRecv进程接收到由主库发来的待同步的数据项,并放入备库中的回放流缓冲区。数据接收完成后,将发送“Received”指令给主库,代表备库数据接收完成;
d)备库SyncApply进程读取回放流缓冲区中的数据进行回放操作,包括:
当前态备库接收到待同步的数据项后,首先扫描从主库传来的物理REDO日志块,使用“ARIES算法”原理,根据上次回放所记录的CHECKPOINT,作为本次回放的起始点,从该位置顺序扫描REDO日志记录。
然后备库根据所读到的REDO日志信息定位物理数据块所在的物理地址,将物理数据块存储到对应的位置。SyncApply将会开启多个Worker线程(REDO日志中带有主机的并发控制信息,有助于回放时的并行执行),物理数据块将会分配到不同的Worker线程,从而实现并行回放,提高回放的效率。
回放完成后,通知SyncRecv进程发送“Applied”指令给主库,代表备库回放完成;
e)根据预设的确认级别,主库SyncSend在收到备库相应的响应信息后,将LastSyncPtr位点更新为当前快照点,也就是执行CHECKPOINT操作,将CHECKPOINT更新到当前回放已完成的位置,把回放的数据从内存中刷出,然后主库SyncSend转换为就绪状态,并通知SyncReport进程转换为就绪状态。在同步复制的情况下,还需通知事务管理器提交当前事务。
2、主库与历史态备库的一次数据同步过程:
a)主库SyncReport获取待同步的数据项,将待同步的数据项存入预置的流缓冲区中,之后让出CPU并等待被唤醒;
其中,主库SyncReport对于过渡态和历史态,采用不同的方法获取待复制数据。
对于过渡态数据,包含对于同一个数据项的、满足复制条件的多个版本,对过渡态数据进行转换,得到转换后的历史态数据,然后采用逻辑复制的方式获取到转换后的历史态数据,采用快照差技术,获取到过渡态中符合对于当前快照和上一次同步时记录的LastSyncPtr快照差可见的数据,将其转换为INSERT语句的形式,存入流缓冲区中。
对于历史态数据,(1)如果待同步的数据项的全部元组处于快照差范围内,则将整个数据项存入流缓冲区中;(2)如果同步的数据项的部分元组处于快照差范围内,则分为两种情况:如果超过阈值,比如20%的元组处于快照差的范围内,则对待同步的数据项进行物理复制;如果不超过比如的元组处于快照差的范围内,则采取逻辑复制的方式,将每个元组转换为INSERT语句(INSERT语句中的目标对象是历史态数据,非原数据)的形式,存入流缓冲区中;
b)主库SyncSend进程被唤醒,负责将流缓冲区中的待同步数据发送到备库中。发送完成后,进程进入等待;
c)备库SyncRecv进程接收到由主库发来的待同步的数据项,并放入备库中的回放流缓冲区。数据接收完成后,将发送“Received”指令给主库,代表备库数据接收完成;
d)备库SyncApply进程读取回放流缓冲区中的数据进行回放操作,包括:
首先进行过渡态数据(转换后的历史态数据)的逻辑回放。历史态备库原子的在备库中重新执行INSERT语句,逻辑地将元组回放到历史态备库中。
然后进行历史态数据的物理回放。历史态备库根据元信息找到物理数据块所在的物理地址,然后直接将物理数据块存储到对应的位置,并进行数据落盘操作。
最后进行历史态数据的逻辑回放。历史态备库原子的在备库中重新执行INSERT语句(INSERT语句中的目标对象是历史态数据,非原数据),逻辑的将历史态元组回放到历史态备库中。
回放完成后,通知SyncRecv进程发送“Applied”指令给主库,代表备库回放完成;
e)根据预设的确认级别,主库SyncSend在收到备库相应的响应信息后,将LastSyncPtr位点更新为当前快照点,并转换为就绪状态,并通知SyncReport进程转换为就绪状态。在同步复制的情况下,还需通知事务管理器提交当前事务。
需要说明的是,因为历史数据都是已提交数据,不存在并发事务的问题,因此不用对物理日志进行复制,也就是说,历史态数据复制算法不需要采用同步复制机制。并且历史数据对同步时效的要求较低,且历史数据量往往较大,采用异步复制机制,可以提供较好的主备数据复制效率。
3、主库与全态备库的一次数据同步过程:
a)主库SyncReport获取待同步的数据项,将待同步的数据项存入预置的流缓冲区中,之后让出CPU并等待被唤醒;
其中,主库SyncReport采用不同的方式获取当前态、过渡态、历史态的待同步数据。具体获取方式与第1、2点中的获取方式相同,在此就不赘述了;
b)主库SyncSend进程被唤醒,负责将流缓冲区中的待同步数据发送到备库中。发送完成后,进程进入等待;
c)备库SyncRecv进程接收到由主库发来的待同步的数据项,并放入备库中的回放流缓冲区。数据接收完成后,将发送“Received”指令给主库,代表备库数据接收完成;
d)备库SyncApply进程读取回放流缓冲区中的数据进行回放操作,为了防止数据被多次同步,有如下两种可选的实现方式,任选其一即可。
方式一:首先进行当前态数据的回放,先采用第1点中描述的回放方式进行回放。其中,执行REPLACE语句时,先检查当前待写入数据的位置是否存在主键,如果不存在就执行插入操作,如果存在则将该位置的数据其进行更新操作,也就是将待同步的数据写入该位置,并将该位置上的旧版本数据转为历史态数据进行存储。
当前态数据回放完成后,进行过渡态数据(转换后的历史态数据)、历史态数据进行回放,具体回放方式与第2点中描述的回放方式一致。
方式二:首先进行当前态数据的回放,先采用第1点描述的回放方式进行回放。其中,执行REPLACE语句时,先检查当前待写入数据的位置是否存在主键,如果不存在就执行插入操作,如果存在则将该位置的数据其进行更新操作,也就是将待同步的数据写入该位置。
当前态数据回放完成后,进行过渡态数据(转换后的历史态数据)、历史态数据的回放,具体回放方式与第1、2点中的回放方式相同,在此就不赘述了。
回放完成后,通知SyncRecv进程发送“Applied”指令给主库,代表备库回放完成;
e)根据预设的确认级别,主库SyncSend在收到备库相应的响应信息后,将LastSyncPtr位点更新为当前快照点,并转换为就绪状态,并通知SyncReport进程转换为就绪状态。在同步复制的情况下,还需通知事务管理器提交当前事务。
进一步,在本发明实施例中,还可以并行进行数据同步。
具体而言,SyncSend和SyncRecv进程均开启多个线程,从而并行的在主备库之间传输数据。
对于物理复制,SyncApply开启多个Worker线程,物理数据块将会分配到不同的Worker线程,从而并行的进行数据回放,加快数据同步的效率。
对于逻辑复制,可以在保证一致性的前提下,做到最优为元组级别的并行同步:
1)SyncReport进程在读取待同步的数据项,并将逻辑元组转化为DML语句时,为每个DML语句增加并行回放ID(PRID)标识和SEQ_NO序列标识,同一记录的多个版本将记录相同的PRID,并且SEQ_NO表明版本产生的先后顺序。不同记录可以复用同一个PRID。
2)SyncApply进程开启多个线程,并行地执行DML语句,进行并行回放。根据PRID数申请对应个数的线程,对于PRID相同的将在同一个线程内进行回放,在每个线程内按照SEQ_NO指定的顺序进行回放。
为提升效率,主库SyncReport和SyncSend进程可绑定在不同的CPU核上,备库的SyncRecv和SyncApply也进程可绑定在不同的CPU核上。
在本发明一种优选实施例中,若任一备库的数据同步失败,则数据同步失败的备库可以采用指定的数据同步指令重新进行数据同步,所述数据同步指令为SYNC_MANUALdb_name.[*/table_name]FULL/INCRE。
具体而言,db_name.[*/table_name]:db_name代表数据库名。*代表同步当前数据库中的全部表。可以用table_name指定数据库中某一张或某几张表进行同步。需要说明的是,这里指定的数据库表应该包含在和建立主备关系命令中指定的数据库表集合中。
关键词FULL代表对指定的数据库表的数据全部重新同步。关键词INCRE代表重新同步LastSyncPtr快照点到当前快照间产生的数据。同步模式、复制机制和确认级别与建立主备关系命令中所指定的一致。
SYNC_MANUAL语句执行后,系统将完全采用逻辑复制的方式进行数据同步,其主要流程如下:
1)如果指定FULL关键词,主库SyncReport进程需要先检查LastSyncPtr是否为系统初始快照点,如果不是,需要先将指定数据库表中的数据全部清空。如果指定为INCRE关键词,则跳过此步骤。
2)主库SyncReport进程根据当前快照和LastSyncPtr快照之差(INCRE关键词),或当前快照和系统初始快照之差(FULL关键词),根据全态数据得到快照差范围内产生的增量数据,并根据版本上记录的产生该版本的操作,重新拼出产生该版本的DML语句,因此在这里将包括INSERT/UPDATE/DELETE三类语句。
3)备库SyncApply进程在全态模式下的数据回放过程为:
a)INSERT语句,执行该语句,将对应元组的初始版本插入当前态存储空间中。
b)UPDATE语句,则根据主键找到当前态中的对应记录,将其更新为新版本。如果一条记录被多次更新,而有多条UPDATE语句,则按事务提交时间升序排列,逐条进行更新,来保证对每一条更新操作的重放都是正确的。同时,被更新的记录作为历史态存储进行存储。
c)DELETE语句,将当前态中的该条记录删除,并将删掉的记录作为历史态进行存储。
4)当前态模式,与全态模式下的数据回放过程相同,但是省去将被更新、被删除记录转为历史态存储的操作,只存储当前态数据。
5)历史态模式,与全态模式下的数据回放过程相同,最后将当前态数据删除,仅保留历史态数据即可。该模式下,不支持INCRE关键词,只支持FULL关键词。
在本发明实施例中,主库与各个备库进行数据同步之前,先进行元信息的同步,元信息同步完成后,当满足预设的数据同步条件时,主库就获取待同步的数据项,并依据数据项的状态类型,将数据项发送与状态类型相匹配的至少一个备库,以使得备库对待同步的数据项进行回放,完成数据同步,若任一备库的数据同步失败,则采用指定的数据同步指令重新进行数据同步。这样,主备库进行数据同步之前先进行元信息的同步,避免了主库与备库的表结构不同导致数据不一致的情况,保证了主备库中数据的一致性;同时,当任一备库与主库数据同步失败后,通过指定的数据同步指令仍然可以执行数据同步,提高了数据同步的稳定性。
同时,通过MVCC技术,将主备同步对系统性能的影响降到最低,在最小化额外的存储和通信开销的前提下,稳定且高效地支持全态数据的主备数据同步。
进一步,主备库可以分别开启多个进程,每个进程绑定在CPU的不同内核上,同时,每个进程又可以开启多个线程,从而实现多线程并行进行数据同步,提高了数据同步的效率。
在一个实施例中提供了一种数据同步的的方法,该方法应用于一主库与多备库之间,如图7所示,该方法包括:
步骤S701,当满足预设的数据同步条件时,主库获取待同步的数据项;
步骤S702,依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库;其中,所述状态类型包括当前态、历史态和全态,所述备库包括当前态备库、历史态备库和全态备库;
步骤S703,所述备库接收到待同步的数据项后,对所述待同步的数据项进行数据回放。
在本发明一种优选实施例中,所述主库设置有第一进程和第二进程;
当待同步的数据项为逻辑元组时,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
所述第一进程将逻辑元组转化为DML语句,并为每个DML语句增加并行回放ID标识和SEQ_NO序列标识,生成更新后的DML语句;其中,同一记录的多个版本将记录相同的回放ID标识,并且SEQ_NO表明版本产生的先后顺序;
将更新后的DML语句发送至预置的流缓冲区中;
所述第二进程采用多线程从所述流缓冲区中获取所述更新后的DML语句,并发送至状态类型相匹配的至少一个备库。
在本发明一种优选实施例中,所述备库设置有第三进程和第四进线程;
所述备库接收到待同步的数据项后,对所述待同步的数据项进行数据回放的步骤,包括:
所述第三进程采用多线程接收所述更新后的DML语句,并存储至回放缓冲区中;
所述第四进程从所述回放缓冲区中获取所述更新后的DML语句,并根据回放ID标识数申请对应个数的线程,对于回放ID标识相同的将在同一个线程内进行回放,在每个线程内按照SEQ_NO指定的顺序进行回放。
在本发明一种优选实施例中,当待同步的数据项为物理元组时,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
所述第一进程将所述物理元组发送至预置的流缓冲区中;
所述第二进程采用多线程从所述流缓冲区中获取所述物理元组,并发送至状态类型相匹配的至少一个备库。
在本发明一种优选实施例中,所述备库接收到待同步的数据项后,对所述待同步的数据项进行数据回放的步骤,包括:
所述第三进程采用多线程接收所述物理元组,并存储至回放缓冲区中;
所述第四进程从所述回放缓冲区中获取所述物理元组,并将所述物理元组分配至不同的线程进行数据回放。
在本发明一种优选实施例中,在所述当满足预设的数据同步条件时,主库获取待同步的数据项的步骤之前,所述方法还包括:
各个备库采用指定的建立通信指令与所述主库建立通信。
在本发明一种优选实施例中,所述系统还包括:
若任一备库的数据同步失败,则所述备库采用指定的数据同步指令重新进行数据同步。
在本发明一种优选实施例中,所述当满足预设的数据同步条件时,主库获取待同步的数据项的步骤,包括:
当主库接收到提交的事务时,确定所述事务结束后,被所述事务变更的第一数据项,并将所述第一数据项作为待同步的数据项;
或,
以预设的时间间隔,确定该预设的时间间隔内所述主库中所有发生更新的第二数据项,并将所述第二数据项作为待同步的数据项。
在本发明一种优选实施例中,所述当主库接收到提交的事务时,确定所述事务变更的第一数据项的步骤包括:
当所述主库接收到提交的事务时,获取所述事务变更的数据项;其中,所述事务变更的数据项包括当前态数据、历史态数据、过渡态数据中的至少一种;
对于当前态数据和历史数据,发生变更的数据项包括物理数据块和物理日志块;其中,当发生变更的数据项中发生变更的元组的比例超过预设阈值时,将发生变更的物理元组作为第一数据项;当发生变更的数据项中发生变更的元组的比例未超过预设阈值,将发生变更的逻辑元组作为第一数据项;
对于过渡态数据,将发生变更的逻辑元组作为第一数据项。
在本发明一种优选实施例中,所述以预设的时间间隔,确定所述主库中所有发生更新的第二数据项的步骤,包括:
获取常规快照和最后一次完成数据同步的快照点之间,发生更新的数据项;其中,所述发生更新的数据项包括当前态数据、历史态数据、过渡态数据中的至少一种;
对于当前态数据和历史数据,发生变更的数据项包括物理数据块和物理日志块;其中,当发生变更的数据项中发生变更的元组的比例超过预设阈值时,将发生变更的物理元组作为第二数据项;当发生变更的数据项中发生变更的元组的比例未超过预设阈值时,将发生变更的逻辑元组作为第二数据项;
对于过渡态数据,将发生变更的逻辑元组作为第二数据项。
在本发明一种优选实施例中,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库,包括以下任一情形:
若所述数据项的状态类型为当前态数据,则将所述当前态数据发送至当前态备库中,以使得所述当前态备库针对所述当前态数据进行数据同步;
若所述数据项的状态类型为全态数据,则将所述全态数据中的当前态数据分别发送至当前态备库和全态备库中,并将所述全态数据中的历史态数据分别发送至历史态备库和全态备库中,以使得所述当前态备库、所述历史态备库和所述全态备库分别针对对应的数据项进行数据同步。
在本发明一种优选实施例中,所述将所述全态数据中的历史态数据分别发送至历史态备库和全态备库中的步骤,包括:
对所述全态数据中的过渡态数据进行转换,得到转换后的历史态数据;
将所述历史态数据和所述转换后的历史态数据,发送至历史态备库和全态备库中。
在本发明一种优选实施例中,所述方法还包括:
当接收到所述当前态备库、历史态备库,以及全态备库中的任一备库返回的同步响应信息时,确定所述任一备库的数据同步完成。
在本发明一种优选实施例中,所述同步响应信息包括以下任一项:
确认回放;确认接收;确认发送。
在本发明一种优选实施例中,在所述当满足预设的数据同步条件时,主库获取待同步的数据项的步骤之前,还包括以下至少一种情形:
当任一备库与所述主库之间未进行过数据同步时,未进行过数据同步的备库与所述主库进行元信息同步;
当所述主库的元信息发生更新时,所述主库与各个备库分别进行元信息同步;
当任一备库的元信息与所述主库的元信息不一致时,与所述主库的元信息不一致的备库与所述主库进行元信息同步。
在本发明一种优选实施例中,所述主库设置有第一进程和第二进程,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
通过所述第一进程将所述待同步的数据项发送至预置的流缓冲区中;
依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库。
在本发明一种优选实施例中,所述依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
若所述数据项的状态类型为当前态,则通过所述第二进程将所述流缓冲区中的当前态数据发送至当前态备库。
在本发明一种优选实施例中,所述依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
若所述数据项的状态类型包括当前态和历史态,则通过所述第二进程将所述流缓冲区中的当前态数据,同时发送至当前态备库和全态备库,以及将所述流缓冲区中的历史态数据,同时发送至历史态备库和全态备库。
在本发明一种优选实施例中,所述依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
若所述数据项的状态类型包括当前态、历史态和转换后的历史态,则通过所述第二进程将所述流缓冲区中的当前态数据,同时发送至当前态备库和全态备库,以及将所述流缓冲区中的历史态数据、转换后的历史态数据,同时发送至历史态备库和全态备库。
在本发明实施例中,在本发明实施例中,主库与各个备库进行数据同步之前,先进行元信息的同步,元信息同步完成后,当满足预设的数据同步条件时,主库就获取待同步的数据项,并依据数据项的状态类型,将数据项发送与状态类型相匹配的至少一个备库,以使得备库对待同步的数据项进行回放,完成数据同步,若任一备库的数据同步失败,则采用指定的数据同步指令重新进行数据同步。这样,主备库进行数据同步之前先进行元信息的同步,避免了主库与备库的表结构不同导致数据不一致的情况,保证了主备库中数据的一致性;同时,当任一备库与主库数据同步失败后,通过指定的数据同步指令仍然可以执行数据同步,提高了数据同步的稳定性。
同时,通过MVCC技术,将主备同步对系统性能的影响降到最低,在最小化额外的存储和通信开销的前提下,稳定且高效地支持全态数据的主备数据同步。
进一步,主备库可以分别开启多个进程,每个进程绑定在CPU的不同内核上,同时,每个进程又可以开启多个线程,从而实现多线程并行进行数据同步,提高了数据同步的效率。
图8为本申请又一实施例提供的一种数据同步的装置的结构示意图,如图8-1所示,本实施例的装置可以包括:
获取模块801,用于当满足预设的数据同步条件时,主库获取待同步的数据项;
发送模块802,用于依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库,以使得所述备库针对所述数据项进行数据同步;其中,所述状态类型包括当前态、历史态和全态。
在本发明一种优选实施例中,所述获取模块包括:
第一确定子模块,用于当主库接收到提交的事务时,确定所述事务结束后,被所述事务变更的第一数据项,并将所述第一数据项作为待同步的数据项;
第二确定子模块,用于以预设的时间间隔,确定该预设的时间间隔内所述主库中所有发生更新的第二数据项,并将所述第二数据项作为待同步的数据项。
在本发明一种优选实施例中,所述第一确定子模块包括:
第一数据项确定单元,用于当所述主库接收到提交的事务时,获取所述事务变更的数据项;其中,所述事务变更的数据项包括处于全态中不同状态的数据;对于当前态数据和历史数据,发生变更的数据项包括当前态数据、历史态数据、过渡态数据中的至少一种;
第一判定单元,对于当前态数据和历史数据,发生变更的数据项包括物理数据块和物理日志块;其中,当发生变更的数据项中发生变更的元组的比例超过预设阈值时,所述第一判定单元用于将发生变更的物理元组作为第一数据项;当发生变更的数据项中发生变更的元组的比例未超过预设阈值,所述第一判定单元用于将发生变更的逻辑元组作为第一数据项;
对于过渡态数据,所述第一判定单元用于将发生变更的逻辑元组作为第一数据项。
在本发明一种优选实施例中,所述第二确定子模块包括:
第二数据项确定单元,用于获取常规快照和最后一次完成数据同步的快照点之间,发生更新的数据项;其中,所述发生更新的数据项包括处于全态中不同状态的数据;对于当前态数据和历史数据,发生变更的数据项包括当前态数据、历史态数据、过渡态数据中的至少一种;
第二判定单元,对于当前态数据和历史数据,发生变更的数据项包括物理数据块和物理日志块;其中,当发生变更的数据项中发生变更的元组的比例超过预设阈值时,所述第二判定单元用于将发生变更的物理元组作为第二数据项;当发生变更的数据项中发生变更的元组的比例未超过预设阈值时,所述第二判定单元用于将发生变更的逻辑元组作为第二数据项;
对于过渡态数据,所述第二判定单元用于将发生变更的逻辑元组作为第二数据项。
在本发明一种优选实施例中,所述发送模块具体用于执行以下任一情形:
若所述数据项的状态类型为当前态数据,则将所述当前态数据发送至当前态备库中,以使得所述当前态备库针对所述当前态数据进行数据同步;
若所述数据项的状态类型为全态数据,则将所述全态数据中的当前态数据分别发送至当前态备库和全态备库中,并将所述全态数据中的历史态数据分别发送至历史态备库和全态备库中,以使得所述当前态备库、所述历史态备库和所述全态备库分别针对对应的数据项进行数据同步。
在本发明一种优选实施例中,所述发送模块包括:
转换子模块,用于对所述全态数据中的过渡态数据进行转换,得到转换后的历史态数据;
发送子模块,用于将所述历史态数据和所述转换后的历史态数据,发送至历史态备库和全态备库中。
在本发明一种优选实施例中,如图8-2所示,所述装置还包括:
接收模块803,用于当接收到所述当前态备库、历史态备库,以及全态备库中的任一备库返回的同步响应信息时,确定所述任一备库的数据同步完成。
在本发明一种优选实施例中,所述同步响应信息包括以下任一项:
确认回放;确认接收;确认发送。
在本发明一种优选实施例中,所述装置还包括:元信息同步模块,用于执行以下至少一种情形:
当任一备库与所述主库之间未进行过数据同步时,未进行过数据同步的备库与所述主库进行元信息同步;
当所述主库的元信息发生更新时,所述主库与各个备库分别进行元信息同步;
当任一备库的元信息与所述主库的元信息不一致时,与所述主库的元信息不一致的备库与所述主库进行元信息同步。
在本发明一种优选实施例中,所述主库设置有第一进程和第二进程,所述发送模块包括:
第一进程启动子模块,用于启动所述第一进程,并通过所述第一进程将所述待同步的数据项发送至预置的流缓冲区中;
第二进程启动子模块,用于依据所述数据项的状态类型,启动所述第二进程,并通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库。
在本发明一种优选实施例中,所述第二进程启动子模块具体用于:若所述数据项的状态类型为当前态,则通过所述第二进程将所述流缓冲区中的当前态数据发送至当前态备库。
在本发明一种优选实施例中,所述第二进程启动子模块具体用于:若所述数据项的状态类型包括当前态和历史态,则通过所述第二进程将所述流缓冲区中的当前态数据,同时发送至当前态备库和全态备库,以及将所述流缓冲区中的历史态数据,同时发送至历史态备库和全态备库。
在本发明一种优选实施例中,所述第二进程启动子模块具体用于:若所述数据项的状态类型包括当前态、历史态和转换后的历史态,则通过所述第二进程将所述流缓冲区中的当前态数据,同时发送至当前态备库和全态备库,以及将所述流缓冲区中的历史态数据、转换后的历史态数据,同时发送至历史态备库和全态备库。
本实施例的数据同步的装置可执行本申请第一个实施例所示的数据同步的方法,其实现原理相类似,此处不再赘述。
本申请的又一实施例中提供了一种服务器,该服务器包括:存储器和处理器;至少一个程序,存储于存储器中,用于被处理器执行时,与现有技术相比可实现:本发明实施例可以将主库中的待存储的数据按照其状态类型存储至对应的备库,从而完成一主库与多备库的数据同步,保证对各种状态类型的数据均进行存储,不会造成数据的浪费,从而充分利用了数据整个生命周期的价值。
进一步,因为将当前态数据、历史态数据、全态数据分别进行存储,所以,在针对只需要访问当前态数据,或者历史态数据,或者全态数据的业务需求时,可以有针对性的提供业务支持,提高了访问效率。
在一个可选实施例中提供了一种服务器,如图9所示,图9所示的服务器9000包括:处理器9001和存储器9003。其中,处理器9001和存储器9003相连,如通过总线9002相连。可选地,服务器9000还可以包括收发器9004。需要说明的是,实际应用中收发器9004不限于一个,该服务器9000的结构并不构成对本申请实施例的限定。
处理器9001可以是CPU,通用处理器,DSP,ASIC,FPGA或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本申请公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器9001也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,DSP和微处理器的组合等。
总线9002可包括一通路,在上述组件之间传送信息。总线9002可以是PCI总线或EISA总线等。总线9002可以分为地址总线、数据总线、控制总线等。为便于表示,图9中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
存储器9003可以是ROM或可存储静态信息和指令的其他类型的静态存储设备,RAM或者可存储信息和指令的其他类型的动态存储设备,也可以是EEPROM、CD-ROM或其他光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质或者其他磁存储设备、或者能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。
存储器9003用于存储执行本申请方案的应用程序代码,并由处理器9001来控制执行。处理器9001用于执行存储器9003中存储的应用程序代码,以实现前述任一方法实施例所示的内容。
本发明实施例还提供了一种计算机可读存储介质,该计算机可读存储介质应用于服务器,该计算机可读存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,该指令、该程序、该代码集或该指令集由处理器加载并执行以实现上述实施例的数据同步的方法中服务器所执行的操作。
应该理解的是,虽然附图的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,其可以以其他的顺序执行。而且,附图的流程图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,其执行顺序也不必然是依次进行,而是可以与其他步骤或者其他步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (23)
1.一种数据同步的方法,其特征在于,包括:
当满足预设的数据同步条件时,主库获取待同步的数据项;
依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库,以使得所述备库针对所述数据项进行数据同步;其中,所述状态类型包括当前态、历史态和全态。
2.根据权利要求1所述的数据同步的方法,其特征在于,所述当满足预设的数据同步条件时,主库获取待同步的数据项的步骤,包括:
当主库接收到提交的事务时,确定所述事务结束后,被所述事务变更的第一数据项,并将所述第一数据项作为待同步的数据项;
或,
以预设的时间间隔,确定该预设的时间间隔内所述主库中所有发生更新的第二数据项,并将所述第二数据项作为待同步的数据项。
3.根据权利要求2所述的数据同步的方法,其特征在于,所述当主库接收到提交的事务时,确定所述事务变更的第一数据项的步骤包括:
当所述主库接收到提交的事务时,获取所述事务变更的数据项;其中,所述事务变更的数据项包括当前态数据、历史态数据、过渡态数据中的至少一种;
对于当前态数据和历史数据,发生变更的数据项包括物理数据块和物理日志块;其中,当发生变更的数据项中发生变更的元组的比例超过预设阈值时,将发生变更的物理元组作为第一数据项;当发生变更的数据项中发生变更的元组的比例未超过预设阈值,将发生变更的逻辑元组作为第一数据项;
对于过渡态数据,将发生变更的逻辑元组作为第一数据项。
4.根据权利要求2所述的数据同步的方法,其特征在于,所述以预设的时间间隔,确定所述主库中所有发生更新的第二数据项的步骤,包括:
获取常规快照和最后一次完成数据同步的快照点之间,发生更新的数据项;其中,所述发生更新的数据项包括当前态数据、历史态数据、过渡态数据中的至少一种;
对于当前态数据和历史数据,发生变更的数据项包括物理数据块和物理日志块;其中,当发生变更的数据项中发生变更的元组的比例超过预设阈值时,将发生变更的物理元组作为第二数据项;当发生变更的数据项中发生变更的元组的比例未超过预设阈值时,将发生变更的逻辑元组作为第二数据项;
对于过渡态数据,将发生变更的逻辑元组作为第二数据项。
5.根据权利要求1所述的数据同步的方法,其特征在于,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库,包括以下任一情形:
若所述数据项的状态类型为当前态数据,则将所述当前态数据发送至当前态备库中,以使得所述当前态备库针对所述当前态数据进行数据同步;
若所述数据项的状态类型为全态数据,则将所述全态数据中的当前态数据分别发送至当前态备库和全态备库中,并将所述全态数据中的历史态数据分别发送至历史态备库和全态备库中,以使得所述当前态备库、所述历史态备库和所述全态备库分别针对对应的数据项进行数据同步。
6.根据权利要求5所述的数据同步的方法,其特征在于,所述将所述全态数据中的历史态数据分别发送至历史态备库和全态备库中的步骤,包括:
对所述全态数据中的过渡态数据进行转换,得到转换后的历史态数据;
将所述历史态数据和所述转换后的历史态数据,发送至历史态备库和全态备库中。
7.根据权利要求5所述的数据同步的方法,其特征在于,所述方法还包括:
当接收到所述当前态备库、历史态备库,以及全态备库中的任一备库返回的同步响应信息时,确定所述任一备库的数据同步完成。
8.根据权利要求7所述的数据同步的方法,其特征在于,所述同步响应信息包括以下任一项:
确认回放;确认接收;确认发送。
9.根据权利要求1所述的数据同步的方法,其特征在于,在所述当满足预设的数据同步条件时,主库获取待同步的数据项的步骤之前,还包括以下至少一种情形:
当任一备库与所述主库之间未进行过数据同步时,未进行过数据同步的备库与所述主库进行元信息同步;
当所述主库的元信息发生更新时,所述主库与各个备库分别进行元信息同步;
当任一备库的元信息与所述主库的元信息不一致时,与所述主库的元信息不一致的备库与所述主库进行元信息同步。
10.根据权利要求1或6所述的数据同步的方法,其特征在于,所述主库设置有第一进程和第二进程,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
通过所述第一进程将所述待同步的数据项发送至预置的流缓冲区中;
依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库。
11.根据权利要求10所述数据同步的方法,其特征在于,所述依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
若所述数据项的状态类型为当前态,则通过所述第二进程将所述流缓冲区中的当前态数据发送至当前态备库。
12.根据权利要求10所述数据同步的方法,其特征在于,所述依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
若所述数据项的状态类型包括当前态和历史态,则通过所述第二进程将所述流缓冲区中的当前态数据,同时发送至当前态备库和全态备库,以及将所述流缓冲区中的历史态数据,同时发送至历史态备库和全态备库。
13.根据权利要求10所述数据同步的方法,其特征在于,所述依据所述数据项的状态类型,通过所述第二进程将所述流缓冲区的所述待同步的数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
若所述数据项的状态类型包括当前态、历史态和转换后的历史态,则通过所述第二进程将所述流缓冲区中的当前态数据,同时发送至当前态备库和全态备库,以及将所述流缓冲区中的历史态数据、转换后的历史态数据,同时发送至历史态备库和全态备库。
14.一种数据同步的方法,其特征在于,包括:
当满足预设的数据同步条件时,主库获取待同步的数据项;
依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库;其中,所述状态类型包括当前态、历史态和全态,所述备库包括当前态备库、历史态备库和全态备库;
所述备库接收到待同步的数据项后,对所述待同步的数据项进行数据回放。
15.根据权利要求14所述的数据同步的方法,其特征在于,所述主库设置有第一进程和第二进程;
当待同步的数据项为逻辑元组时,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
所述第一进程将逻辑元组转化为DML语句,并为每个DML语句增加并行回放ID标识和SEQ_NO序列标识,生成更新后的DML语句;其中,同一记录的多个版本将记录相同的回放ID标识,并且SEQ_NO表明版本产生的先后顺序;
将更新后的DML语句发送至预置的流缓冲区中;
所述第二进程采用多线程从所述流缓冲区中获取所述更新后的DML语句,并发送至状态类型相匹配的至少一个备库。
16.根据权利要求15所述的数据同步的方法,其特征在于,所述备库设置有第三进程和第四进线程;
所述备库接收到待同步的数据项后,对所述待同步的数据项进行数据回放的步骤,包括:
所述第三进程采用多线程接收所述更新后的DML语句,并存储至回放缓冲区中;
所述第四进程从所述回放缓冲区中获取所述更新后的DML语句,并根据回放ID标识数申请对应个数的线程,对于回放ID标识相同的将在同一个线程内进行回放,在每个线程内按照SEQ_NO指定的顺序进行回放。
17.根据权利要求15所述的数据同步的方法,其特征在于,当待同步的数据项为物理元组时,所述依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库的步骤,包括:
所述第一进程将所述物理元组发送至预置的流缓冲区中;
所述第二进程采用多线程从所述流缓冲区中获取所述物理元组,并发送至状态类型相匹配的至少一个备库。
18.根据权利要求16或17所述的数据同步的方法,其特征在于,所述备库接收到待同步的数据项后,对所述待同步的数据项进行数据回放的步骤,包括:
所述第三进程采用多线程接收所述物理元组,并存储至回放缓冲区中;
所述第四进程从所述回放缓冲区中获取所述物理元组,并将所述物理元组分配至不同的线程进行数据回放。
19.根据权利要求14所述的数据同步的方法,其特征在于,在所述当满足预设的数据同步条件时,主库获取待同步的数据项的步骤之前,所述方法还包括:
各个备库采用指定的建立通信指令与所述主库建立通信。
20.根据权利要求14所述的数据同步的方法,其特征在于,所述系统还包括:
若任一备库的数据同步失败,则所述备库采用指定的数据同步指令重新进行数据同步。
21.一种数据同步的装置,其特征在于,包括:
获取模块,用于当满足预设的数据同步条件时,主库获取待同步的数据项;
发送模块,用于依据所述数据项的状态类型,将所述数据项发送与状态类型相匹配的至少一个备库,以使得所述备库针对所述数据项进行数据同步;其中,所述状态类型包括当前态、历史态和全态。
22.一种服务器,其特征在于,所述服务器包括:处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述指令、所述程序、所述代码集或所述指令集由所述处理器加载并执行以实现如权利要求1至13任一权利要求所述的数据同步的方法中所执行的操作。
23.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述指令、所述程序、所述代码集或所述指令集由处理器加载并执行以实现如权利要求1至13任一权利要求所述的数据同步的方法中所执行的操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910301461.5A CN109992628B (zh) | 2019-04-15 | 2019-04-15 | 数据同步的方法、装置、服务器及计算机可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910301461.5A CN109992628B (zh) | 2019-04-15 | 2019-04-15 | 数据同步的方法、装置、服务器及计算机可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109992628A true CN109992628A (zh) | 2019-07-09 |
CN109992628B CN109992628B (zh) | 2022-10-25 |
Family
ID=67133671
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910301461.5A Active CN109992628B (zh) | 2019-04-15 | 2019-04-15 | 数据同步的方法、装置、服务器及计算机可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109992628B (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110765207A (zh) * | 2019-10-21 | 2020-02-07 | 福建博思软件股份有限公司 | 系统间数据同步的方法 |
CN110909075A (zh) * | 2019-10-30 | 2020-03-24 | 北京达佳互联信息技术有限公司 | 数据的同步方法、装置、电子设备及存储介质 |
WO2020224374A1 (zh) * | 2019-05-05 | 2020-11-12 | 腾讯科技(深圳)有限公司 | 数据复制方法、装置、计算机设备及存储介质 |
CN112486735A (zh) * | 2020-12-21 | 2021-03-12 | 上海英方软件股份有限公司 | 一种保障应用层数据一致性的数据复制系统及方法 |
CN112711596A (zh) * | 2019-10-24 | 2021-04-27 | 阿里巴巴集团控股有限公司 | 多副本数据库系统、数据处理方法、电子设备以及计算机可读存储介质 |
CN112948342A (zh) * | 2021-02-25 | 2021-06-11 | 杭州沃趣科技股份有限公司 | 一种基于日志解析系统的数据处理方法 |
CN113051265A (zh) * | 2019-12-27 | 2021-06-29 | 中信百信银行股份有限公司 | 一种降低关系型数据库表结构变更所带来损耗的方法、装置、计算机设备、和可读存储介质 |
CN113987078A (zh) * | 2021-12-24 | 2022-01-28 | 中兴通讯股份有限公司 | 数据同步方法、设备及计算机可读存储介质 |
CN112817989B (zh) * | 2021-01-22 | 2023-07-25 | 网易(杭州)网络有限公司 | 数据处理方法、数据处理装置、存储介质及电子设备 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1977265A (zh) * | 2004-07-01 | 2007-06-06 | 苹果电脑有限公司 | 基于状态的同步 |
CN101969231A (zh) * | 2010-10-29 | 2011-02-09 | 国电南瑞科技股份有限公司 | 电力调度自动化系统分布式应用恢复并列后数据同步方法 |
CN109189652A (zh) * | 2018-06-26 | 2019-01-11 | 中国科学院信息工程研究所 | 一种封闭网络终端行为数据的采集方法及系统 |
-
2019
- 2019-04-15 CN CN201910301461.5A patent/CN109992628B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1977265A (zh) * | 2004-07-01 | 2007-06-06 | 苹果电脑有限公司 | 基于状态的同步 |
CN101969231A (zh) * | 2010-10-29 | 2011-02-09 | 国电南瑞科技股份有限公司 | 电力调度自动化系统分布式应用恢复并列后数据同步方法 |
CN109189652A (zh) * | 2018-06-26 | 2019-01-11 | 中国科学院信息工程研究所 | 一种封闭网络终端行为数据的采集方法及系统 |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2020224374A1 (zh) * | 2019-05-05 | 2020-11-12 | 腾讯科技(深圳)有限公司 | 数据复制方法、装置、计算机设备及存储介质 |
US11921746B2 (en) | 2019-05-05 | 2024-03-05 | Tencent Technology (Shenzhen) Company Limited | Data replication method and apparatus, computer device, and storage medium |
CN110765207A (zh) * | 2019-10-21 | 2020-02-07 | 福建博思软件股份有限公司 | 系统间数据同步的方法 |
CN110765207B (zh) * | 2019-10-21 | 2022-12-09 | 福建博思软件股份有限公司 | 系统间数据同步的方法 |
CN112711596A (zh) * | 2019-10-24 | 2021-04-27 | 阿里巴巴集团控股有限公司 | 多副本数据库系统、数据处理方法、电子设备以及计算机可读存储介质 |
CN112711596B (zh) * | 2019-10-24 | 2023-10-27 | 阿里云计算有限公司 | 多副本数据库系统、数据处理方法、电子设备以及计算机可读存储介质 |
CN110909075B (zh) * | 2019-10-30 | 2022-08-09 | 北京达佳互联信息技术有限公司 | 数据的同步方法、装置、电子设备及存储介质 |
CN110909075A (zh) * | 2019-10-30 | 2020-03-24 | 北京达佳互联信息技术有限公司 | 数据的同步方法、装置、电子设备及存储介质 |
CN113051265A (zh) * | 2019-12-27 | 2021-06-29 | 中信百信银行股份有限公司 | 一种降低关系型数据库表结构变更所带来损耗的方法、装置、计算机设备、和可读存储介质 |
CN112486735A (zh) * | 2020-12-21 | 2021-03-12 | 上海英方软件股份有限公司 | 一种保障应用层数据一致性的数据复制系统及方法 |
CN112817989B (zh) * | 2021-01-22 | 2023-07-25 | 网易(杭州)网络有限公司 | 数据处理方法、数据处理装置、存储介质及电子设备 |
CN112948342A (zh) * | 2021-02-25 | 2021-06-11 | 杭州沃趣科技股份有限公司 | 一种基于日志解析系统的数据处理方法 |
CN113987078B (zh) * | 2021-12-24 | 2022-04-19 | 中兴通讯股份有限公司 | 数据同步方法、设备及计算机可读存储介质 |
CN113987078A (zh) * | 2021-12-24 | 2022-01-28 | 中兴通讯股份有限公司 | 数据同步方法、设备及计算机可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN109992628B (zh) | 2022-10-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109992628A (zh) | 数据同步的方法、装置、服务器及计算机可读存储介质 | |
CN110209726A (zh) | 分布式数据库集群系统、数据同步方法及存储介质 | |
US6643671B2 (en) | System and method for synchronizing a data copy using an accumulation remote copy trio consistency group | |
US6934877B2 (en) | Data backup/recovery system | |
US6983295B1 (en) | System and method for database recovery using a mirrored snapshot of an online database | |
EP2429134B1 (en) | Method and apparatus for checking and synchronizing data block in distributed file system | |
US20050273474A1 (en) | Method and system for data processing with data replication for the same | |
CN113396407A (zh) | 用于利用区块链技术扩充数据库应用的系统和方法 | |
US8572037B2 (en) | Database server, replication server and method for replicating data of a database server by at least one replication server | |
CN105574187B (zh) | 一种异构数据库复制事务一致性保障方法及系统 | |
CN100371900C (zh) | 数据同步的方法和系统 | |
CN104881418B (zh) | 用于MySQL的快速回收回滚空间的方法和装置 | |
WO2007110931A1 (ja) | 名前空間複製プログラム、名前空間複製装置、名前空間複製方法 | |
JP2003248606A (ja) | 記憶装置を応用したコピー管理の方法と装置 | |
CN103198159A (zh) | 一种基于事务重做的异构集群多副本一致性维护方法 | |
JP2006268829A (ja) | ストレージシステム間でオブジェクトをミラー化する方法と装置 | |
JP7220807B2 (ja) | データ読み取り方法、装置、コンピュータ装置及びコンピュータプログラム | |
EP4170509A1 (en) | Method for playing back log on data node, data node, and system | |
US8799216B1 (en) | Mirror resynchronization of bulk load and append-only tables during online transactions for better repair time to high availability in databases | |
JP5331892B2 (ja) | ストレージシステム及びストレージシステムにおけるデータ複製方法 | |
CN113391885A (zh) | 一种分布式事务处理系统 | |
US20230315713A1 (en) | Operation request processing method, apparatus, device, readable storage medium, and system | |
JP2003223350A (ja) | データベースシステム | |
CN113905054B (zh) | 基于RDMA的Kudu集群数据同步方法、装置、系统 | |
US8918364B1 (en) | Online mirror state transitioning in databases |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |