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

一种日志回放控制方法、装置以及设备

文献发布时间:2023-06-19 18:34:06


一种日志回放控制方法、装置以及设备

技术领域

本说明书涉及数据库技术领域,尤其涉及一种日志回放控制方法、装置以及设备。

背景技术

日志回放指重做数据库中的redo日志。在分布式数据库领域里,日志回放不仅用于实现多副本部署场景下,备副本与主副本的同步,也用于进行故障恢复。此外,搭建物理备库也是提高数据库高可用、高可靠的重要手段,物理备库也是通过同步日志,回放日志来重建主库的数据。

目前在进行日志回放时,为了避免出现故障,会将各日志严格按照时间顺序串行回放,由此导致日志回放效率较低,会成为系统性能的潜在瓶颈,且对宕机重启快速恢复等场景不友好。

基于此,需要效率更高且可靠的日志回放方案。

发明内容

本说明书一个或多个实施例提供一种日志回放控制方法、装置、设备以及存储介质,用以解决如下技术问题:需要效率更高且可靠的日志回放方案。

为解决上述技术问题,本说明书一个或多个实施例是这样实现的:

本说明书一个或多个实施例提供的一种日志回放控制方法,包括:

确定等待向日志流中提交的当前日志对应的阻隔类型,所述日志流中包含多个日志队列;

若所述阻隔类型为前向阻隔,则确定为所述日志流记录的当前的已提交日志数目和已回放日志数目;

判断当前的所述已提交日志数目与所述已回放日志数目是否相等;

若是,则将所述当前日志向所述日志流中提交,以使所述当前日志进入所述日志流中对应的所述日志队列中,以便与所述日志流中的其他日志队列中的日志并发回放;

否则,继续等待以便重试所述判断。

本说明书一个或多个实施例提供的一种日志回放控制装置,包括:

阻隔类型确定模块,确定等待向日志流中提交的当前日志对应的阻隔类型,所述日志流中包含多个日志队列;

日志数目确定模块,若所述阻隔类型为前向阻隔,则确定为所述日志流记录的当前的已提交日志数目和已回放日志数目;

日志数目比对模块,判断当前的所述已提交日志数目与所述已回放日志数目是否相等;

日志提交队列模块,若是,则将所述当前日志向所述日志流中提交,以使所述当前日志进入所述日志流中对应的所述日志队列中,以便与所述日志流中的其他日志队列中的后续日志并发回放;

判断等待重试模块,否则,继续等待以便重试所述判断。

本说明书一个或多个实施例提供的一种日志回放控制设备,包括:

至少一个处理器;以及,

与所述至少一个处理器通信连接的存储器;其中,

所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够:

确定等待向日志流中提交的当前日志对应的阻隔类型,所述日志流中包含多个日志队列;

若所述阻隔类型为前向阻隔,则确定为所述日志流记录的当前的已提交日志数目和已回放日志数目;

判断当前的所述已提交日志数目与所述已回放日志数目是否相等;

若是,则将所述当前日志向所述日志流中提交,以使所述当前日志进入所述日志流中对应的所述日志队列中,以便与所述日志流中的其他日志队列中的后续日志并发回放;

否则,继续等待以便重试所述判断。

本说明书一个或多个实施例提供的一种非易失性计算机存储介质,存储有计算机可执行指令,所述计算机可执行指令设置为:

确定等待向日志流中提交的当前日志对应的阻隔类型,所述日志流中包含多个日志队列;

若所述阻隔类型为前向阻隔,则确定为所述日志流记录的当前的已提交日志数目和已回放日志数目;

判断当前的所述已提交日志数目与所述已回放日志数目是否相等;

若是,则将所述当前日志向所述日志流中提交,以使所述当前日志进入所述日志流中对应的所述日志队列中,以便与所述日志流中的其他日志队列中的后续日志并发回放;

否则,继续等待以便重试所述判断。

本说明书一个或多个实施例采用的上述至少一个技术方案能够达到以下有益效果:提出了一种包含多个日志队列的日志流结构,将各日志分别提交到这多个日志队列中对应的日志队列中,在提交过程中可以通过日志与队列之间的合理映射,在各队列内确保一个正确的日志回放顺序,进而再通过这多个队列将多个日志进行并行回放,从而既提高了日志回放效率,也给予了基本的可靠性保证;不仅如此,针对日志流整体及时地记录了已提交日志数目和已回放日志数目,通过比对这两个数目,能够高效地对待提交的前向阻隔日志验证,以确定是否满足了提交条件,从而能够精准地控制前向阻隔日志正确回放,有效地避免了在并发回放的过程中错误地提前提交前向阻隔日志,进一步提高了日志回放可靠性。

