[0001]
本申请涉及计算机软件技术领域,特别涉及一种离线节点上线业务恢复方法、装置、设备及一种可读存储介质。
背景技术:[0002]
对于非单控存储系统(包括双控存储系统以及多控存储系统)来说,存储集群系统作为完整系统对外提供服务,组成集群的每一个节点都有可能因为故障脱离集群,脱离集群之后,可能会通过重启,上电等操作,实现重新上线,加入集群。
[0003]
节点掉线再上线后,系统需要对上线节点进行处理以恢复业务,相关技术的实现通常是通过配置文件进行集群、存储池、卷的重新创建进而恢复整个集群,创建过程中涉及到较多初始化相关的操作,耗时较长;同时因为重建的过程中,原先集群中的节点需要先删除原先节点的配置项,释放相关的资源,然后再对新节点进行相关配置的恢复,整个过程比较繁琐,容易出现问题,对于系统运行的稳定性带来威胁。
[0004]
因此,如何针对上线节点快速稳定的实现业务恢复,是本领域技术人员急需解决的问题。
技术实现要素:[0005]
本申请的目的是提供离线节点上线业务恢复方法,该方法可以针对上线节点快速稳定的实现业务恢复;本申请的另一目的是提供离线节点上线业务恢复装置、设备及一种可读存储介质。
[0006]
为解决上述技术问题,本申请提供一种离线节点上线业务恢复方法,包括:
[0007]
接收到节点上线通知后,将ishanding标记位设置为节点事件处理状态,并暂停当前执行回收任务的子模块的任务处理进程;
[0008]
在存储池中计算生成并标记trimowner节点;
[0009]
确定当前上线节点的节点身份,并根据所述节点身份调用所述trimowner节点进行池容量和块状态的更新;
[0010]
启动所述任务处理进程,并恢复任务的接收。
[0011]
可选地,所述确定当前上线节点的节点身份,并根据所述节点身份调用所述trimowner节点进行池容量和块状态的更新,包括:
[0012]
确定存储池的前master节点,并标记新master节点;
[0013]
判断所述当前上线节点是否为所述新master节点和/或前master节点,生成判断结果;
[0014]
根据所述判断结果识别节点身份,并根据所述节点身份调用所述trimowner节点进行池容量和块状态的更新。
[0015]
可选地,根据判断结果识别节点身份,并根据所述节点身份调用所述trimowner节点进行池容量和块状态的更新,包括:
[0016]
若所述当前上线节点同时为所述新master节点以及所述前master节点,判定所述当前上线节点始终为所述存储池的master节点,则池容量和块状态的更新结束;
[0017]
若所述当前上线节点为所述新master节点,而非所述前master节点,判定所述当前上线节点为刚上线的master节点,则调用所述trimowner节点清空所述当前上线节点的block状态,向所述前master节点获取不为idle的block状态记录,根据所述block状态记录更新所述当前上线节点的状态,调用lsa模块设置最近分配的节点状态;
[0018]
若所述当前上线节点非所述新master节点,而为所述前master节点,判定所述当前上线节点在当前上线中由master节点变更为slave节点,则调用所述lsa模块进行节点状态更新;
[0019]
若所述当前上线节点非所述新master节点,且非所述前master节点,判定所述当前上线节点为新节点,则池容量和块状态的更新结束。
[0020]
可选地,所述启动所述任务处理进程,并恢复任务的接收,包括:
[0021]
设置postreclaimblockreqflag标识以及trimfailedblockreqflag标识为true,并恢复iomutex标识和gcstatus标识为normal。
[0022]
本申请还提供了一种离线节点上线业务恢复装置,该装置包括:
[0023]
io静默处理单元,用于接收到节点上线通知后,将ishanding标记位设置为节点事件处理状态,并暂停当前执行回收任务的子模块的任务处理进程;
[0024]
节点生成单元,用于在存储池中计算生成并标记trimowner节点;
[0025]
状态更新单元,用于确定当前上线节点的节点身份,并根据所述节点身份调用所述trimowner节点进行池容量和块状态的更新;
[0026]
状态恢复单元,用于启动所述任务处理进程,并恢复任务的接收。
[0027]
可选地,所述状态更新单元,包括:
[0028]
节点确定子单元,用于确定存储池的前master节点,并标记新master节点;
[0029]
判断子单元,用于判断所述当前上线节点是否为所述新master节点和/或前master节点,生成判断结果;
[0030]
更新子单元,用于根据所述判断结果识别节点身份,并根据所述节点身份调用所述trimowner节点进行池容量和块状态的更新。
[0031]
可选地,所述更新子单元,包括:
[0032]
第一处理子单元,用于若所述当前上线节点同时为所述新master节点以及所述前master节点,判定所述当前上线节点始终为所述存储池的master节点,则池容量和块状态的更新结束;
[0033]
第二处理子单元,用于若所述当前上线节点为所述新master节点,而非所述前master节点,判定所述当前上线节点为刚上线的master节点,则调用所述trimowner节点清空所述当前上线节点的block状态,向所述前master节点获取不为idle的block状态记录,根据所述block状态记录更新所述当前上线节点的状态,调用lsa模块设置最近分配的节点状态;
[0034]
第三处理子单元,用于若所述当前上线节点非所述新master节点,而为所述前master节点,判定所述当前上线节点在当前上线中由master节点变更为slave节点,则调用所述lsa模块进行节点状态更新;
[0035]
第四处理子单元,用于若所述当前上线节点非所述新master节点,且非所述前master节点,判定所述当前上线节点为新节点,则池容量和块状态的更新结束。
[0036]
可选地,所述状态恢复单元具体用于:设置postreclaimblockreqflag标识以及trimfailedblockreqflag标识为true,并恢复iomutex标识和gcstatus标识为normal。
[0037]
本申请还提供了一种离线节点上线业务恢复设备,包括:
[0038]
存储器,用于存储计算机程序;
[0039]
处理器,用于执行所述计算机程序时实现所述的离线节点上线业务恢复方法的步骤。
[0040]
本申请还提供了一种可读存储介质,所述可读存储介质上存储有程序,所述程序被处理器执行时实现所述的离线节点上线业务恢复方法的步骤。
[0041]
本申请所提供的离线节点上线业务恢复方法,不需要通过原先的集群备份配置重新创建新的存储池、卷等,在集群中离线的节点重新上线后,通过与集群中的节点分阶段通信,获取、同步块相关的tirmowner节点、池容量和块状态信息,能够快速进行业务恢复,同时通过存活节点处理对端节点上线事件,保证上层业务不中断,不会对原先集群中存在的节点产生影响,可以保障原有业务的正常运行。
[0042]
本申请还提供了一种离线节点上线业务恢复装置、设备及一种可读存储介质,具有上述有益效果,在此不再赘述。
附图说明
[0043]
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
[0044]
图1为本申请实施例提供的一种离线节点上线业务恢复方法的流程图;
[0045]
图2为本申请实施例提供的一种离线节点上线业务恢复装置的结构框图;
[0046]
图3为本申请实施例提供的一种离线节点上线业务恢复设备的结构示意图。
具体实施方式
[0047]
本申请的核心是提供离线节点上线业务恢复方法,该方法可以针对上线节点快速稳定的实现业务恢复;本申请的另一核心是提供离线节点上线业务恢复装置、设备及一种可读存储介质。
[0048]
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
[0049]
非单控存储系统(包括双控以及多控)中的节点离线后,剩余节点要通过对节点离线的处理保证系统持续提供服务,保证业务不中断。
[0050]
当离线节点恢复,变成上线状态之后,原先在线节点会对对端节点的上线事件进行处理,恢复原先双控集群的状态,保证业务快速恢复,避免长时间中断。
[0051]
本申请中在处理节点上线事件时,主要包括以下几个步骤,请参考图1,图1为本实施例提供的一种离线节点上线业务恢复方法的流程图,该方法主要包括以下步骤:
[0052]
步骤s110、接收到节点上线通知后,将ishanding标记位设置为节点事件处理状态,并暂停当前执行回收任务的子模块的任务处理进程;
[0053]
节点上线通知的发起方本实施例中不做限定,即触发上线处理流程的条件不做限定,比如可以在元数据模块完成离线事件处理之后触发上线处理流程。
[0054]
上线处理流程的执行方可以为ssd盘中的垃圾回收处理模块(garbage collection,简称为gc),在本方法涉及的全闪存储阵列中,可以调用该模块作为软件实现的、主动实现对于block数据进行迁移和回收。
[0055]
上线处理流程中首先设置ishanding标记位,将ishanding标记位设置为节点事件处理状态,以表明有新节点上线,需要开始处理节点事件,不再接收新的迁移回收任务;然后暂停当前执行回收任务的子模块的任务处理进程,包括依次设置mirrorblock、syncblock、reclaimblock、synccandidateblock、synctrimblock、updatecandidate、fillcandididateblock、trimmingblock、peergrainmetareq、iomutex等各个正在执行的回收任务的子模块的状态为stopped状态(本实施例中对暂停的正在执行回收任务的子模块数量不做限定,仅以上述子模块情形为例),以在当前阶段暂停相关子模块接受新的处理任务,以实现io静默,保障在池容量和块状态的更新不会被其它节点的处理所干扰,同时避免上线节点的处理对于原有业务造成影响,保障系统业务的稳定处理。
[0056]
步骤s120、在存储池中计算生成并标记trimowner节点;
[0057]
计算生成并标记trimowner节点,计算与生成过程可以在io互斥子模块中进行,本实施例中对此不做限定,trimowner节点主要用于执行trim操作,实现块的清零。
[0058]
步骤s130、确定当前上线节点的节点身份,并根据节点身份调用trimowner节点进行池容量和块状态的更新;
[0059]
确定当前上线节点的节点身份,节点身份为指示该节点,不同的节点身份下对应的池容量和块状态的更新方式不同,根据节点身份启动相应的更新池容量和块状态流程。
[0060]
节点身份的划分以及其对应的处理流程的设置本实施例中不做限定,可以根据实际节点更新需要进行相应的设定。可选地,节点身份可以包括:刚上线的新节点、master节点、变更slave节点以及刚上线的slave节点等,择更新流程可以根据该身份进行相应的设定,在此不再赘述。
[0061]
步骤s140、启动任务处理进程,并恢复任务的接收。
[0062]
重新启动在一开始暂停的回收任务,并恢复任务的正常接收,以保障系统的重新正常运行。
[0063]
本实施例中对于重启任务处理进程以及恢复接收的实现方式不做限定,可选地,可以通过直接设置标志位的形式,具体地,设置postreclaimblockreqflag标识以及trimfailedblockreqflag标识为true,用于重试在io静默阶段暂停的回收任务;并恢复iomutex标识和gcstatus标识为normal,以恢复任务的正常接收。本实施例中仅以上述业务恢复实现方式为例进行介绍,其它实现方式均可参照本实施例的介绍,在此不再赘述。
[0064]
需要说明的是,本申请提供的节点上线事件的处理也是按照精简池的粒度进行处理,每个池并行进行事件处理,不存在共同依赖关系。
[0065]
基于上述介绍,本实施例提供的离线节点上线业务恢复方法中,不需要通过原先的集群备份配置重新创建新的存储池、卷等,在集群中离线的节点重新上线后,通过与集群中的节点分阶段通信,获取、同步块相关的tirmowner节点、池容量和块状态信息,能够快速进行业务恢复,同时通过存活节点处理对端节点上线事件,保证上层业务不中断,不会对原先集群中存在的节点产生影响,可以保障原有业务的正常运行。
[0066]
上述实施例中对于确定当前上线节点的节点身份,并根据节点身份调用trimowner节点进行池容量和块状态的更新的实现过程不做限定,可选地,一种实现步骤如下:
[0067]
(1)确定存储池的前master节点,并标记新master节点;
[0068]
确定存储池的前master节点,即前一个master节点,并标记出池的新master节点,即当前的master节点,新master节点用于分配块。
[0069]
(2)判断当前上线节点是否为新master节点和/或前master节点,生成判断结果;
[0070]
(3)根据判断结果识别节点身份,并根据节点身份调用trimowner节点进行池容量和块状态的更新。
[0071]
如果当前池的新master节点就是本节点,而且本池的前master节点也是本节点时,说明本节点一直都是该pool的master节点;如果当前节点的新master节点是本节点,并且该池的前master节点是对端节点时,说明本节点是刚上线的节点,并且是池的master节点;如果当前池的新master节点不是本端节点,本端节点是老的master节点,说明本端节点在本次上线过程中,由该池的master节点变更成池的slave节点;如果当前池的新master节点不是本节点,并且池的前master节点也不是本节点时,说明本节点是作为slave节点刚上线。
[0072]
通过将当前上线节点与新master节点以及前master节点进行比对,不仅可以确定节点身份,同时可以区分不同的更新流程。
[0073]
需要说明的是,本实施例中仅以上述节点身份确定方式为例进行介绍,其它确定方式均可参照本实施例的介绍,在此不再赘述。
[0074]
可选地,步骤(3)根据判断结果识别节点身份,并根据节点身份调用trimowner节点进行池容量和块状态的更新具体可以按照以下步骤来实现:
[0075]
(3.1)若当前上线节点同时为新master节点以及前master节点,判定当前上线节点始终为存储池的master节点,则池容量和块状态的更新结束;
[0076]
如果当前池的新master节点就是本节点,而且本池的前master节点也是本节点时,说明本节点一直都是该pool的master节点,不需要恢复block的状态和容量,设置过程完成。
[0077]
(3.2)若当前上线节点为新master节点,而非前master节点,判定当前上线节点为刚上线的master节点,则调用trimowner节点清空当前上线节点的block状态,向前master节点获取不为idle的block状态记录,根据block状态记录更新当前上线节点的状态,可以调用lsa模块设置最近分配的节点状态;
[0078]
如果当前节点的新master节点是本节点,并且该池的前master节点是对端节点时,说明本节点是刚上线的节点,并且是池的master节点,调用trimowner节点先清空本节点的block状态,然后发送消息从对端节点获取不为idle的block状态记录,然后更新本端
节点的状态,最后在通过lsa模块设置最近分配的节点状态。
[0079]
(3.3)若当前上线节点非新master节点,而为前master节点,判定当前上线节点在当前上线中由master节点变更为slave节点,则调用lsa模块进行节点状态更新;
[0080]
如果当前池的新master节点不是本端节点,本端节点是老的master节点,说明本端节点在本次上线过程中,由该池的master节点变更成池的slave节点。本节点的状态需要从lsa模块更新一下。
[0081]
(3.4)若当前上线节点非新master节点,且非前master节点,判定当前上线节点为新节点,则池容量和块状态的更新结束。
[0082]
如果当前池的新master节点不是本节点,并且池的前master节点也不是本节点时,说明本节点是作为slave节点刚上线,设置ack阶段完成。
[0083]
本实施例中仅以上述节点身份划分以及对应的更新流程进行介绍,其它身份划分形式下对应的更新流程均可参照本实施例的介绍,在此不再赘述。
[0084]
本实施例提供的上述划分方法以及流程可以保障业务恢复的高可用性。
[0085]
请参考图2,图2为本实施例提供的离线节点上线业务恢复装置的结构框图;该装置主要包括:io静默处理单元110、节点生成单元120、状态更新单元130以及状态恢复单元140。本实施例提供的离线节点上线业务恢复装置可与上述离线节点上线业务恢复方法相互对照。
[0086]
其中,io静默处理单元110主要用于接收到节点上线通知后,将ishanding标记位设置为节点事件处理状态,并暂停当前执行回收任务的子模块的任务处理进程;
[0087]
节点生成单元120主要用于在存储池中计算生成并标记trimowner节点;
[0088]
状态更新单元130主要用于确定当前上线节点的节点身份,并根据节点身份调用trimowner节点进行池容量和块状态的更新;
[0089]
状态恢复单元140主要用于启动任务处理进程,并恢复任务的接收。
[0090]
可选地,状态更新单元130主要包括:
[0091]
节点确定子单元,用于确定存储池的前master节点,并标记新master节点;
[0092]
判断子单元,用于判断当前上线节点是否为新master节点和/或前master节点,生成判断结果;
[0093]
更新子单元,用于根据判断结果识别节点身份,并根据节点身份调用trimowner节点进行池容量和块状态的更新。
[0094]
可选地,更新子单元主要包括:
[0095]
第一处理子单元,用于若当前上线节点同时为新master节点以及前master节点,判定当前上线节点始终为存储池的master节点,则池容量和块状态的更新结束;
[0096]
第二处理子单元,用于若当前上线节点为新master节点,而非前master节点,判定当前上线节点为刚上线的master节点,则调用trimowner节点清空当前上线节点的block状态,向前master节点获取不为idle的block状态记录,根据block状态记录更新当前上线节点的状态,调用lsa模块设置最近分配的节点状态;
[0097]
第三处理子单元,用于若当前上线节点非新master节点,而为前master节点,判定当前上线节点在当前上线中由master节点变更为slave节点,则调用lsa模块进行节点状态更新;
[0098]
第四处理子单元,用于若当前上线节点非新master节点,且非前master节点,判定当前上线节点为新节点,则池容量和块状态的更新结束。
[0099]
可选地,状态恢复单元140具体用于:设置postreclaimblockreqflag标识以及trimfailedblockreqflag标识为true,并恢复iomutex标识和gcstatus标识为normal。
[0100]
本实施例提供一种离线节点上线业务恢复设备,主要包括:存储器以及处理器。
[0101]
其中,存储器用于存储程序;
[0102]
处理器用于执行程序时实现如上述实施例介绍的离线节点上线业务恢复方法的步骤,具体可参照上述离线节点上线业务恢复方法的介绍。
[0103]
请参考图3,为本实施例提供的离线节点上线业务恢复设备的结构示意图,该离线节点上线业务恢复设备可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(central processing units,cpu)322(例如,一个或一个以上处理器)和存储器332,存储器332存储有一个或一个以上的计算机应用程序342或数据344。其中,存储器332可以是短暂存储或持久存储。存储在存储器332的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对数据处理设备中的一系列指令操作。更进一步地,中央处理器322可以设置为与存储器332通信,在离线节点上线业务恢复设备301上执行存储介质330中的一系列指令操作。
[0104]
离线节点上线业务恢复设备301还可以包括一个或一个以上电源326,一个或一个以上有线或无线网络接口350,一个或一个以上输入输出接口358,和/或,一个或一个以上操作系统341,例如windows servertm,mac os xtm,unixtm,linuxtm,freebsdtm等等。
[0105]
上面图1所描述的离线节点上线业务恢复方法中的步骤可以由本实施例介绍的离线节点上线业务恢复设备的结构实现。
[0106]
本实施例公开一种可读存储介质,其上存储有程序,程序被处理器执行时实现如上述实施例介绍的离线节点上线业务恢复方法的步骤,具体可参照上述实施例中对离线节点上线业务恢复方法的介绍。
[0107]
该可读存储介质具体可以为u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可存储程序代码的可读存储介质。
[0108]
说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
[0109]
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
[0110]
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存
储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。
[0111]
以上对本申请所提供的离线节点上线业务恢复方法、装置、设备及可读存储介质进行了详细介绍。本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以对本申请进行若干改进和修饰,这些改进和修饰也落入本申请权利要求的保护范围内。