掌桥专利:专业的专利平台
掌桥专利
首页

一种数据同步方法及装置

文献发布时间:2023-06-19 11:57:35


一种数据同步方法及装置

技术领域

本申请实施例涉及金融科技(Fintech)领域,尤其涉及一种数据同步方法及装置。

背景技术

随着计算机技术的发展,越来越多的技术(例如:大数据、云计算或区块链)应用在金融领域,传统金融业正在逐步向金融科技转变。在大数据技术的背景下,常常需要用数据库对应用产生的各种数据进行存储。

目前,对于将数据存储于MySQL数据库的场景,由于MySQL数据库是单机数据库,即只能由一台物理服务器来存放数据,而一台物理服务器的硬盘容量是有上限的,比如常见的物理服务器一般容量为3T,在互联网、金融等行业,随着客户数量的暴增,单机数据库的容量将会出现瓶颈,即无法存放下海量数据。

对此,可以在单机数据库遇到容量瓶颈后,把其中的数据表按照一定的规则拆成多个同构数据表(即数据表结构相同),存放在多个单机数据库上。但该方式对应用有很多限制,比如无法做跨数据库的join操作,需要涉及到分布式事务的改造。

由于分布式数据库的容量具有水平无限扩展的特性,即容量不再会有瓶颈,因此可以将拆分得到的同构数据表通过同步组件汇总、同步到一个分布式数据库中。应用在切换到分布式数据库后,对于应用来说,可以把分布式数据库当做一个容量无限的单机数据库,不再有其他限制,对应用很友好。

例如,在对金融场景下的客户号进行存储时,一般是根据客户号取模,把海量的客户号数据拆分、存储到多个单机数据库中,即上游的多个单机数据库一般设置有同构数据表,用于对同一研究对象(如客户号)具有的数据进行存储。在对上游的多个单机数据库中的同构数据表做表结构变更时,为了最小化对业务的影响,会采用灰度变更的方式进行,即先对某一个或某几个上游的单机数据库进行表结构变更,观察几天确认无异常后,才会对剩余的上游的单机数据库进行全量地表结构变更。

但是,上述灰度变更的方式,会导致已经进行表结构变更的上游的单机数据库的表结构更与其他上游的单机数据库和下游的分布式数据库的表结构不一致。由于表结构不一致会导致数据同步中断,因此目前传统的做法是暂停已经进行表结构变更的上游的单机数据库的数据同步,等到其他上游的单机数据库也全量地完成了表结构变更后,才会恢复数据同步,并且通知下游的分布式数据库也执行此次的表结构变更。

上述灰度变更的场景中,在对其他上游的单机数据库进行表结构变更之前,由于需要暂停上游的已经进行过表结构变更的单机数据库的数据同步,这显然会降低数据同步的效率。

综上,目前亟需一种提升灰度变更场景中的数据同步效率的方法。

发明内容

本申请提供一种数据同步方法及装置,用以提升灰度变更场景中的数据同步效率。

第一方面,本申请实施例提供一种数据同步方法,适用于至少一个单机数据库通过各自的同步组件将数据同步至分布式数据库;该方法包括:第一同步组件获取第一单机数据库中第一数据表与所述分布式数据库中第二数据表之间的表结构映射关系;所述第一同步组件根据所述表结构映射关系,对所述第一单机数据库的第一日志文件中的第一记录信息进行修改,得到第二记录信息;所述第一记录信息中记录有所述第一数据表中待同步至所述第二数据表中的数据对象;所述第一同步组件根据所述第二记录信息,将所述数据对象同步至所述第二数据表中。

基于该方案,灰度变更场景下,在已经进行过表结构变更的单机数据库通过自己的同步组件更新了分布式数据库的第二数据表的表结构后,还未进行表结构变更的单机数据库(即第一单机数据库)通过自己的同步组件(即第一同步组件)可获取到自己本地的第一数据表与第二数据表之间的表结构映射关系,然后第一同步组件可根据该表结构映射关系,对第一日志文件中的第一记录信息进行修改,并形成第二记录信息,最终可使得第一同步组件基于第二记录信息,而将第一单机数据库中的第一数据表在分布式数据库中的表结构进行变更。该方式实现了灰度变更场景下无需暂停已经进行过表结构变更的单机数据库的数据同步行为,而是可以在已经进行过表结构变更的单机数据库的数据同步过程中,同期实现还未进行过表结构变更的单机数据库在分布式数据库中的数据表结构的变更操作,一方面提升了灰度变更场景下的数据同步效率,另一方面在后续对还未进行过表结构变更的单机数据库的第一数据表进行表结构的变更时,还可以提升此时第一数据表在数据同步时候的同步效率。

在一种可能实现的方法中,所述第一同步组件根据所述表结构映射关系,对所述第一单机数据库的第一日志文件中的第一记录信息进行修改,得到第二记录信息,包括:若所述表结构映射关系中,所述第二数据表相对于所述第一数据表存在增加的第一字段,则所述第一同步组件在所述第一记录信息中增加所述第一字段对应的设定信息,得到所述第二记录信息;若所述表结构映射关系中,所述第二数据表相对于所述第一数据表中存在字段位置变更的第二字段和第三字段,则所述第一同步组件对所述第一记录信息中所述第二字段对应的信息和所述第三字段对应的信息进行位置调整,得到所述第二记录信息;若所述表结构映射关系中,所述第二数据表相对于所述第一数据表中存在减少的第四字段,则所述第一同步组件在所述第一记录信息中删除所述第四字段对应的信息,得到所述第二记录信息。

基于该方案,在第一同步组件根据表结构映射关系对第一记录信息进行修改而得到第二记录信息的过程中,可存在数据表的字段增加、字段减少以及字段保持不变但位置存在变更的各情形。其中,针对于第二数据表中字段多于第一数据表中字段的情形,第一同步组件可在第一记录信息中适应增加多出字段对应的设定信息,从而得到第二记录信息;针对于第二数据表中字段少于第一数据表中字段的情形,第一同步组件可在第一记录信息中适应删除少的字段对应的信息,从而得到第二记录信息;针对于第二数据表中字段与第一数据表中字段相同(指字段数目以及各字段内容均相同)但字段位置存在变更的情形,由于目前的技术在面对字段相同的数据表的数据同步时,仅仅会按照字段顺序地将数据进行同步,显然将会导致数据同步的异常(数据与字段不对应),为此,本方案可对第一数据表与第二数据表位于同一位置的两字段建立绑定关系,从而第一同步组件可将第一数据表对应的第一记录信息中的存在位置变更的字段的位置进行适应调整,以便于实现日后第一数据表中的各字段对应的数据可以正确地同步至第二数据表中,而不会发生数据错乱。

在一种可能实现的方法中,所述第一同步组件获取第一单机数据库中第一数据表与所述分布式数据库中第二数据表之间的表结构映射关系之前,还包括:所述第一同步组件根据检查脚本对所述数据对象进行检查;所述检查脚本包括多个检查项,各检查项分别用于判定是否可对所述数据对象进行数据同步操作;所述第一同步组件确定所述数据对象满足各检查项的要求。