附图说明

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

图1为本说明书一个或多个实施例提供的一种日志回放控制方法的流程示意图;

图2为本说明书一个或多个实施例提供的一种实际应用场景下,图1中日志流的内部结构示意图;

图3为本说明书一个或多个实施例提供的对应于图2的一种日志回放控制具体实施方案的流程示意图;

图4为本说明书一个或多个实施例提供的一种日志回放控制装置的结构示意图;

图5为本说明书一个或多个实施例提供的一种日志回放控制设备的结构示意图。

具体实施方式

本说明书实施例提供一种日志回放控制方法、装置、设备以及存储介质。

为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本说明书实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

在实际应用中,尤其是对于分布式数据库,由于串行回放日志效率过低,发明人提出了一种包含多个日志队列的日志流结构,以尝试通过多队列将日志进行并行回放,以提高回放效率。不过,为了保证回放正确性,发明人还进一步考虑了特殊情况,比如,对于同一个事务的日志,为了保证事务正确执行,需要对同一个事务的日志进行串行回放;不仅如此,在实际应用中,发明人还用到了一些特殊的日志,额外带来了一些特殊需求,是由于日志之间可能存在的相互依赖和制约关系引发这些特殊需求的。

其中一类日志的特殊需求包括:该日志在回放前,需要等待其前序所有日志均回放完成,它才能够回放。也即,前向的那些日志阻隔了该日志及时回放,因此,将这样的日志称为前向阻隔日志,并定义了阻隔类型来表示这样的情况,将前向阻隔日志对应的阻隔类型称为前向阻隔。比如,下线日志就属于前向阻隔日志。

另一类日志的特殊需求包括:该日志在回放完成前,后续所有日志均等待,暂时不能回放。也即,该日志阻隔了后向的那些日志及时回放,因此,将这样的日志称为后向阻隔日志,将后向阻隔日志对应的阻隔类型称为后向阻隔。比如,元信息变更日志就属于后向阻隔日志。

类似地,可能还会有一类日志同时有上面列举的两种特殊需求,将这样的日志称为双向阻隔日志,双向阻隔日志对应的阻隔类型既是前向阻隔也是后向阻隔。比如,开启服务日志就属于双向阻隔日志。

在实际应用中,上面这些有特殊需求的日志在全部日志中所占比例可能并不高,甚至可能很低,但是,一旦出现就可能给日志并行回放带来风险。基于此,发明人进一步提供了解决方案,通过精准地对日志并行回放进行控制,兼顾了日志回放效率和可靠性。下面基于这样的思路,继续详细说明。

图1为本说明书一个或多个实施例提供的一种日志回放控制方法的流程示意图。可以由数据库的相关设备执行,比如,分布式数据库的服务器等。

图1中的流程包括以下步骤:

S102:确定等待向日志流中提交的当前日志对应的阻隔类型,所述日志流中包含多个日志队列。

在本说明书一个或多个实施例中,以日志流作为日志的一种组织单元,在单个日志流中,可以通过连续递增的序号来标识日志,日志的编号在单个日志流中唯一。按时序将回放的各日志向日志流中提交,其中可能存在有上述特殊需求的日志(简称为特殊日志,具有上述的至少一种阻隔类型),若这样的日志具有上述的阻隔类型,则适应于阻隔类型,进行相应的特殊处理。而对于没有上述特殊需求的日志,在不妨碍特殊日志的情况下,可以直接提交到日志流中对应的日志队列中。每个日志在这多个日志队列中唯一对应一个日志队列。

前面已经提到,对于同一个事务的日志,需要进行串行回放。为了实现这个需求,对于等待向日志流中提交的当前日志,确定当前日志中记录的事务标识,计算事务标识的摘要(比如,哈希值),通过根据日志流中的多个日志队列,对摘要进行相应的取模(比如,取日志队列数目的模)映射,确定摘要在多个日志队列中对应的一个日志队列,之后,若能够提交当前日志了,则将当前日志向日志流中提交,以使当前日志进入该对应的一个日志队列中,通过这种方式使得同一个事务的全部日志对应于同一个日志队列,以便依次串行提交进入该日志队列以及后续串行回放,而不同事务的日志则可以通过不同的日志队列并发回放。本段的处理可以无关当前日志是否具有阻隔类型,也无关当前日志属于哪种阻隔类型,只要是属于同一个事务的日志,即可进行这样的处理。

