实现实时关系型数据库数据同步的方法

文档序号:7640 发布日期:2021-09-17 浏览:29次 英文

实现实时关系型数据库数据同步的方法

技术领域

本发明属于数据存储

技术领域

,具体涉及一种实现实时关系型数据库数据同步的方法。

背景技术

读写分离是一种常见的解决关系型数据库性能的技术。如图1所示,需要读写的应用访问主库,只需要读数据的应用访问从库。主库、从库之间通过数据复制进行数据上的同步,保证主从库数据一致。此处数据同步是读写分离的关键技术。

目前,业界常用的方式是通过关系型数据库的日志机制,将主库的数据库日志发送到从库,在从库中回放执行实现。这个方法存在以下几个缺点:

1、日志同步需要数据库底层支持,对于商用数据库往往需要商用软件支持,需要增加成本。

2、通常要求主从库表结构一致。

3、通常要求从库严格只读。

4、通常单线程同步,同步性能受限。

发明内容

本发明是为了解决上述问题而进行的,目的在于提供一种可支持所有关系型数据库、主从表结构可以不一致、从库可以不是严格的只读库、可多线程处理、可双向同步且容错性高的实现实时关系型数据库数据同步的方法。

本发明提供了一种实现实时关系型数据库数据同步的方法,其特征在于,包括以下步骤:

同步过程:对主库数据进行增删改操作时,Java应用层抓取对主库进行增删改的操作,对主库执行所述增删改操作,并异步发送所述增删改的操作到消息队列,同步进程到从库中,所述从库执行所述增删改的操作;

补偿进程:设定定时检查时间,定时检查,若发现有超过预定时间还未能同步到所述从库的增删改操作,则重新将未同步到从库的数据的增删改操作同步到从库中直至从库中数据更新完成。

进一步,在本发明提供的实现实时关系型数据库数据同步的方法中,还可以具有这样的特征:抓取主库更新的数据时是Java应用程序通过ORM层插件抓取。

进一步,在本发明提供的实现实时关系型数据库数据同步的方法中,还可以具有这样的特征:所述消息队列为Kafka。

进一步,在本发明提供的实现实时关系型数据库数据同步的方法中,还可以具有这样的特征:当Java应用层抓取到对主库进行增删改的操作后,将抓取到的增删改操作的同步状态修改为“待同步”/“待删除”,所述从库执行所述增删改的操作并同步完成后返回同步结果,同步结果包括“已同步”/“同步失败”/“删除失败”,根据同步结果更新同步状态,

当Java应用层抓取到对主库进行增删改的操作后,同时将系统当前时间添加到抓取的增删改的操作中作为最后修改时间。

进一步,在本发明提供的实现实时关系型数据库数据同步的方法中,还可以具有这样的特征:当需要同步到多个从库时,将同步状态的字段改为变长字段,其中所述变长字段中每一位代表一个从库的更新状态。

进一步,在本发明提供的实现实时关系型数据库数据同步的方法中,还可以具有这样的特征:所述补偿进程发现有未能同步到所述从库的增删改操作是通过同步状态、最后修改时间和当前时间确定的。

进一步,在本发明提供的实现实时关系型数据库数据同步的方法中,还可以具有这样的特征:当对从库进行更新操作时,更新的数据的时间要晚于从库中对应数据的时间,否则,将该条更新数据抛弃;在更新从库数据时,若从库中不存在对应的记录,则将更新操作转换为插入操作对从库中增加该条记录。

进一步,在本发明提供的实现实时关系型数据库数据同步的方法中,还可以具有这样的特征:若Java应用层抓取对主库进行增删改的操作是删除操作,则对主库执行的删除操作改为更新操作,并更新同步状态为“待删除”,在同步进程将该删除操作在从库中执行完成后,再对主库进行删除操作,否则更新同步状态为“删除失败”。

进一步,在本发明提供的实现实时关系型数据库数据同步的方法中,还可以具有这样的特征:若对主库进行的增删改操作不是通过Java应用层抓取的对主库进行增删改的操作进行的,则在对主库进行的增删改操作中增加同步状态和执行增删改操作的时间。

进一步,在本发明提供的实现实时关系型数据库数据同步的方法中,还可以具有这样的特征:该方法还包括异常监控进程查询步骤,当从库中执行增删改操作产生错误时,更新同步状态为“同步失败”,异常监控进程查询主库,如果存在同步失败的数据则报警,排除异常后,由补偿进程对从库进行再次同步,使从库中完成数据同步。

本发明的优点如下:

1、通过Java应用层实现,与具体数据库类型无关,可支持所有关系型数据库。

2、主从表结构可以不一致,可以实现只同步部分字段。