基于该方案,在将单机数据库中的数据表同步至分布式数据库时,因为分布式数据库对于部分特性无法兼容或者有部分限制,比如数据表必须有主键、数据表不能有外键等要求,因此目前的技术在实现单机数据库到分布式数据库的数据同步之前需要手工对各检查项进行确认,以提前确认分布式数据库是否可以兼容,显然该种由人工确认是否可以实现单机数据库到分布式数据库的数据同步的方式耗时耗力,极大地降低了数据同步的效率。为此,本方案通过让第一同步组件运行预先配置好的检查脚本对数据表进行检查,并在确认满足各检查项的要求后立即进行数据同步,该方式一方面可以做到通用性;不同的分布式数据库可能有不同的检查项,因此可以根据实际情况、灵活的对各检查项进行配置;另一方面还可以实现自动化检查,不需要对每个检查项采用手工的方式逐个进行检查,节省人力成本且提升了数据同步的效率。

在一种可能实现的方法中,所述第一同步组件向监控模块发送注册信息;所述第一同步组件接收所述监控模块发送的第一信息;所述第一信息用于指示所述第一同步组件向所述监控模块反馈所述第一同步组件的存活状态;所述第一同步组件向所述监控模块发送第二信息;所述第二信息用于指示所述监控模块确定是否对所述第一同步组件进行替换。

基于该方案,在多个单机数据库通过各自的同步组件实现同构数据表与分布式数据库间的数据同步时,若其中的一个单机数据库对应的同步组件故障(进程异常或者所在服务器宕机)后,该单机数据库对应的数据同步过程将会异常终止,进而会极大影响整体的数据同步效率。为此,本方案通过使用监控模块来对第一同步组件进行存活状态监控,并在监控到第一同步组件故障后,立即启用空闲的同步组件来对第一同步组件进行替换,可使同步组件达到高可用,达到故障自愈;且可避免因为第一同步组件的异常而造成的数据同步效率的下降问题。

在一种可能实现的方法中,所述第一同步组件根据所述第二记录信息,将所述数据对象同步至所述第二数据表中之后,还包括:针对各单机数据库中的任一单机数据库,所述第一同步组件根据核对脚本确定所述分布式数据库与所述单机数据库之间的同步时延满足预设时延要求;所述第一同步组件根据所述核对脚本确定所述分布式数据库与所述单机数据库已完成数据同步;所述第一同步组件基于应用切换脚本,将应用连接的数据库从各单机数据库切换至所述分布式数据。

基于该方案,目前的技术中,因为数据同步实际上是准实时的,即在上游的单机数据库中发生的增删改SQL(Structured Query Language,结构化查询语言)需要一定的时间才会传到下游的分布式数据库中进行执行,一般是1秒左右甚至更长时间。为了确保上下游的数据完全一致,一般在切换数据库前,应用需要先停服。停服,对于客户的体验非常差,对于业务要求的24小时不间断服务有很大影响。其中,在确保上下游的数据完全一致的过程中,目前的技术是需要手工去确认下游是否追平上游的数据,显然耗时耗力。为此,本方案中的第一同步组件通过运行核对脚本,则可以快速确定下游的分布式数据库是否已经与上游的单机数据库完成了数据同步,避免了人工检查方式存在的耗时耗力的问题;此外,正是由于可以实现快速的检查是否已经完成数据同步,因此,本方案中通过运行应用切换脚本,将可以快速地将应用连接的数据库由单机数据库切换至分布式数据库,无需进行应用的停服,提升了用户体验,对金融场景尤其友好。

在一种可能实现的方法中,所述针对各单机数据库中的任一单机数据库,所述第一同步组件根据核对脚本确定所述分布式数据库与所述单机数据库之间的同步时延满足预设时延要求,包括:所述第一同步组件根据核对脚本,向所述单机数据库写入第一时间戳;所述第一时间戳用于表征写入所述单机数据库的时刻;所述第一同步组件若确定第二时间戳与所述第一时间戳的差值满足设定阈值,则确定所述分布式数据库与所述单机数据库之间的同步时延满足预设时延要求;所述第二时间戳是所述第一时间戳作为数据对象同步至所述分布式数据库时的时刻;所述第一同步组件根据所述核对脚本确定所述分布式数据库与所述单机数据库已完成数据同步,包括:所述第一同步组件根据所述核对脚本,设置所述单机数据库为只读;所述第一同步组件在所述分布式数据库的数据同步记录值与所述单机数据库的数据同步记录值一致时,确定所述分布式数据库与所述单机数据库已完成数据同步。

基于该方案,本方案通过运行核对脚本可以快速确定下游的分布式数据库是否已经完成了对上游的单机数据库的数据同步。其中,本方案中的核对脚本包括两方面的内容,第一方面,首先需确认单条的数据在由上游的单机数据库同步至下游的分布式数据的时延是否满足设定时延要求,仅在时延满足设定时延要求时,才可进行第二方面的有关操作;第二方面,在确认时延满足设定时延要求时,需将上游的单机数据库设置为只读,在只读条件下继续操作上游的单机数据库到下游的分布式数据库的数据同步行为,并周期性地检测上、下游数据库的数据同步记录值是否一致,且在超时保护时限范围内,确定上、下游数据库的数据同步记录值已经一致,则说明实现了数据同步。本方案通过自动化执行以上两方面的对数据同步情况的核对脚本,检查效率高,避免了人工检查方式存在的耗时耗力的问题。

在一种可能实现的方法中,所述第一同步组件基于应用切换脚本,将应用连接的数据库从各单机数据库切换至所述分布式数据,包括:所述第一同步组件基于应用切换脚本,将设置于代理网关中的各单机数据库的接入IP权重由第一值设置为第二值,并将设置于所述代理网关中的所述分布式数据库的接入IP权重由所述第二值设置为所述第一值;其中,所述第一值为100%,所述第二值为0。

基于该方案,通过代理(PROXY)网关技术,可将上游的单机数据库和下游的分布式数据库的接入IP(Internet Protocol,网络之间互连的协议)都统一加入到一个虚拟IP(Virtual IP,VIP)。将应用连接的数据库从单机数据库切换至分布式数据库之前,即此时还未实现下游的分布式数据库与上游的单机数据库之间的数据同步,则可将上游的单机数据库的接入IP权重设置为100,同时将下游的分布式数据库的接入IP权重设置为0,其中,权重为0,也就是意味着在网络层把对应的IP从转发目标里剔除掉,即此时仅会将应用产生的数据写入到上游的单机数据库而不会写入到下游的分布式数据库;一旦运行的核对脚本确认下游的分布式数据库已经实现了对上游的单机数据库的数据同步,则可将下游的分布式数据库的接入IP权重设置为100,同时将上游的单机数据库的接入IP权重设置为0,即表示此时仅会将应用产生的数据写入到下游的分布式数据库而不会写入到上游的单机数据库,从而可快速实现对应用连接着的数据库的切换,无需进行应用的停服,提升了用户体验,对金融场景尤其友好。

在一种可能实现的方法中,所述第一同步组件获取第一单机数据库中第一数据表与所述分布式数据库中第二数据表之间的表结构映射关系之前,还包括:第二同步组件接收灰度发布指令;所述第二同步组件用于第二单机数据库中第三数据表与所述第二数据表之间的数据同步,所述第三数据表与所述第一数据表为同构数据表;所述第二同步组件根据所述灰度发布指令更新所述第二数据表。