需要说明的是,同一个事务的日志可能具有阻隔类型,也可能不具有阻隔类型;若具有阻隔类型,则也需要也适应于阻隔类型,进行相应的特殊处理。当然,若仅通过特殊处理,直接实现了使得同一个事务的至少部分日志正确地串行回放,那么对于这部分日志,未必需要进行上述的摘要取模映射操作,从而避免浪费资源。

倘若某日志与其他日志之间并没有相互依赖和制约关系(至少需满足:该某日志不属于包含多个日志的同一个事务,该某日志也不具有上述的阻隔类型),则处理方式就可以相对简单,比如,可以考虑将该某日志随机提交至其中一个日志队列中,这样的日志有助于更顺畅地进行日志并发回放,在实际应用中可能有大量这样的日志。

在本说明书一个或多个实施例中,在日志内新增了阻隔类型字段,若日志具有阻隔类型,则可以将其阻隔类型字段相应赋值,以便在执行步骤S102时通过查询该字段便利地实现类型判断。在图1中流程中,至少考虑了前向阻隔这种阻隔类型。

S104:若所述阻隔类型为前向阻隔,则确定为所述日志流记录的当前的已提交日志数目和已回放日志数目。

在本说明书一个或多个实施例中,通过相应的字段,即时为日志流记录当前的已提交日志数目和已回放日志数目,用于针对前向阻隔日志(即S104情况下的当前日志)进行特殊处理。每当一个日志提交进入该日志流中,则将已提交日志数目加1,每当该日志流中的一个日志回放完成,则将已回放日志数目加1。

S106:判断当前的所述已提交日志数目与所述已回放日志数目是否相等。

在本说明书一个或多个实施例中,提交日志进入日志流中这一操作是串行的,在这种情况下,对于前向阻隔日志而言,只要先于其提交的全部日志均已提交并回放完毕,即可回放该前向阻隔日志,则通过比较已提交日志数目与已回放日志数目是否相等,来高效便利地判断当前是否已经可以回放该前向阻隔日志。

S108:若是,则将所述当前日志向所述日志流中提交,以使所述当前日志进入所述日志流中对应的所述日志队列中,以便与所述日志流中的其他日志队列中的日志并发回放。

在本说明书一个或多个实施例中,为了精准可靠地控制,对前向阻隔日志进行了更严格的限制,即,在即时确定出提交日志数目与已回放日志数目相等之前,不仅暂不允许该前向阻隔日志回放,甚至暂不允许该前向阻隔日志提交。

原因在于,若允许了该前向阻隔日志提交进入了日志流中,则已提交日志数目会相应变化,从而影响判断,不仅如此,在该前向阻隔日志提交后进行上述判断前,后续日志可能也会提交进来,进一步影响已提交日志数目,使得比对结果变得更不可靠;而若暂不允许该前向阻隔日志提交,则后续日志也暂时无法提交,日志流中只会回放存量的已提交日志,已提交日志数目暂时不再变化,已回放日志数目则逼近已提交日志数目,直至两者相等,之后再将该前向阻隔日志提交以及进行回放即可,这个过程是比较稳定而且十分可靠的。

任意时刻,对于日志流中多个日志队列中当前排头的日志而言,若这些排头日志之间没有依赖和制约关系,则可以并发回放。

在本说明书一个或多个实施例中,若该前向阻隔日志也属于某事务的日志,则其具有相应的事务标识,按照前面对事务日志的处理方式提交。具体包括:确定当前日志中记录的事务标识,计算事务标识的摘要,通过根据日志流中的多个日志队列,对摘要进行相应的取模映射,确定摘要在这多个日志队列中对应的一个日志队列,将当前日志向日志流中提交,以使当前日志进入该对应的一个日志队列中。

S110:否则,继续等待以便重试所述判断。

根据前面说明可知,若当前的已提交日志数目与已回放日志数目不相等,则表示日志流中还有存量的日志尚未回放完成,则该前向阻隔日志需要继续等待,尚不能提交至日志流中。在继续等待的过程中,可以重试进行步骤S106中的判断,以便及时掌握该前向阻隔日志的提交条件是否满足的最新状况。

