发明内容
针对现有技术的缺陷,本发明的目的是提供一种能够方便、稳定地对数据进行推送的方法和系统。
本发明提供了一种基于状态管理的数据推送方法,所述方法包括:a.采集各个推送线程的状态;b.当任何一个推送线程的状态异常时,对该推送线程进行故障恢复。
优选地,步骤a包括:a1.以预定周期向各推送服务器发送状态查询指令;a2.接收各推送服务器反馈的推送线程的状态。
优选地,在步骤b中,故障恢复包括:将异常的推送线程从第一推送服务器转移到第二推送服务器上,并在第二推送服务器上重启所述异常停止的推送服务,所述第一推送服务器为正在执行异常的推送线程的推送服务器。更优选地,在第二推送服务器上重启所述异常停止的推送服务为:从上一次的成功推送状态继续推送数据。
优选地,推送线程的状态异常包括以下的任意一种:(1)发出状态查询指令后,在规定时间内未收到推送线程的状态反馈,则将推送线程标记为异常待定状态,如果在重发状态查询指令预定次数后仍然无法得到反馈,则认定推送线程状态异常;(2)对源数据库或目的数据库无法操作。
优选地,在第二推送服务器上重启所述推送服务后,取消第一服务器上由于异常停止的推送线程。
优选地,在步骤b中,故障恢复包括:采集各个第二服务器的负载,将异常的推送线程从第一推送服务器转移到负载最小的第二推送服务器上,并在该第二推送服务器上重启所述异常停止的推送服务,所述第一推送服务器为正在执行异常的推送线程的推送服务器。
相应地,本发明提供了一种基于状态管理的稳定数据推送装置,所述装置包括:状态采集模块、故障恢复模块。状态采集模块用于采集各个推送线程的状态;故障恢复模块用于任何一个推送线程的状态异常时,对该推送线程进行故障恢复。
优选地,状态采集模块包括状态查询子模块、状态接收子模块。所述状态查询子模块用于以预定周期向各推送服务器发送状态查询指令;所述状态接收子模块用于接收各推送服务器反馈的推送线程的状态。
优选地,故障恢复模块包括线程转移子模块,线程转移子模块用于将异常的推送线程从第一推送服务器转移到第二推送服务器上并在第二推送服务器上重启所述异常停止的推送服务,所述第一推送服务器为正在执行异常的推送线程的推送服务器。更优选地,故障恢复模块包括负载分析子模块:所述负载分析子模块用于采集各个第二服务器的负载,将异常的推送线程从第一推送服务器转移到负载最小的第二推送服务器上,并在该第二推送服务器上重启所述异常停止的推送服务,所述第一推送服务器为正在执行异常的推送线程的推送服务器。
本发明还提供了一种基于状态管理的数据推送系统,所述系统包括管理服务器、推送服务器。推送服务器用于执行从源数据库向目的数据库的推送线程;管理服务器包括状态采集模块、故障恢复模块,其中:状态采集模块用于采集各个推送线程的状态;故障恢复模块用于当任何一个推送线程的状态异常时,对该推送线程进行故障恢复。
优选地,状态采集模块包括状态查询子模块、状态接收子模块。所述状态查询子模块用于以预定周期向各推送服务器发送状态查询指令;所述状态接收子模块用于接收各推送服务器反馈的推送线程的状态。
优选地,故障恢复模块包括线程转移子模块,线程转移子模块用于将异常的推送线程从第一推送服务器转移到第二推送服务器上并在第二推送服务器上重启所述异常停止的推送服务,所述第一推送服务器为正在执行异常的推送线程的推送服务器。
优选地,故障恢复模块包括负载分析子模块:所述负载分析子模块用于采集各个第二服务器的负载,将异常的推送线程从第一推送服务器转移到负载最小的第二推送服务器上,并在该第二推送服务器上重启所述异常停止的推送服务,所述第一推送服务器为正在执行异常的推送线程的推送服务器。
相对于现有技术,在本发明中,负责数据推送任务的线程得到有效的监控和管理,每一个任务推送线程启动、停止、故障恢复都在管理服务器的统一控制下进行。各推送线程的推送过程状态得以准确记录,当推送线程自身出现异常或数据推送过程出现异常,可以基于管理服务器的策略进行异常恢复或迁移,使数据推送过程更加稳定可靠。
具体实施方式
图1是本发明一种具体实施方式的基于状态管理的数据推送方法的流程图。如图所示,
步骤110,采集各个推送线程的状态。
在本发明的具体实施方式中,推送任务可以由推送服务器来实现,推送服务器需要接受控制端(例如管理服务器)的指令来执行推送线程,推送线程是将源数据库中的数据传输到目的数据库中。推送线程可以通过以下三种方式实现数据推送处理:第一,基于数据库日志,例如基于MySQL中的binlog文件,进行主数据库和从数据库之间数据复制。第二,基于数据导出文件,例如基于mysqldump导出的数据文件,实现数据迁移。第三,基于数据管道机制,例如消息队列,来实现数据的定向推送。
每一项推送任务可以包括多个推送线程,多个推送线程可以由推送任务管理器来协调、管理。任务管理器可以通过多线程系统中任何适合的线程调度程序实现,在此不再赘述。
要实现本发明更稳定的数据推送方法,则必须对推送线程的状态进行实时监控。
在步骤111,以预定周期向各推送服务器发送状态查询指令。控制端,例如可以通过管理服务器按预定时间间隔向各推送服务器发送状态查询指令。
优选地,存储并且更新各线程工作时的进度,也就是将各线程推送线程的进度状态持久化。这样,在对故障的推送线程进行异常恢复时,就可以从上一次的成功状态继续推送,而不必重新传输。
在步骤112,接收各推送服务器反馈的推送线程的状态。所述推送线程的状态可以包括能够反映推送线程的多种参数。例如:
当推送线程处于正常推送状态时:反映状态的参数包括正在推送的数据库库名、表名、当前正在推送的数据记录。对于正在推送的数据,还包括正在推送的数据中用于标识所述数据的某一字段,该字段最优选地是基于递增的时间戳字段,即:在正在推送的数据记录中,随着时间的推移,在每条数据中都插入一个当前的时间戳。
当推送线程处于异常推送状态时,例如源数据库或目的数据库无法连接时,反映状态的参数包括异常时间点、异常诊断信息。
在步骤120,当任何一个推送线程的状态异常时,对该推送线程进行故障恢复。一个推送线程的状态异常时,通常包括两种情况:
第一种情况为推送线程自身异常。管理服务器向推送服务器发出推送指令后,在推送线程正常工作时,推送服务器应该向管理服务器反馈确认信号;如果在规定时间内管理服务器未得到来自推送服务器的反馈,则将推送线程标记为异常待定状态。管理服务器会向推送服务器发送多次推送指令,如果在重试一定次数后仍然无法得到推送服务器反馈的确认信号,则可以认定推送线程异常。
第二种情况是:推送线程能够正常工作,但是无法对源数据库或目的数据库正常操作。在该种情况下,管理服务器向推送服务器发出推送指令后,推送服务器能够在规定时间内向管理服务器反馈确认信号,但是,推送线程在读取源数据库数据或向目的数据库传输数据时出现异常,即,对源数据库或目的数据库无法操作。
当任何一个推送线程的状态异常时,对该推送线程进行故障恢复。对于异常推送线程,管理服务器有两种故障恢复方式:
一是向运维人员报警,由人工介入进行故障恢复操作。
二是迁移重启推送线程,对各个推送节点的负载进行采集,在负载不高的推送节点上重启一个推送线程,并将异常任务迁移到该线程上。这种方式适用于推送服务器宕机或推送线程挂起等情况。由于先前的故障推送线程可能只是“假死”,有可能又复活,为了避免多个线程重复推送同一份数据,因此要对第一次服务器的异常推送线程做取消处理。另外,为了双重保证推送数据的准确性,推送线程内部的推送逻辑要求具备幂等性,即同一个表的数据即便被重复推送也不会出现数据上的错误情况。
具体地,在本实施方式中,故障恢复包括:将异常的推送线程从第一推送服务器转移到第二推送服务器上,并在第二推送服务器上重启所述异常停止的推送服务。第一推送服务器即正在执行异常的推送线程的推送服务器,第二服务器是其他的作为数据节点的服务器。系统中可以设置多台第二服务器,每台第二服务器上可以根据处理能力运行有多个推送线程,每个推送线程都用于数据推送任务,即把源数据库的数据通过特定的推送方式推送到目的数据库,例如基于MySQL中的binlog文件进行主数据库和从数据库之间的数据复制。
优选地,为了提高推送的效率,在第二推送服务器上重启所述异常停止的推送服务为:从上一次的成功推送状态继续推送数据。即,在出现故障后,转移后的线程接续上次已经传输的数据继续推送。
优选地,为了使得负载更加均衡,可以采集各个第二服务器的负载,将异常的推送线程从第一推送服务器转移到负载最小的第二推送服务器上,并在该第二推送服务器上重启所述异常停止的推送服务。采集各个第二服务器的负载可以由软件程序子模块来执行,所述软件程序子模块具有与各个第二服务器的数据接口,以便实时采集各推送服务器的负载数据,进而可以根据各服务器的负载对线程转移进行协调。本领域技术人员应该理解,将异常的推送线程从第一推送服务器转移到负载最小的第二推送服务器上是一种优选实施方式,在其他情况下,可以将异常的推送线程从第一推送服务器转移到其他负载较小的第二推送服务器上。
如图2所示,相应地,本发明提供了一种基于状态管理的数据推送装置。所述装置包括状态采集模块210、故障恢复模块220。
状态采集模块210用于采集各个推送线程的状态。状态采集可以包括多种可实现的信息采集方式,例如。状态采集模块210可以进一步包括状态查询子模块211、状态接收子模块212。所述状态查询子模块211用于以预定周期向各推送服务器发送状态查询指令;所述状态接收子模块212用于接收各推送服务器反馈的推送线程的状态。
故障恢复模块220用于任何一个推送线程的状态异常时,对该推送线程进行故障恢复。优选地,故障恢复模块220包括线程转移子模块221,线程转移子模块用于将异常的推送线程从第一推送服务器转移到第二推送服务器上并在第二推送服务器上重启所述异常停止的推送服务,所述第一推送服务器为正在执行异常的推送线程的推送服务器。
更优选地,故障恢复模块220包括负载分析子模块222。所述负载分析子模块222用于采集各个第二服务器的负载,将异常的推送线程从第一推送服务器转移到负载最小的第二推送服务器上,并在该第二推送服务器上重启所述异常停止的推送服务,所述第一推送服务器为正在执行异常的推送线程的推送服务器。负载分析子模块222具有接收各推送服务器的数据接口,以便实时采集各推送服务器的负载数据,使得线程转移子模块221可以对线程转移进行协调。
在一个优选实施例中,本发明还提供了一种基于状态管理的数据推送系统。在该系统中运用了上述基于状态管理的数据推送方法和装置,所述系统包括管理服务器310、推送服务器320。
本实施例中的数据推送系统采用主从方式实现,即主服务器为管理服务器310,从服务器为推送服务器320。推送服务器320上运行具体的推送线程,管理服务器310和推送服务器320之间可以定期双向交互信息,类似交互心跳信号的传输方式,以确保双方的连接正常。
管理服务器310可向推送服务器320发送的控制信息可以包括:①启动推送任务;②停止推送任务;③推送状态询问。
推送服务器320可向管理服务器310发送的信息包括:①推送服务器自身负载情况;②任务推送线程的内部推送进度;③异常状态。
从上述内容即可知晓,在本发明中,管理服务器310与推送服务器320之间的信息交互可以是双方根据预定时间间隔主动发送的,也可以是基于一方的询问的反馈。
如图3所示,图中实线箭头表示数据流,而虚线箭头表示指令流。所述数据流是经由推送服务器320,从源数据库被推送到目的数据库中。
推送服务器320用于执行数据推送线程,推送服务器上可以运行多个数据推送线程,对于多个数据推送线程可以由推送任务管理器来协调控制。所述推送任务管理器可以通过多线程系统中任何适合的线程调度程序实现,也可以通过相应的硬件控制逻辑来实现。
管理服务器310用于与各个推送服务器320之间进行交互,以便将启动推送线程、停止推送线程、查询推送现场状态的指令发送给推送服务器320,并且接收来自推送服务器320的反馈和响应。
用户在系统搭建时需要建立用于管理推送线程的管理服务器310。通过管理服务器可以对推送服务器的工作状态进行监控,同时维护状态数据库。具体的过程是:管理服务器定期向各推送服务器发送状态查询指令,并将各线程推送任务的进度状态持久化。持久化是将程序数据在持久状态和瞬时状态间转换的机制,即把如内存中的对象保存到可永久保存的存储设备(如磁盘)中。持久化的主要应用是将内存中的对象存储到关系型的数据库中。由于各线程推送任务的进度状态持久化,因此在进行异常恢复时,便可以从上一次的成功状态继续推送。
管理服务器310中设置有状态管理数据库,状态管理数据库用于存储推送服务器320发送的推送线程的状态。状态管理数据库可以由关系型数据库来实现。
推送服务器320启动后,将自身注册到管理服务器310中。根据管理服务器310的调度,推送服务器320启动相关的推送线程,并且推送线程定时向管理服务器回馈推送线程的状态。推送线程的状态需要包括如下信息:
在正常推送状态时,推送状态包括正在推送的数据库库名、表名、当前正在推送的数据记录。对于正在推送的数据记录,需要在其中通过某一字段加以标识,最优选的方式是在数据记录中增加基于递增的时间戳字段。
在异常推送状态时(比如源数据库或目的数据库无法连接),推送状态包含异常时间点、异常诊断信息。
一个推送线程的状态异常时,通常包括两种情况:第一种情况为推送线程自身异常。管理服务器310向推送服务器320发出推送指令后,在推送线程正常工作时,推送服务器320应该向管理服务器310反馈确认信号;如果在规定时间内管理服务器310未得到来自推送服务器320的反馈,则将推送线程标记为异常待定状态。管理服务器310会向推送服务器发送多次推送指令,如果在重试一定次数后仍然无法得到推送服务器320反馈的确认信号,则可以认定推送线程异常。第二种情况是:推送线程能够正常工作,但是无法对源数据库或目的数据库正常操作。在该种情况下,管理服务器向推送服务器发出推送指令后,推送服务器能够在规定时间内向管理服务器反馈确认信号,但是,推送线程在读取源数据库数据或向目的数据库传输数据时出现异常,即,对源数据库或目的数据库无法操作。
一个推送线程的状态异常时,通常包括两种情况:第一种情况为推送线程自身异常。管理服务器310向推送服务器320发出推送指令后,在推送线程正常工作时,推送服务器320应该向管理服务器310反馈确认信号;如果在规定时间内管理服务器310未得到来自推送服务器320的反馈,则将推送线程标记为异常待定状态。管理服务器310会向推送服务器发送多次推送指令,如果在重试一定次数后仍然无法得到推送服务器320反馈的确认信号,则可以认定推送线程异常。第二种情况是:推送线程能够正常工作,但是无法对源数据库或目的数据库正常操作。在该种情况下,管理服务器向推送服务器发出推送指令后,推送服务器能够在规定时间内向管理服务器反馈确认信号,但是,推送线程在读取源数据库数据或向目的数据库传输数据时出现异常,即,对源数据库或目的数据库无法操作,此种情况下,不将推送线程迁移到第二服务器,而是保留原来的推送线程,定期进行重试,并将错误状态反馈给管理服务器。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的主旨之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。