基于该方案,目前对上游的各单机数据库与下游的分布式数据库进行数据同步的技术,在对位于各单机数据库中的同构数据表做表结构变更时,为了最小化对业务的影响,会进行灰度变更,即先对某一个或某几个上游的单机数据库进行表结构变更,观察几天确认无异常后,才会对剩余的上游的单机数据库进行全量地表结构变更。这种灰度变更的场景,会导致已经进行表结构变更的上游的单机数据库的表结构更与其他上游的单机数据库和下游的分布式数据库的表结构不一致,如果表结构不一致,则会导致数据同步中断。对此目前的技术是暂停已经进行表结构变更的上游的单机数据库的数据同步,等到其他上游的单机数据库也全量地完成了表结构变更后,才会恢复数据同步,并且通知下游的分布式数据库也执行这个表结构变更。显然,该灰度变更的技术方案中,是最后才对下游的分布式数据库进行表结构变更的,这极大地降低了数据同步的整体效率。为此,本方案提出在对某一个或某几个上游的单机数据库先进行表结构变更时,同时对下游的分布式数据库的表结构也同期进行变更,从而在后续对其他上游的单机数据库进行表结构变更时,无需暂停已经进行过表结构变更的上游的单机数据库与下游的分布式数据库之间的数据同步,从而可以提升数据同步的整体效率。

第二方面,本申请实施例提供一种数据同步装置,适用于至少一个单机数据库通过各自的同步组件将数据同步至分布式数据库;该装置包括:表结构映射关系获取单元,用于获取第一单机数据库中第一数据表与所述分布式数据库中第二数据表之间的表结构映射关系;记录信息更新单元,用于根据所述表结构映射关系,对所述第一单机数据库的第一日志文件中的第一记录信息进行修改,得到第二记录信息;所述第一记录信息中记录有所述第一数据表中待同步至所述第二数据表中的数据对象;同步单元,用于根据所述第二记录信息,将所述数据对象同步至所述第二数据表中。

在一种可能实现的方法中,所述记录信息更新单元,具体用于:若所述表结构映射关系中,所述第二数据表相对于所述第一数据表存在增加的第一字段,则所述第一同步组件在所述第一记录信息中增加所述第一字段对应的设定信息,得到所述第二记录信息;若所述表结构映射关系中,所述第二数据表相对于所述第一数据表中存在字段位置变更的第二字段和第三字段,则所述第一同步组件对所述第一记录信息中所述第二字段对应的信息和所述第三字段对应的信息进行位置调整,得到所述第二记录信息;若所述表结构映射关系中,所述第二数据表相对于所述第一数据表中存在减少的第四字段,则所述第一同步组件在所述第一记录信息中删除所述第四字段对应的信息,得到所述第二记录信息。

在一种可能实现的方法中,该装置还包括数据同步确认单元;所述数据同步确认单元,用于:根据检查脚本对所述数据对象进行检查;所述检查脚本包括多个检查项,各检查项分别用于判定是否可对所述数据对象进行数据同步操作;确定所述数据对象满足各检查项的要求。

在一种可能实现的方法中,该装置还包括收发单元;所述收发单元,用于:向监控模块发送注册信息;接收所述监控模块发送的第一信息;所述第一信息用于指示所述第一同步组件向所述监控模块反馈所述第一同步组件的存活状态;向所述监控模块发送第二信息;所述第二信息用于指示所述监控模块确定是否对所述第一同步组件进行替换。

在一种可能实现的方法中,该装置还包括应用切换单元;所述应用切换单元,用于:针对各单机数据库中的任一单机数据库,根据核对脚本确定所述分布式数据库与所述单机数据库之间的同步时延满足预设时延要求;根据所述核对脚本确定所述分布式数据库与所述单机数据库已完成数据同步;基于应用切换脚本,将应用连接的数据库从各单机数据库切换至所述分布式数据。

在一种可能实现的方法中,所述应用切换单元,具体用于:根据核对脚本,向所述单机数据库写入第一时间戳;所述第一时间戳用于表征写入所述单机数据库的时刻;若确定第二时间戳与所述第一时间戳的差值满足设定阈值,则确定所述分布式数据库与所述单机数据库之间的同步时延满足预设时延要求;所述第二时间戳是所述第一时间戳作为数据对象同步至所述分布式数据库时的时刻;根据所述核对脚本,设置所述单机数据库为只读;在所述分布式数据库的数据同步记录值与所述单机数据库的数据同步记录值一致时,确定所述分布式数据库与所述单机数据库已完成数据同步。

在一种可能实现的方法中,所述应用切换单元,具体用于:基于应用切换脚本,将设置于代理网关中的各单机数据库的接入IP权重由第一值设置为第二值,并将设置于所述代理网关中的所述分布式数据库的接入IP权重由所述第二值设置为所述第一值;其中,所述第一值为100%,所述第二值为0。

在一种可能实现的方法中,还包括第二同步组件,所述第二同步组件包括灰度发布指令接收单元和数据表更新单元;所述灰度发布指令接收单元,用于接收灰度发布指令;所述第二同步组件用于第二单机数据库中第三数据表与所述第二数据表之间的数据同步,所述第三数据表与所述第一数据表为同构数据表;所述数据表更新单元,用于根据所述灰度发布指令更新所述第二数据表。

第三方面,本申请实施例提供了一种计算设备,包括:

存储器,用于存储程序指令;

处理器,用于调用所述存储器中存储的程序指令,按照获得的程序执行如第一方面任一实现方法。

第四方面,本申请实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行如第一方面任一实现方法。

附图说明

为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为现有技术的一种自单机数据库到分布式数据库的数据同步过程示意图;

图2为现有技术的一种同步组件在数据同步过程中的工作原理示意图;

图3为本申请实施例提供的一种数据同步方法;

图4为本申请实施例提供的一种监控模块(detecter)的工作原理图;

图5为本申请实施例提供的一种数据同步系统;

图6为本申请实施例提供的一种对同步组件进行替换的原理示意图;

图7为本申请实施例提供的一种应用切换之前的数据库连接状态图;

图8为本申请实施例提供的一种应用切换时的数据库连接状态图;

图9为本申请实施例提供的一种数据同步装置;

图10为本申请实施例提供的一种计算设备。

具体实施方式

为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。

目前,如需对金融领域的某一研究对象对应的数据进行存储时,可以通过一个单机数据库进行存储,该单机数据库可以采用MySQL数据库。然而,在该研究对象对应的数据越来越多时,此时若仅还通过一个单机数据库对数据进行存储,则易出现容量瓶颈。对此问题,可以基于一定的存储规则,将存储于该单机数据库上的、用于存储该研究对象对应的数据的数据表进行拆分,拆分成多个同构数据表(即数据表结构相同),然后将这多个同构数据表分别存储于一个单机数据库中。然而该方式对应用有很多限制,比如无法做跨数据库的join操作,需要涉及到分布式事务的改造。

由于分布式数据库的容量具有水平无限扩展的特性,即容量不再会有瓶颈,因此可以将拆分得到的同构数据表通过同步组件汇总、同步到一个分布式数据库中。如图1所示,为现有技术的一种自单机数据库到分布式数据库的数据同步过程示意图。其中由于是需要将单机数据库中的数据同步至分布式数据库中,表示每一个单机数据库分别为一个上游数据库,分布式数据库为下游数据库,一个上游数据库对应一个同步组件,如图1中的同步组件1、同步组件2、同步组件3……同步组件N分别用于实现上游数据库1、上游数据库2、上游数据库3……上游数据库N各自与下游的分布式数据库之间的数据同步。如图2所示,为现有技术的一种同步组件在数据同步过程中的工作原理示意图。其中,同步组件负责解析上游数据库的binlog文件,并在下游数据库回放执行SQL语句,从而实现数据同步。binlog是一种二进制格式的日志文件,用于记录MySQL内部对数据库的改动(只记录对数据的修改操作)。