通过图1的方法,提出了一种包含多个日志队列的日志流结构,将各日志分别提交到这多个日志队列中对应的日志队列中,在提交过程中可以通过日志与队列之间的合理映射,在各队列内确保一个正确的日志回放顺序,进而再通过这多个队列将多个日志进行并行回放,从而既提高了日志回放效率,也给予了基本的可靠性保证;不仅如此,针对日志流整体及时地记录了已提交日志数目和已回放日志数目,通过比对这两个数目,能够高效地对待提交的前向阻隔日志验证,以确定是否满足了提交条件,从而能够精准地控制前向阻隔日志正确回放,有效地避免了在并发回放的过程中错误地提前提交前向阻隔日志,进一步提高了日志回放可靠性。

基于图1的方法,本说明书还提供了该方法的一些具体实施方案和扩展方案,下面继续进行说明。

图1中的流程主要考虑了前向阻隔这种类型,如前所述,还可能使用到后向阻隔日志,甚至使用到双向阻隔日志,则针对后向阻隔进一步提供了对应的特殊处理。下面进行说明。

在本说明书一个或多个实施例中,针对后续阻隔,为日志流维护了后向状态标识符,在后向状态标识符的状态即时变化的指示下,精准可靠地控制后向阻隔日志和双向阻隔日志的提交和回放。

后向状态标识符至少有两个可选的取值,为了便于描述分别称为第一值、第二值。第一值所表明的状态包括:日志流中当前不存在等待回放(在回放完成前都属于等待回放)的阻隔类型为后向阻隔的日志。第二值所表明的状态包括:日志流中当前存在等待回放的阻隔类型为后向阻隔的日志。初始时后向状态标识符的取值为第一值,因为此时日志均尚未进入日志流中。

基于此,在确定等待向日志流中提交的当前日志对应的阻隔类型之后,若阻隔类型为后向阻隔(为了便于描述,可以将这种情况下的当前日志称为该后向阻隔日志),则获取为日志流记录的后向状态标识符,判断后向状态标识符的取值是否为第一值;若是,则将后向状态标识符的取值置为第二值,并相应地将当前日志向日志流中提交;在提交的当前日志回放完成后,将后向状态标识符的取值置回第一值。这里,通过为该后向阻隔日志将后向状态标识符的取值从第一值置为第二值,并将该后向阻隔日志提交,使得该后向阻隔日志实现了在日志流中的优先占位,在该第二值的维持期间,相较于该后向阻隔日志的后续日志,该后向阻隔日志具有了优先回放的地位,在回放后续日志前,需要判断后向状态标识符的取值是否为第一值,若是,表示该后向阻隔日志已经回放完成,则可以回放后续日志,否则,表示该后向阻隔日志尚未回放完成,则先不回放后续日志,而是继续等待后向状态标识符的取值被置回第一值,之后再回放后续日志。

对于该后向阻隔日志,在判断后向状态标识符的取值是否为第一值时,若确定出该取值为第二值,则表示日志流中当前还有阻隔类型同为后向阻隔的另一个日志,该后向阻隔日志属于该另一个日志的后续日志,此时不适合将该后向阻隔日志提交至日志流中,如果这么做的话会使得后向状态标识符无法明确地表现出:此刻到底是该另一个日志在优先占位,还是该后向阻隔日志在优先占位。

上一段是在说该后向阻隔日志作为该另一个日志的后续日志的情况,以此类推,对于该后向阻隔日志自身的后续日志而言,也进行类似的处理,不过情况会相对更复杂一些。若该后续日志的阻隔类型也是后向阻隔,则在后向状态标识符的取值被置回第一值前,该后续日志不能被提交至日志流中,当然也无法回放;而若该后续日志的阻隔类型不是后向阻隔,则在后向状态标识符的取值被置回第一值前,后续日志可以被提交至日志流中,不过需要等待回放。

根据上面几段的分析,总结一下。若当前日志的阻隔类型为后向阻隔,在判断后向状态标识符的取值是否为第一值之后,若根据判断的结果,确定后向状态标识符的取值为第二值,则继续等待后向状态标识符的取值被置回第一值,在继续等待的期间,不将当前日志向日志流中提交。进一步的,若当前日志的阻隔类型为后向阻隔,在相应地将当前日志向日志流中提交之后,执行:若有后续日志已被提交进入日志流中,在要回放后续日志时,判断后向状态标识符的取值是否为第一值;若是,则回放后续日志,否则,先不回放后续日志,而是继续等待后向状态标识符的取值被置回第一值。