3、从库可以不是严格的只读库,比如某些字段可以不同步在从库上。

4、同步进程、补偿进程均可以多线程处理。

5、可以增加更灵活的业务级别的额外处理,例如:数据过滤(同步过程中过滤某些行);数据映射(同步过程中进行某些数据映射转换);数据校验清洗;分表同步(将主库大表按某种规则进行从库的表拆分)等等。

6、可以实现双向同步。

7、容错性高:无论消息队列或同步进程产生故障,恢复后可通过补偿进程自动继续同步,保证最终数据一致。

附图说明

图1是现有技术中关系型数据库数据同步的方法。

图2是本发明中同步过程的流程图。

图3是本发明中补偿过程的流程图。

具体实施方式

为了使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,以下实施例结合附图对本发明的实现实时关系型数据库数据同步的方法作具体阐述。

实现实时关系型数据库数据同步的方法包括以下步骤:

如图2所示,同步过程:对主库数据进行增删改操作时,Java应用层抓取对主库进行增删改的操作,即SQL(INSERT/UPDATE/DELETE),对主库执行该增删改操作,并异步发送该增删改的操作到消息队列,同步进程到从库中,所述从库执行该增删改的操作。

在本实施例中,抓取主库更新的数据时是Java应用程序通过ORM层插件抓取的。以JPA为例:增加事件监听PostInsertEventListener/PostUpdateEventListener/PostDeleteEventListen er,抓取对主库进行增删改的操作命令。消息队列为Kafka。

如图3所示,补偿进程:设定定时检查时间,定时检查,若发现有超过预定时间(例如1分钟)还未能同步到所述从库的增删改操作,则重新将未同步数据的增删改操作同步到从库中直至从库中更新完成。补偿进程用于防止同步过程中产生消息丢失、消息队列故障,导致部分数据无法同步到从库。通过补偿进程能够保证将这些数据最终都同步到从库。

在本实施例中,当Java应用层抓取到对主库进行增删改的操作后,将抓取到的增删改操作的同步状态修改为“待同步”/“待删除”,所述从库执行所述增删改的操作并同步完成后返回同步结果,同步结果包括“已同步”/“同步失败”/“删除失败”,根据同步结果更新同步状态,更新后的同步状态为“已同步”/“同步失败”/“删除失败”。

当Java应用层抓取到对主库进行增删改的操作后,同时将系统当前时间添加到抓取的增删改的操作中作为最后修改时间。添加系统时间到增删改的操作中的作用有两个:1、用于补偿过程判断长时间未能同步的数据。2、用于防止同步时顺序错乱。

当对从库进行更新操作时,本专利中,更新操作为SQL中的UPDATE,即增删改操作中的改。更新的数据的时间要晚于从库中对应数据的时间,否则,将该条更新数据抛弃;在更新从库数据时,若从库中不存在对应的记录,则将更新操作转换为插入操作对从库中增加该条记录。用于解决消息重复、顺序错乱的问题。

在本实施例中,补偿进程发现有未能同步到从库的增删改操作是通过同步状态、最后修改时间和当前时间确定的。同步状态为“待同步”/“待删除”且最后修改时间和当前时间大于预定的同步超时时间,则判断为未能同步到从库的增删改操作。

在本实施例中,当需要同步到多个从库时,将同步状态的字段改为变长字段,其中变长字段中每一位代表一个从库的更新状态。

在本实施例中,若Java应用层抓取对主库进行增删改的操作是删除操作,则对主库执行的删除操作改为更新操作,并更新同步状态为“待删除”,在同步进程将该删除操作在从库中执行完成后,再对主库进行删除操作,否则更新同步状态为“删除失败”。

在本实施例中,若对主库进行的增删改操作不是通过Java应用层抓取的对主库进行增删改的操作进行的,有些场合可能直接通过最初发出的增删改操作的命令执行的,则在对主库进行的增删改操作中增加同步状态和执行增删改操作的时间。

在本实施例中,实现实时关系型数据库数据同步的方法还包括异常监控进程查询步骤,当从库中执行增删改操作产生错误时,更新同步状态为“同步失败”,异常监控进程查询主库,如果存在同步失败的数据则报警,排除异常后,由补偿进程对从库进行再次同步,使从库中完成数据同步。具体的,在异常排除后将同步状态从“同步失败”更新为“待同步”,由补偿进程对从库进行再次同步。

上述实施方式为本发明的优选案例,并不用来限制本发明的保护范围。

完整详细技术资料下载
上一篇:石墨接头机器人自动装卡簧、装栓机
下一篇:数据处理方法、装置、系统及存储介质

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!