当实现数据同步之后,可将应用连接的数据库从上游的单机数据库切换至下游的分布式数据库。应用在切换到分布式数据库后,对于应用来说,可以把分布式数据库当做一个容量无限的单机数据库,不再有其他限制,显然这对应用非常友好。

在实现上述将数据从上游的单机数据库同步至下游的分布式数据的过程中,如果同时要求对上游的单机数据库中的同构数据表做表结构的变更操作,则为了最小化对业务的影响,可采用灰度变更的方式进行,即先对上游的某一个或者某几个单机数据库进行表结构变更,观察几天确认无异常后,才会对上游剩余的单机数据库进行全量地表结构变更。

上述的灰度变更方式,会导致上游的已经进行过表结构变更的单机数据库的表结构与具有同构数据表的其他上游的单机数据库的表结构、以及下游的分布式数据库的表结构不一致。由于表结构不一致会导致数据同步的中断,因此目前的技术是暂停上游的已经进行过表结构变更的单机数据库的数据同步,等到具有同构数据表的其他上游的单机数据库也全量地完成了表结构变更后,才会恢复数据同步,并且通知下游的分布式数据库也执行此次的表结构变更。

显然,目前的灰度变更技术由于需要暂停上游的已经进行过表结构变更的单机数据库的数据同步,才能够实现对具有同构数据表的其他上游的单机数据库的同构数据表的表结构进行变更,这显然极大地降低了数据同步的效率。

针对上述技术问题,本申请实施例提供一种数据同步方法,适用于至少一个单机数据库通过各自的同步组件将数据同步至分布式数据库,如图3所示,该方法包括以下步骤:

步骤301,第一同步组件获取第一单机数据库中第一数据表与所述分布式数据库中第二数据表之间的表结构映射关系。

在本步骤之前,可选的,第二同步组件接收灰度发布指令;所述第二同步组件用于第二单机数据库中第三数据表与所述第二数据表之间的数据同步,所述第三数据表与所述第一数据表为同构数据表;所述第二同步组件根据所述灰度发布指令更新所述第二数据表。

例如,可以图1所示的架构对本方案进行说明。在进行关于同构数据表的表结构变更之前,上游的单机数据库1、单机数据库2、单机数据库3……单机数据库N与下游的分布式数据具有关于同一研究对象的同构数据表,其中同构数据表在下游的分布式数据库中记为第二数据表。设本次灰度发布是以上游的单机数据库1作为测试对象,也即本次的灰度发布是先对上游的单机数据库1中的同构数据表进行表结构的变更,然后可根据对变更了表结构的单机数据库1在未来若干时长的数据同步效果的观察,确定是否对上游的单机数据2、单机数据库3……单机数据库N进行全量的表结构变更。基于该假设,则同构数据表在上游的单机数据库1中可记为第三数据表,同构数据表在上游的单机数据库2、单机数据库3……单机数据库N中的任一个单机数据库中均可记为第一数据表。因此,在本次的灰度发布是先对上游的单机数据库1中第三数据表进行表结构的变更时,则图1所示的同步组件1可作为第二同步组件,来对用户发起的灰度发布指令进行接收。其中,灰度发布指令包括用于指示表结构变更的信息,如表结构变更的信息可以为第三数据表相对于第二数据表,发生字段的增加、字段的减少以及既有字段的位置调整等内容。从而,在同步组件1接收到灰度发布指令时可以根据该灰度发布指令对下游的分布式数据库中的第二数据表进行更新。在同步组件1对第二数据表进行表结构的更新后,用于分别负责单机数据库2、单机数据库3……单机数据库N与分布式数据库之间数据同步的同步组件2、同步组件3……同步组件N可分别作为一个第一同步组件,第一同步组件可以获取到第一数据表与第二数据表之间的表结构映射关系。

下面举一个具体的例子进行说明。

设共有三个上游的单机数据库,分别令为上游的单机数据库B、上游的单机数据库C和上游的单机数据库D,该三个上游的单机数据库关于同一研究对象的同构数据表记作A表;此外,同步组件B’、同步组件C’和同步组件D’分别用于实现上游的单机数据库B、上游的单机数据库C和上游的单机数据库D到下游的分布式数据库的数据同步。则:

首先,上游的各单机数据库关于D表的表结构的起始状态为:

上游的单机数据库B的A表结构为:

x int

y int

z int

上游的单机数据库C的A表结构为:

x int

y int

z int

上游的单机数据库D的A表结构为:

x int

y int

z int

也即,这三个上游的单机数据库的A表中分别顺序的含有字段x、字段y和字段z。

接着,设本次灰度发布是以上游的单机数据库B作为测试对象,也即本次的灰度发布是先对上游的单机数据库B中的数据表A进行表结构的变更;且,可进一步假设表结构的变更内容为增加一个字段m,则具体的灰度发布指令可以表示为:对上游的单机数据库B中的A表增加m varchar(100)default 100字段(alter table B add column m varchar(100)default 100)。则同步组件B’可对上游的单机数据库B的A表结构进行变更,而同步组件C’并不会对上游的单机数据库C的A表结构进行变更,且同步组件D’也不会对上游的单机数据库D的A表结构进行变更,因此:

上游的单机数据库B的A表结构为:

x int

y int

z int

m varchar(100)default‘pad’

上游的单机数据库C的A表结构为:

x int

y int

z int

上游的单机数据库D的A表结构为:

x int

y int

z int

其中,当同步组件B’在上游的单机数据库B的A表中增加一个字段m后,同步组件B’会直接把增加m varchar(100)default 100字段(alter table A add column m varchar(100)default 100)在下游的分布式数据库中执行。在数据同步过程中,每一个同步组件会把自己每一次对数据表的操作信息记录到日志文件中,例如在MySQL数据库的背景下,每一次的操作信息可以记作一个pos点,日志文件可以为binlog文件,灰度变更过程也不例外。因此,在对上游的单机数据库B的A表进行表结构变更后,对于还未进行过表结构变更的单机数据库C和单机数据库D而言,同步组件C’和同步组件D’分别可以获取到由自身负责的A表与下游的分布式数据库中的A表在表结构上存在差异,因此同步组件C’可以获取到A表在上游的单机数据库C与下游的分布式数据库间的表结构映射关系,同理同步组件D可以获取到同样的表结构映射关系。

步骤302,所述第一同步组件根据所述表结构映射关系,对所述第一单机数据库的第一日志文件中的第一记录信息进行修改,得到第二记录信息;所述第一记录信息中记录有所述第一数据表中待同步至所述第二数据表中的数据对象。