上面分别对前向阻隔日志和后向阻隔日志的特殊处理进行了说明,而对于双向阻隔日志参照这些特殊处理执行即可。比如,在确定等待向日志流中提交的当前日志对应的阻隔类型之后,若确定同一个当前日志的阻隔类型既是前向阻隔也是后向阻隔(即双向阻隔),则针对该同一个当前日志,将前向阻隔对应的应对处理与后向阻隔对应的应对处理均执行。

为了便于理解,更直观地提供了一种实际应用场景下的具体实施方案,结合图2、图3进行说明。

图2为本说明书一个或多个实施例提供的一种实际应用场景下,图1中日志流的内部结构示意图。

在图2中,单个日志流中包含多个日志队列,日志队列的数目决定了日志回放的最大并发数,每个日志队列中从下到上表示日志进入队列的顺序,每一个格子表示一个日志,格子中的编号表示日志的编号。

假定5号日志是一个前向阻隔日志,那么,5号日志必须等待1号到4号日志均回放完成后才能够回放。

假定7号日志是一个后向阻隔日志,那么,在7号日志回放完成之前,8号及之后的日志均不能回放。

假定6号日志是一个双向阻隔日志,那么,6号日志的回放需要等待1号到5号日志均回放完成,且7号及之后的日志的回放需要等待6号日志回放完成。

为了日志流维护了三个参数。第一个参数比如记作“submit_cnt_”,表示上述的已提交日志数目;第二个参数比如记作“replay_cnt_”,表示上述的已回放日志数目;第三个参数比如记作“barrier_status_”,表示上述的后向状态标识符,barrier_status_至少有两个可选的取值,比如其中一个记作“NO_BARRIER”,表示上述的第一值,另一个记作“POST_BARRIER”,表示上述的第二值,初始时,barrier_status_的取值为NO_BARRIER。还可以为阻隔日志维护字段,以表示阻隔日志对应的阻隔类型。

图3为本说明书一个或多个实施例提供的对应于图2的一种日志回放控制具体实施方案的流程示意图。对于事务日志与阻隔日志的处理并不冲突,时序可以是灵活的,示例性地假定先针对事务日志进行了日志队列映射处理,之后再判断阻隔类型。需要说明的是,对于不具有阻隔类型的普通日志适应性地处理即可,相应步骤在图中省略了未示出。

图3中的流程包括以下步骤:

获取等待向包含多个日志队列的日志流中提交的当前日志;

判断当前日志是否为事务日志;若是,则获取当前日志的事务标识并求哈希值,对哈希值取模向这日志队列中映射,确定当前日志应提交进入的那个日志队列,继续执行步骤;否则,继续执行步骤;

判断当前日志对应的阻隔类型是前向阻隔还是后向阻隔;

若是前向阻隔,则判断submit_cnt_与replay_cnt_是否相等;若相等,则可以将当前日志向日志流中对应的日志队列提交;若不相等,则等待重试。如此,保证了前向barrier日志回放之前,所有日志队列中的回放任务均已清空。

若是后向阻隔,判断barrier_status的取值是否为NO_BARRIER;若是NO_BARRIER,则将barrier_status的取值置为POST_BARRIER,并将当前日志向日志流中对应的日志队列提交;而若是POST_BARRIER,则继续等待barrier_status的取值被置回NO_BARRIER;进一步地,当前日志的后续日志在回放前,也判断barrier_status的取值是否为NO_BARRIER,若是,则正常回放,否则,等待重试。

若当前日志为双向阻隔日志,则对上面两条步骤分支均执行即可。

基于同样的思路,本说明书一个或多个实施例还提供了上述方法对应的装置和设备,如图4、图5所示。装置和设备能够相应执行上述方法及相关的可选方案。

图4为本说明书一个或多个实施例提供的一种日志回放控制装置的结构示意图,所述装置包括:

阻隔类型确定模块402,确定等待向日志流中提交的当前日志对应的阻隔类型,所述日志流中包含多个日志队列;

日志数目确定模块404,若所述阻隔类型为前向阻隔,则确定为所述日志流记录的当前的已提交日志数目和已回放日志数目;

日志数目比对模块406,判断当前的所述已提交日志数目与所述已回放日志数目是否相等;

日志提交队列模块408,若是,则将所述当前日志向所述日志流中提交,以使所述当前日志进入所述日志流中对应的所述日志队列中,以便与所述日志流中的其他日志队列中的后续日志并发回放;

判断等待重试模块410,否则,继续等待以便重试所述判断。

可选地,所述日志提交队列模块408,确定所述当前日志中记录的事务标识;