在一个单机数据库中,可同时存在有多个数据表。其中,针对于单机数据库中的任一个数据表,可对应于一个记录信息,该记录信息可以用于逐一记录用户每一次对该数据表的操作信息,因此数据同步过程中通过将该记录信息在分布式数据库中进行回放,则可以实现单机数据库到分布式数据库之间的数据同步;此外,同一个单机数据库中的每一个记录信息可共同存入一份日志文件中。例如,设一单机数据库中存在有三张数据表,分别令为数据表1、数据表2和数据表3,则可以将用户对数据表1的每一次的操作信息记录在记录信息1中,可以将用户对数据表2的每一次的操作信息记录在记录信息2中,以及可以将用户对数据表3的每一次的操作信息记录在记录信息3中,且记录信息1、记录信息2和记录信息3均存入该单机数据库对应的日志文件中。因此,在本步骤中,当第一同步组件获取到表结构映射关系后,可以在第一单机数据库对应的第一日志文件中查找第一数据表对应的第一记录信息,并根据所获取到的表结构映射关系对第一记录信息进行修改,从而产生更新后的第一记录信息,即第二记录信息。

步骤303,所述第一同步组件根据所述第二记录信息,将所述数据对象同步至所述第二数据表中。

在本步骤中,由于步骤302中已经产生第二记录信息,因此通过将第二记录信息在分布式数据库中进行回放,则可以实现将用户准备对第一数据表的表结构的更新操作在分布式数据库中执行。

例如,针对前述上游的单机数据库B、单机数据库C和单机数据库D分别具有同构数据表A的例子,当同步组件B’在上游的单机数据库B的A表中增加一个字段m后,此时同步组件C’对数据表A对应的记录信息进行解析后可发现上下游的表结构不一致——存在字段的增加,则可对数据表A对应的记录信息补充m字段的数据,并且以默认值“pad”进行填充。例如SQL语句为:insert into A(x,y,z)values(1,1,1),则可将该SQL语句转换为:insertinto A(x,y,z,m)values(1,1,1,‘pad’)。同步组件D’也是参照同步组件C’相同的处理逻辑,此处不再赘述。

该方案中,当第二同步组件根据灰度发布指令实现第二单机数据库中的第三数据表在分布式数据库中第二数据表的表结构的更新后,第一同步组件可以基于第一单机数据库中的第一数据表与第二数据表的表结构映射关系,对第一单机数据库对应的第一日志文件中的第一记录信息进行修改,并产生第二记录信息,从而通过将第二记录信息在分布式数据库中进行回放,则可以实现第一数据表的表结构在分布式数据库中发生与第三数据表相同的表结构更新操作。也即在本方案提供的灰度发布技术中,在对上游的某一个或某几个单机数据库执行表结构的变更时,同时可将本次的表结构变更在分布式数据库中对应执行,此外还可将上游其他的未被纳入本次灰度变更范畴的单机数据库在分布式数据库中的同构数据表的表结构进行相同的表结构变更,从而可以避免背景技术描述的在灰度发布场景下,需要中断已经进行过表结构变更的单机数据库的数据同步行为的问题,提升了数据同步的效率。

以下将结合示例对上述一些步骤进行详细说明。

在上述步骤302的一个实施中,所述第一同步组件根据所述表结构映射关系,对所述第一单机数据库的第一日志文件中的第一记录信息进行修改,得到第二记录信息,包括:若所述表结构映射关系中,所述第二数据表相对于所述第一数据表存在增加的第一字段,则所述第一同步组件在所述第一记录信息中增加所述第一字段对应的设定信息,得到所述第二记录信息;若所述表结构映射关系中,所述第二数据表相对于所述第一数据表中存在字段位置变更的第二字段和第三字段,则所述第一同步组件对所述第一记录信息中所述第二字段对应的信息和所述第三字段对应的信息进行位置调整,得到所述第二记录信息;若所述表结构映射关系中,所述第二数据表相对于所述第一数据表中存在减少的第四字段,则所述第一同步组件在所述第一记录信息中删除所述第四字段对应的信息,得到所述第二记录信息。

如前述例子中,针对前述上游的单机数据库B、单机数据库C和单机数据库D分别具有同构数据表A、且将单机数据库B中的数据表A作为本次灰度发布的测试对象,则在本次灰度发布过程中,对单机数据库B中的数据表A执行表结构的变更操作的类型可以分为:相比于分布式数据库中的同构数据表,进行字段的增加,进行字段的减少以及对既有字段进行位置的调整三种类型。下面分别就灰度发布指令为上述3种类型进行讨论:

情形1,本次的灰度发布指令为字段的增加。

则,具体可以参见前述的例子,此处不再赘述。

情形2,本次的灰度发布指令为字段的减少。

则,在同步组件B’对位于单机数据库B中的数据表A对应删除用户指定的某一个或某几个字段后,同步组件B’一方面会将本次删除字段的操作信息记录在记录信息中,另一方面会将分布式数据库中、与自身(指单机数据库B)的数据表A为同构数据表的数据表的相同字段进行删除;则,同步组件C’对数据表A对应的记录信息进行解析后可发现上下游的表结构不一致——存在字段的减少,则同步组件C’会将分布式数据库中、与自身(指单机数据库C)的数据表A为同构数据表的数据表的相同字段进行删除。同步组件D’也是参照同步组件C’相同的处理逻辑,此处不再赘述。

情形3,本次的灰度发布指令为既有字段的位置调整。

由于MySQL数据库对应的日志文件,即binlog,一般其只会记录某个数据表,按字段顺序的数据变化,却并不会记录对应的字段名。例如:

当在上游的单机数据库B的数据表A写入一条数据,其SQL语句可为:insert intoA values(‘123’,’xxxx’,’yyy’),则在binlog的显示如下:

列1 123

列2 xxxx

列3 yyy

当在上游的单机数据库C的数据表A写入一条数据,其SQL语句可为:insert intoA values(‘456,’zzzz,’kkkkk),则在binlog的显示如下:

列1 456

列2 zzzz

列3 kkkkk

假设本次的灰度发布过程中并不涉及对下游的分布式数据库的表结构的变更,那么在数据同步时只需将以上2条记录,直接写入到下游即可。

但是,如果本次的灰度发布是需要对上游的单机数据库B的数据表A进行字段顺序的调整,比如是对上游的单机数据库B的数据表A的列2和列3调换顺序,那么,如果:

当在上游的单机数据库B的数据表A写入一条数据,其SQL语句可为:insert intoA values(‘123’,’xxxx’,’yyy’),则在binlog的显示如下:

列1 123

列2 yyy #(原来的列3)

列3 xxxx #(原来的列2)

当在上游的单机数据库C的数据表A写入一条数据,其SQL语句可为:insert intoA values(‘456,’zzzz,’kkkkk),则在binlog的显示如下:

列1 456

列2 zzzz

列3 kkkkk

此时由于下游的分布式数据库中与上游的单机数据库B关于同构数据表——数据表A的表结构仍然保持原来的列1、2、3的顺序,因此如果同步组件B’还是按照原先的顺序对应去写入到下游的表,则会出现错乱,即上游列3的数据写到了下游列2,上游列2的数据写到了下游列3。为此,本方案对上游与下游的字段进行了一个映射关系的维护,比如可以将维护关系存储在本地的文件中。例如,维护关系可以为:

初始态:

关系1(上游的单机数据库B与下游的分布式数据库关于同构数据表——数据表A的字段映射关系):

上游 列1----下游 列1

上游 列2----下游 列2

上游 列3----下游 列3

关系2(上游的单机数据库C与下游的分布式数据库关于同构数据表——数据表A的字段映射关系):

上游 列1----下游 列1

上游 列2----下游 列2

上游 列3----下游 列3

则,如果对上游的单机数据库B的数据表A调整顺序,那么可同时修改关系1:

关系1(上游的单机数据库B与下游的分布式数据库关于同构数据表——数据表A的字段映射关系):

上游 列1----下游 列1

上游 列3----下游 列2

上游 列2----下游 列3

关系2(上游的单机数据库C与下游的分布式数据库关于同构数据表——数据表A的字段映射关系):

上游 列1----下游 列1

上游 列2----下游 列2

上游 列3----下游 列3

有了这个映射关系的维护后,在同步组件B’对下游的分布式数据库的表结构进行变更后,同时会将本次的对数据表A的操作信息记录在单机数据库B对应的binlog文件、与数据表A相对应的记录信息中;则同步组件C’解析binlog后,就可以根据映射关系去找到真正对应的字段进行数据写入,实现了对数据的准确同步。

在上述步骤301的一个实施中,所述第一同步组件获取第一单机数据库中第一数据表与所述分布式数据库中第二数据表之间的表结构映射关系之前,还包括:所述第一同步组件根据检查脚本对所述数据对象进行检查;所述检查脚本包括多个检查项,各检查项分别用于判定是否可对所述数据对象进行数据同步操作;所述第一同步组件确定所述数据对象满足各检查项的要求。

前文例子中已经讨论了数据同步过程中提升同步效率的方法,但是在实现数据同步之前,还需要对上游的单机数据库与下游的分布式数据库关于本次执行表结构变更的同构数据表进行检查,以确认是否可以实现本次的数据同步,因为分布式数据库对于部分特性无法兼容或者有部分限制,因此在执行数据同步之前对同构数据表进行检查,实为实现数据同步的基础,如果检查出不兼容项,则在数据同步之前需要做适应改造。

目前在对位于上游的单机数据库与下游的分布式数据库的同构数据表进行检查时,是通过人工的方式进行检查,其中需要检查的内容至少包括以下几项:1、表必须有主键;2、表不能有外键;3、表不能有触发器;4、表不能有视图;5、表不能有function;6、表不能有分区表;7、表的字符集必须为utf8或utfmb。显然,在对上述各检查项进行检查时,人工的方式极为耗时耗力。

为此,本申请实施例通过对上述人工检查的方案进行配置化管理,则可以实现在数据同步之前对同构数据表的快速检查。

其中,具体的实现方法可以为:

检查脚本需要输入一个配置文件,配置文件包括以下配置项:

check_scripts_dir表示检查脚本所在目录;check_items为具体的检查脚本。如果要增加新的检查项,只需要向check_scripts_dir目录放置检查脚本,并且在check_items配置这个脚本名即可。

expect为0,用于表示这个脚本如果返回值为0,则表示检查通过,如果返回值不为0,则表示检查失败。例如可用伪代码进行表示:

比如,对于item1:check_primary.sh脚本:

If check primary key yes(如果检查表存在主键):

Return 0(则返回0)

If check primary key no(如果检查表不存在主键):

Return 1(则返回1)

If check meet other error(如果遇到其他错误):

Return 1(则返回1)

可以看到以上脚本,仅限返回0和1两种值。

上述通过配置化的方式对同构数据表进行检查,可以具有至少以下两个好处:

第一,可以做到通用性。不同的分布式数据库可能有不同的检查项,因此可以根据实际情况,灵活地将检查脚本配置到配置文件并把检查脚本放到检查目录中即可。

第二,可以自动化检查,不再需要对每个检查项进行手工逐个检查。

针对图1所示的架构,在数据同步过程中,若其中的一个同步组件的进程异常或者所在服务器宕机后,那么由该同步组件负责的单机数据库到分布式数据库之间的数据同步过程将会异常终止,极大地影响到数据同步的效率;该种不良影响在多个同步组件同时故障时,甚至将对业务造成中断。

为此,本申请实施例可提供下述方式予以解决:

所述第一同步组件向监控模块发送注册信息;所述第一同步组件接收所述监控模块发送的第一信息;所述第一信息用于指示所述第一同步组件向所述监控模块反馈所述第一同步组件的存活状态;所述第一同步组件向所述监控模块发送第二信息;所述第二信息用于指示所述监控模块确定是否对所述第一同步组件进行替换。

作为一种示例,本申请实施例中可将ectd作为监控模块(detecter)进行使用。etcd是一个高可用的开源组件,所以监控模块本身具有高可用特性,一般至少需要3个节点,挂掉任意一个节点不影响监控模块正常工作。etcd底层通过raft算法以保证高可用的工作原理如下:

每个etcd集群(cluster)都是由3个成员(member)组成的,每个member是一个独立运行的etcd实例。在正常运行的状态下,cluster中会将一个member作为一个主导者(leader),其余的member都是随从者(followers)。leader向followers同步日志,保证数据在各个member都有副本。leader还会定时向所有的member发送心跳报文,如果在规定的时间里follower没有收到心跳,cluster中将会重新进行选举新的leader,保证高可用。

参考图4,为本申请实施例提供的一种监控模块(detecter)的工作原理图。其中,detecter用于探测工作中的同步组件是否存活,如果不存活,将选取一个空闲的同步组件来顶替这个同步组件,用于保证同步组件的高可用性。

在图4中,以同部组件1作为第一同步组件进行说明:

步骤1,同步组件1向etcd进行注册。

步骤2,同步组件1接收etcd发送的注册成功信息,并同时接收etcd发送的超时信息,如可将超时时间设置为60秒;该超时信息用于指示同步组件1最多在60秒的时间内向自己(指etcd)发送一次心跳,以让etcd判决同步组件1是否需要被其他空闲的同步组件替换。

步骤3,同步组件1持续向etcd报告自己的存活性。

步骤4,同步组件1因为超出60秒而未向etcd发送心跳或者etcd在超时时长内收到了非存活的心跳,而被etcd选取的一个其他空闲的同步组件替换。

参考图5,为本申请实施例提供的一种数据同步系统。对比图1来看,图5中新增了监控模快(detecter)以及至少一个空闲的同步组件。结合图5,本方案通过将同步组件分为两种角色,一种是正在工作中的同步组件,一种是空闲的同步组件,因此,如果工作中的同步组件因为进程异常或者所在服务器宕机,则监控模块(detecter)将会从空闲的同步组件中选取一个来顶替这个异常的同步组件。该方式可以使同步组件达到高可用,实现故障自愈。

其中,在监控模块(detecter)使用空闲的同步组件对工作异常的同步组件进行替换时,需要从挂掉之前的一同步节点,即异常的pos点继续同步。因此,本方案可在数据同步过程中,由监控模块(detecter)将每一个已经进行过数据同步操作的pos点记录到下游的分布式数据库,用于顶替的同步组件启动后可从下游的分布式数据库读取pos点后即可继续进行同步。

同步组件在进行数据同步的过程中,需要解析上游的单机数据库对应的binlog文件,并且将解析得到的SQL语句在下游的分布式数据库中的执行,该过程中如果监控模块监测到同步组件异常后,则会从空闲的同步组件集群中的选取一个空闲的同步组件进行替换,同时监控模块从下游的分布式数据库读取pos点,然后由上升为工作状态的空闲的同步组件从该pos点继续同步。参考图6,为本申请实施例提供的一种对同步组件进行替换的原理示意图,其中包括以下步骤:

步骤1、监控模块监控到服务于上游的单机数据库1的同步组件1异常。