计算所述事务标识的摘要,通过根据所述多个日志队列,对所述摘要进行相应的取模映射,确定所述摘要在所述多个日志队列中对应的一个日志队列;

将所述当前日志向所述日志流中提交,以使所述当前日志进入所述对应的一个日志队列中。

可选地,后向状态处理模块412,在所述确定等待向日志流中提交的当前日志对应的阻隔类型之后,若所述阻隔类型为后向阻隔,则获取为所述日志流记录的后向状态标识符;

判断所述后向状态标识符的取值是否为第一值,所述第一值表明所述日志流中当前不存在等待回放的阻隔类型为后向阻隔的日志;

若是,则将所述后向状态标识符的取值置为第二值,并相应地将所述当前日志向所述日志流中提交,所述第二值表明所述日志流中存在等待回放的阻隔类型为后向阻隔的日志;

在提交的所述当前日志回放完成后,将所述后向状态标识符的取值置回所述第一值。

可选地,所述后向状态处理模块412,在所述判断所述后向状态标识符的取值是否为第一值之后,若根据所述判断的结果,确定所述后向状态标识符的取值为所述第二值,则继续等待所述后向状态标识符的取值被置回所述第一值,在所述继续等待的期间,不将所述当前日志向所述日志流中提交。

可选地,所述后向状态处理模块412,在所述相应地将所述当前日志向所述日志流中提交之后,若有后续日志已被提交进入所述日志流中,在要回放所述后续日志时,判断所述后向状态标识符的取值是否为所述第一值;

若是,则回放所述后续日志;

否则,先不回放所述后续日志,而是继续等待所述后向状态标识符的取值被置回所述第一值。

可选地,还包括:

双向状态处理模块414,在所述确定等待向日志流中提交的当前日志对应的阻隔类型之后,若同一个所述当前日志的所述阻隔类型既是前向阻隔也是后向阻隔,则针对所述同一个所述当前日志,将前向阻隔对应的应对处理与后向阻隔对应的应对处理均执行。

可选地,所述日志提交队列模块408,若确定所述当前日志不属于具有阻隔类型的日志,或阻隔类型不为前向阻隔,在将所述当前日志向所述日志流中提交时,确定所述当前日志中记录的事务标识;

计算所述事务标识的摘要,通过根据所述多个日志队列,对所述摘要进行相应的取模映射,确定所述摘要在所述多个日志队列中对应的一个日志队列;

将所述当前日志向所述日志流中提交,以使所述当前日志进入所述对应的一个日志队列中。

图5为本说明书一个或多个实施例提供的一种日志回放控制设备的结构示意图,所述设备包括:

至少一个处理器;以及,

与所述至少一个处理器通信连接的存储器;其中,

所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够:

确定等待向日志流中提交的当前日志对应的阻隔类型,所述日志流中包含多个日志队列;

若所述阻隔类型为前向阻隔,则确定为所述日志流记录的当前的已提交日志数目和已回放日志数目;

判断当前的所述已提交日志数目与所述已回放日志数目是否相等;

若是,则将所述当前日志向所述日志流中提交,以使所述当前日志进入所述日志流中对应的所述日志队列中,以便与所述日志流中的其他日志队列中的后续日志并发回放;

否则,继续等待以便重试所述判断。

基于同样的思路,本说明书一个或多个实施例还提供了一种非易失性计算机存储介质,存储有计算机可执行指令,所述计算机可执行指令设置为:

确定等待向日志流中提交的当前日志对应的阻隔类型,所述日志流中包含多个日志队列;

若所述阻隔类型为前向阻隔,则确定为所述日志流记录的当前的已提交日志数目和已回放日志数目;

判断当前的所述已提交日志数目与所述已回放日志数目是否相等;

若是,则将所述当前日志向所述日志流中提交,以使所述当前日志进入所述日志流中对应的所述日志队列中,以便与所述日志流中的其他日志队列中的后续日志并发回放;

否则,继续等待以便重试所述判断。

在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。

控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。

上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。

为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书时可以把各单元的功能在同一个或多个软件和/或硬件中实现。

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

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

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

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

在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。

本说明书可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、设备、非易失性计算机存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

以上所述仅为本说明书的一个或多个实施例而已,并不用于限制本说明书。对于本领域技术人员来说,本说明书的一个或多个实施例可以有各种更改和变化。凡在本说明书的一个或多个实施例的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本说明书的权利要求范围之内。

技术分类

06120115615278