步骤2、监控模块确认由同步组件1负责的数据的同步过程中断。

步骤3、监控模块基于预设的规则从空闲的同步组件集群中选取同步组件1的顶替者,设顶替者为空闲的同步组件1。

步骤4、监控模块提升空闲的同步组件1为工作中的同步组件。

步骤5、监控模块从下游的分布式数据库中读取同步组件1的pos点为pos X。

步骤6、监控模块向空闲的同步组件1发送消息,该消息用于指示空闲的同步组件1从pos X继续同步。

步骤7、上升为工作状态的空闲的同步组件1从pos X解析,并将解析得到的SQL语句在下游的分布式数据库回放。

在上述步骤303的一个实施中,所述第一同步组件根据所述第二记录信息,将所述数据对象同步至所述第二数据表中之后,还包括:针对各单机数据库中的任一单机数据库,所述第一同步组件根据核对脚本确定所述分布式数据库与所述单机数据库之间的同步时延满足预设时延要求;所述第一同步组件根据所述核对脚本确定所述分布式数据库与所述单机数据库已完成数据同步;所述第一同步组件基于应用切换脚本,将应用连接的数据库从各单机数据库切换至所述分布式数据。

目前的数据同步技术中,当在确保上下游数据一致之后,则需要选择一个时间节点将应用连接的数据库从上游的单机数据库切换到下游的分布式数据库,即应用切换一般包括以下步骤:

步骤1、应用停服。

步骤2、用户手动确认下游的数据已追平上游的数据。

步骤3、将应用的数据库配置由单机数据库修改为分布式数据库,并启动应用。

但是,通过对以上步骤的分析,可以发现目前的应用切换技术至少存在以下2个缺点:

缺点1:因为数据同步实际上是准实时的,即上游发生的增、删、改SQL需要一定的时间才会传到下游进行执行,一般是1秒左右甚至更长时间。为了确保上下游的数据完全一致,一般在切换前,应用需要先停服。应用停服,这对于业务要求的24小时不间断服务的场景,例如金融场景,极大地影响到用户体验感。

缺点2:需要手工确认下游的数据是否追平上游的数据。显然,该种手工确认的操作耗时耗力。

为此,本申请实施例中通过对上述应用切换的技术方案进行改进,包括使用自动化的方式确认下游的数据是否追平上游的数据,从而提升了对上下游数据一致性的检查效率,以及在确认上下游实现数据同步之后,可通过运行应用切换脚本,快速实现将应用连接的数据库由上游的单机数据库切换至下游的分布式数据库。

其中,针对上述缺点2,本申请实施例在使用自动化的方式确认下游的数据是否已经追平上游的数据的过程中,包括两方面:

第一方面:确认每一条数据在由上游的单机数据库同步到下游的分布式数据库时所耗费的时间是否预设满足时延。

第二方面:确认下游的分布式数据库已经完成了对上游的单机数据库的全部数据的同步。

针对上述第一方面,本申请实施例可通过下述方式实现:

所述针对各单机数据库中的任一单机数据库,所述第一同步组件根据核对脚本确定所述分布式数据库与所述单机数据库之间的同步时延满足预设时延要求,包括:所述第一同步组件根据核对脚本,向所述单机数据库写入第一时间戳;所述第一时间戳用于表征写入所述单机数据库的时刻;所述第一同步组件若确定第二时间戳与所述第一时间戳的差值满足设定阈值,则确定所述分布式数据库与所述单机数据库之间的同步时延满足预设时延要求;所述第二时间戳是所述第一时间戳作为数据对象同步至所述分布式数据库时的时刻。

针对上述第二方面,本申请实施例可通过下述方式实现:

所述第一同步组件根据所述核对脚本确定所述分布式数据库与所述单机数据库已完成数据同步,包括:所述第一同步组件根据所述核对脚本,设置所述单机数据库为只读;所述第一同步组件在所述分布式数据库的数据同步记录值与所述单机数据库的数据同步记录值一致时,确定所述分布式数据库与所述单机数据库已完成数据同步。

例如,可以通过下述的例子对本申请实施例提供的自动化的方式确认下游的数据是否已经追平上游的数据进行说明:

步骤1,每隔1秒往上游的单机数据库写入一个当前时间的时间戳,并假设为ts,比如ts为2020-09-28 16:07:30,binlog会传到下游的分布式数据库并把该时间戳也写入到下游的分布式数据库。

步骤2,每隔1秒在下游的分布式数据库中持续查询当前时间,并与ts进行对比,比如查询到的当前时间为2020-09-28 16:07:32,可以看出上下游延迟为2秒。

步骤3,根据预先配置的阈值,比如当上下游延迟不大于10秒时,则认为延迟较小,可以继续执行步骤4;否则,循环执行步骤1和步骤2,直到延迟小于10秒。其中,阈值10秒即为预设时延要求,其可以由本领域技术人员根据实际需求进行设置。

步骤4,设置上游的单机数据库为只读,即单机数据库不能被修改,此时如果应用继续往单机数据库中写入数据,将会收到只读的报错;同时,自动化的核对脚本每隔1秒持续检查上下游的gtid信息,如果gtid相等了,则认为下游的数据追平了上游。

其中,本申请实施例中还可设置超时保护处理,即在自动化的核对脚本检查上下游的gtid信息是否相等的过程中,可根据预先设置的超时时长,比如经过20秒后,上下游的gtid依然不相等,则可认为切换时间太长,并将重新设置上游的单机数据库为可读可写,并终止应用切换流程。其中,20秒即为超时时长,其可以由本领域技术人员根据实际需求进行设置。

在应用切换的过程中,关于确认下游的数据是否已经追平上游的数据这一问题,通过本申请实施例提供的自动化的方式,可以快速地确认上下游是否已经完成数据同步,省时省力。此外,也正是基于本申请实施例提供的可以快速确认上下游已经完成数据同步的自动化技术,本申请实施例还可以根据应用切换脚本实现将应用连接的数据库由上游的单机数据库切换至下游的分布式数据库。

在本申请的某些实施中,所述第一同步组件基于应用切换脚本,将应用连接的数据库从各单机数据库切换至所述分布式数据,包括:所述第一同步组件基于应用切换脚本,将设置于代理网关中的各单机数据库的接入IP权重由第一值设置为第二值,并将设置于所述代理网关中的所述分布式数据库的接入IP权重由所述第二值设置为所述第一值;其中,所述第一值为100%,所述第二值为0。

例如,本申请实施例中可使用代理(PROXY)网关技术,把下游的分布式数据库和上游的单机数据库的接入IP都统一加入到一个VIP。

参考图7,为本申请实施例提供的一种应用切换之前的数据库连接状态图。其中,在应用切换之前,可将上游的单机数据库的接入IP的权重调整为100,权重为100,则PROXY会将应用的所有请求都发给该接入IP,并将下游的分布式数据库的接入IP的权重调整为0,权重为0,也就是意味着在网络层把对应的IP从转发目标里剔除掉,如此,应用通过VIP IP1即可连接到上游的单机数据库的IP1。

参考图8,为本申请实施例提供的一种应用切换时的数据库连接状态图。其中,基于本申请实施例提供的可以快速确认上下游已经完成数据同步的自动化技术,当确认上下游已经完成数据同步时,通过运行自动化的应用切换脚本设置PROXY上的上游的单机数据库的接入IP的权重为0,并设置下游的分布式数据库的接入IP的权重为100,此时应用的请求都将会写入到下游的分布式数据库,即完成切换。如此,在应用无需停服的条件下,即可完成切换。

基于同样的构思,本申请实施例提供一种数据同步装置,适用于至少一个单机数据库通过各自的同步组件将数据同步至分布式数据库;如图9所示,该装置包括表结构映射关系获取单元901、记录信息更新单元902和同步单元903;

表结构映射关系获取单元901,用于获取第一单机数据库中第一数据表与所述分布式数据库中第二数据表之间的表结构映射关系。

记录信息更新单元902,用于根据所述表结构映射关系,对所述第一单机数据库的第一日志文件中的第一记录信息进行修改,得到第二记录信息;所述第一记录信息中记录有所述第一数据表中待同步至所述第二数据表中的数据对象。

同步单元903,用于根据所述第二记录信息,将所述数据对象同步至所述第二数据表中。

进一步的,对于该装置,记录信息更新单元902,具体用于:若所述表结构映射关系中,所述第二数据表相对于所述第一数据表存在增加的第一字段,则所述第一同步组件在所述第一记录信息中增加所述第一字段对应的设定信息,得到所述第二记录信息;若所述表结构映射关系中,所述第二数据表相对于所述第一数据表中存在字段位置变更的第二字段和第三字段,则所述第一同步组件对所述第一记录信息中所述第二字段对应的信息和所述第三字段对应的信息进行位置调整,得到所述第二记录信息;若所述表结构映射关系中,所述第二数据表相对于所述第一数据表中存在减少的第四字段,则所述第一同步组件在所述第一记录信息中删除所述第四字段对应的信息,得到所述第二记录信息。

进一步的,对于该装置,还包括数据同步确认单元904;数据同步确认单元904,用于:根据检查脚本对所述数据对象进行检查;所述检查脚本包括多个检查项,各检查项分别用于判定是否可对所述数据对象进行数据同步操作;确定所述数据对象满足各检查项的要求。

进一步的,对于该装置,还包括收发单元905;收发单元905,用于:向监控模块发送注册信息;接收所述监控模块发送的第一信息;所述第一信息用于指示所述第一同步组件向所述监控模块反馈所述第一同步组件的存活状态;向所述监控模块发送第二信息;所述第二信息用于指示所述监控模块确定是否对所述第一同步组件进行替换。

进一步的,对于该装置,还包括应用切换单元906;应用切换单元906,用于:针对各单机数据库中的任一单机数据库,根据核对脚本确定所述分布式数据库与所述单机数据库之间的同步时延满足预设时延要求;根据所述核对脚本确定所述分布式数据库与所述单机数据库已完成数据同步;基于应用切换脚本,将应用连接的数据库从各单机数据库切换至所述分布式数据。

进一步的,对于该装置,应用切换单元906,具体用于:根据核对脚本,向所述单机数据库写入第一时间戳;所述第一时间戳用于表征写入所述单机数据库的时刻;若确定第二时间戳与所述第一时间戳的差值满足设定阈值,则确定所述分布式数据库与所述单机数据库之间的同步时延满足预设时延要求;所述第二时间戳是所述第一时间戳作为数据对象同步至所述分布式数据库时的时刻;根据所述核对脚本,设置所述单机数据库为只读;在所述分布式数据库的数据同步记录值与所述单机数据库的数据同步记录值一致时,确定所述分布式数据库与所述单机数据库已完成数据同步。

进一步的,对于该装置,应用切换单元906,具体用于:基于应用切换脚本,将设置于代理网关中的各单机数据库的接入IP权重由第一值设置为第二值,并将设置于所述代理网关中的所述分布式数据库的接入IP权重由所述第二值设置为所述第一值;其中,所述第一值为100%,所述第二值为0。

进一步的,对于该装置,还包括第二同步组件,所述第二同步组件包括灰度发布指令接收单元和数据表更新单元;所述灰度发布指令接收单元,用于接收灰度发布指令;所述第二同步组件用于第二单机数据库中第三数据表与所述第二数据表之间的数据同步,所述第三数据表与所述第一数据表为同构数据表;所述数据表更新单元,用于根据所述灰度发布指令更新所述第二数据表。

本申请实施例还提供了一种计算设备,该计算设备具体可以为桌面计算机、便携式计算机、智能手机、平板电脑、个人数字助理(Personal Digital Assistant,PDA)等。该计算设备可以包括中央处理器(Center Processing Unit,CPU)、存储器、输入/输出设备等,输入设备可以包括键盘、鼠标、触摸屏等,输出设备可以包括显示设备,如液晶显示器(Liquid Crystal Display,LCD)、阴极射线管(Cathode Ray Tube,CRT)等。

存储器,可以包括只读存储器(ROM)和随机存取存储器(RAM),并向处理器提供存储器中存储的程序指令和数据。在本申请实施例中,存储器可以用于存储数据同步方法的程序指令;

处理器,用于调用所述存储器中存储的程序指令,按照获得的程序执行数据同步方法。

如图10所示,为本申请实施例提供的一种计算设备的示意图,该计算设备包括:

处理器1001、存储器1002、收发器1003、总线接口1004;其中,处理器1001、存储器1002与收发器1003之间通过总线1005连接;

所述处理器1001,用于读取所述存储器1002中的程序,执行上述数据同步方法;

处理器1001可以是中央处理器(central processing unit,简称CPU),网络处理器(network processor,简称NP)或者CPU和NP的组合。还可以是硬件芯片。上述硬件芯片可以是专用集成电路(application-specific integrated circuit,简称ASIC),可编程逻辑器件(programmable logic device,简称PLD)或其组合。上述PLD可以是复杂可编程逻辑器件(complex programmable logic device,简称CPLD),现场可编程逻辑门阵列(field-programmable gate array,简称FPGA),通用阵列逻辑(generic array logic,简称GAL)或其任意组合。

所述存储器1002,用于存储一个或多个可执行程序,可以存储所述处理器1001在执行操作时所使用的数据。

具体地,程序可以包括程序代码,程序代码包括计算机操作指令。存储器1002可以包括易失性存储器(volatile memory),例如随机存取存储器(random-access memory,简称RAM);存储器1002也可以包括非易失性存储器(non-volatile memory),例如快闪存储器(flash memory),硬盘(hard disk drive,简称HDD)或固态硬盘(solid-state drive,简称SSD);存储器1002还可以包括上述种类的存储器的组合。

存储器1002存储了如下的元素,可执行模块或者数据结构,或者它们的子集,或者它们的扩展集:

操作指令:包括各种操作指令,用于实现各种操作。

操作系统:包括各种系统程序,用于实现各种基础业务以及处理基于硬件的任务。

总线1005可以是外设部件互连标准(peripheral component interconnect,简称PCI)总线或扩展工业标准结构(extended industry standard architecture,简称EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图10中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。

总线接口1004可以为有线通信接入口,无线总线接口或其组合,其中,有线总线接口例如可以为以太网接口。以太网接口可以是光接口,电接口或其组合。无线总线接口可以为WLAN接口。

本申请实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行数据同步方法。

本领域内的技术人员应明白,本申请的实施例可提供为方法、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。

显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

相关技术
  • 时间同步方法、数据同步方法、装置、系统、设备和介质
  • 数据同步方法、数据同步装置、数据同步设备及存储介质
技术分类

06120113117168