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

一种RAID卡节点之间的消息传输方法、系统、设备以及介质

文献发布时间:2024-04-18 19:58:53


一种RAID卡节点之间的消息传输方法、系统、设备以及介质

技术领域

本发明涉及存储领域,具体涉及一种RAID卡节点之间的消息传输方法、系统、设备以及介质。

背景技术

目前,RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)卡内集群节点间通信方式主要有两种:基于PCIe总线的节点间通信和基于SAS总线的节点间通信。PCIe总线的通信方式速度快,但是需要使用DMA(Direct Memory Access,直接内存访问)技术或RDMA(远程直接数据访问)技术,需要增加支持DMA或RDMA的硬件设备和网络设备,增加了系统的复杂度和开销。而SAS总线的通信方式相对简单,但是速度较慢,不能满足高性能数据存储系统的需求。

发明内容

有鉴于此,为了克服上述问题的至少一个方面,本发明实施例提出一种RAID卡节点之间的消息传输方法,所述方法应用于作为发起方的第一RAID卡节点,包括以下步骤:

利用在作为发起方的第一RAID卡节点中的第一模块的第一接收队列获取待处理消息,并基于所述第一接收队列的标识确定所述待处理消息的类型以调用所述第一模块中与所述待处理消息的类型对应的接口函数对所述待处理消息进行解析,其中,所述标识与所述待处理消息的类型相关联;

响应于解析通过,利用所述第一模块调用所述第一RAID卡节点中的第二模块中与所述待处理消息的类型对应的接口函数以将所述消息发送到所述第二模块;

利用所述第二模块将所述待处理消息发送到作为目标方的第二RAID卡节点。

在一些实施例中,在所述利用在作为发起方的第一RAID卡节点中的第一模块的第一接收队列获取待处理消息的步骤之前还包括:

判断所述第一模块和所述第二模块中是否注册有相应的所述接口函数;

响应于所述第一模块和所述第二模块中没有注册有所述接口函数,利用所述第一RAID卡节点中的业务模块将所述接口函数注册到所述第一模块并将所述接口函数的指针保存到所述第一模块中预先创建的第一函数队列中,以及利用所述第一模块将所述接口函数注册到所述第二模块并将所述接口函数的指针保存到所述第二模块中预先创建的第二函数队列中。

在一些实施例中,所述利用在作为发起方的第一RAID卡节点中的第一模块的第一接收队列获取待处理消息,并基于所述第一接收队列的标识确定所述待处理消息的类型,以调用所述第一模块中与所述待处理消息的类型对应的接口函数对所述待处理消息进行解析的步骤,进一步包括:

所述业务模块根据所述待处理消息的类型确定对应的所述接口函数,进而根据所述第一函数队列中的指针调用对应的所述接口函数以将所述待处理消息发送到所述第一模块中与所述接口函数对应的第一接收队列;

所述第一模块根据所述第一接收队列的标识确定所述待处理消息的类型,以根据所述待处理消息的类型确定对应的所述接口函数,进而根据所述第一函数队列中的指针调用对应的所述接口函数对所述待处理消息进行解析。

在一些实施例中,根据所述第一函数队列中的指针调用对应的所述接口函数对所述待处理消息进行解析,进一步还包括:

判断对所述待处理消息进行解析得到的参数是否合理;

响应于不合理,向所述业务模块反馈。

在一些实施例中,所述利用第一模块调用所述第一RAID卡节点中的第二模块中与所述待处理消息的类型对应的接口函数以将所述消息发送到所述第二模块的步骤,进一步包括:

所述第一模块根据所述第二函数队列中的指针调用相应的接口函数以将所述待处理消息发送到所述第二模块中与所述接口函数对应的第二接收队列。

在一些实施例中,所述利用所述第二模块将所述待处理消息发送到作为目标方的第二RAID卡节点的步骤,进一步包括:

根据所述第二函数队列中的指针调用相应的接口函数以从所述第二接收队列中取出所述待处理消息并根据所述待处理消息的类型设置相应的第一全局序列号;

将设置有第一全局序列号的所述待处理消息封装成消息体放入到所述第二模块中的发送队列以顺序发送到所述第二RAID卡节点,并在发送后将所述消息体放入到所述第二模块中的第一回收队列。

在一些实施例中,所述将设置有第一全局序列号的所述待处理消息封装成消息体放入到所述第二模块中的发送队列以顺序发送到所述第二RAID卡节点的步骤,进一步还包括:

根据所述接口函数的指针在所述第二函数队列中的位置分配通道号;

检测到所述通道号对应的信道空闲时,利用所述信道将所述消息体发送到所述第二RAID卡节点。

在一些实施例中,还包括:

利用所述第二模块中与所述接口函数对应的第三接收队列接收所述第二RAID卡节点基于所述待处理消息反馈的回应消息;

基于所述回应消息中携带的第二全局序列号在所述第一回收队列中进行匹配;

响应于匹配到相同的所述第一全局序列号,将相应的消息体从所述第一回收队列中删除;

生成携带有所述第二全局序列号的反馈消息并发送给所述第二RAID卡节点。

在一些实施例中,还包括:

接收所述第二RAID卡节点发送的携带有第二全局序列号的心跳消息并基于所述心跳消息对所述第一回收队列中的消息体进行标记。

在一些实施例中,还包括:

响应于所述第二模块接收到所述第二RAID卡节点反馈的错误消息,将所述第一回收队列中未被标记的所有消息体放入到所述第二模块中的第一重传队列中以进行重传。

在一些实施例中,还包括:

利用所述第一模块获取所述第三接收队列中的回应消息并反馈给所述业务模块。

在一些实施例中,还包括:

响应于所述第一模块和所述第二模块中注册有所述接口函数且所述第一函数队列和所述第二函数队列未保存所述接口函数的指针,直接将所述接口函数的指针保存到所述第一函数队列中,以及直接将所述接口函数的指针保存到所述第二函数队列中。

在一些实施例中,还包括:

分别判断所述第一函数队列和/或所述第二函数队列中是否已满;

响应于所述第一函数队列和/或所述第二函数队列中未满,将所述接口函数的指针保存到所述第一函数队列和/或所述第二函数队列中;

响应于所述第一函数队列和/或所述第二函数队列中已满,根据预设算法对所述第一函数队列和/或所述第二函数队列中若干个当前保存的指针进行回收后,将所述接口函数的指针保存到所述第一函数队列和/或所述第二函数队列中。

基于同一发明构思,根据本发明的另一个方面,本发明的实施例还提供了一种RAID卡节点之间的消息传输方法,所述方法应用于作为目标方的第二RAID卡节点,包括以下步骤:

利用作为目标方的第二RAID卡节点中的第二模块接收作为发起方的第一RAID卡节点发送的消息体并对所述消息体解封装得到待处理消息以及第一全局序列号;

根据所述第一全局序列号确定所述待处理消息的类型并通知所述第二RAID卡节点中的第一模块;

利用所述第一模块根据所述待处理消息的类型调用所述第二模块中相应的接口函数以获取所述待处理消息;

利用第二RAID卡节点中的业务模块调用所述第一模块中相应的接口函数以获取所述待处理消息并进行处理。

在一些实施例中,在所述利用作为目标方的第二RAID卡节点中的第二模块接收作为发起方的第一RAID卡节点发送的消息体并对所述消息体解封装得到待处理消息以及第一全局序列号的步骤之前,还包括:

利用所述第二RAID卡节点的第二模块接收所述第一RAID卡节点发送的通知;

根据所述通知判断所述第一模块和所述第二模块中是否注册有所述相应的接口函数;

响应于所述第一模块或所述第二模块中没有注册有所述相应的接口函数,利用所述第一RAID卡节点将所述相应的接口函数注册到所述第二模块并将所述相应的接口函数的指针保存到所述第一模块中预先创建的第二函数队列中,以及利用所述第二模块将所述相应的接口函数注册到所述第一模块并将所述相应的接口函数的指针保存到所述第一模块中预先创建的第一函数队列中。

在一些实施例中,还包括:

响应于所述第一模块和/或所述第二模块中注册有所述相应的接口函数且第一函数队列和所述第二函数队列未保存所述接口函数的指针,直接将所述相应的接口函数的指针保存到所述第一函数队列中,以及直接将所述接口函数的指针保存到所述第二函数队列中。

在一些实施例中,还包括:

分别判断所述第一函数队列和/或所述第二函数队列中是否已满;

响应于所述第一函数队列和/或所述第二函数队列中未满,将所述相应的接口函数的指针保存到所述第一函数队列和/或所述第二函数队列中;

响应于所述第一函数队列和/或所述第二函数队列中已满,根据预设算法对所述第一函数队列和/或所述第二函数队列中若干个当前保存的指针进行回收后,将所述相应的接口函数的指针保存到所述第一函数队列和/或所述第二函数队列中。

在一些实施例中,所述利用所述第二RAID卡节点中的第二模块接收作为发起方的第一RAID卡节点发送的消息体并对所述消息体解封装得到待处理消息以及第一全局序列号的步骤,进一步包括:

获取接收到的与所述待处理消息的类型相同的上一个待处理消息的第一全局序列号;

将上一个待处理消息的第一全局序列号加一后与当前的待处理消息的第一全局序列号进行比较;

响应于相等,将所述当前的待处理消息放入到所述第二模块中与所述相应的接口函数对应的第五接收队列中;

响应于上一个待处理消息的第一全局序列号加一后大于所述当前的待处理消息的第一全局序列号,将所述当前的待处理消息丢弃;

响应于上一个待处理消息的第一全局序列号加一后小于所述当前的待处理消息的第一全局序列号,将所述当前的待处理消息放入到所述第五接收队列中并按所述第一全局序列号进行排序。

在一些实施例中,所述利用所述第一模块根据所述待处理消息的类型调用所述第二模块中相应的接口函数以获取所述待处理消息的步骤,进一步包括:

所述第一模块根据所述第二函数队列中的指针调用相应的接口函数获取所述第五接收队列中的所述待处理消息并放入所述第一模块中与所述相应的接口函数对应的第六接收队列中。

在一些实施例中,所述利用第二RAID卡节点中的业务模块调用所述第一模块中相应的接口函数以获取所述待处理消息并进行处理的步骤,进一步包括:

利用所述业务模块根据所述第一函数队列中的指针调用相应的接口函数获取所述第六接收队列中的所述待处理消息以进行处理并生成回应消息。

在一些实施例中,还包括:

利用所述业务模块根据所述第一函数队列中的指针调用相应的接口函数以将所述回应消息发送到所述第一模块中与所述相应的接口函数对应的第七接收队列;

利用所述第一模块根据所述第二函数队列中的指针调用相应的接口函数以将所述回应消息发送到所述第二模块中与所述相应的接口函数对应的第八接收队列;

根据所述第二函数队列中的指针调用相应的接口函数以从所述第八接收队列中取出所述回应消息并根据所述回应消息对应的所述待处理消息设置相应的第二全局序列号;

将设置有第二全局序列号的所述回应消息封装成消息体放入到发送队列以顺序发送到所述第一RAID卡节点,并在发送后将所述消息体放入到所述第二模块中的第二回收队列。

在一些实施例中,所述将设置有第二全局序列号的所述回应消息封装成消息体放入到发送队列以顺序发送到所述第一RAID卡节点的步骤,进一步还包括:

根据所述相应的接口函数的指针在所述第二函数队列中的位置分配通道号;

检测到所述通道号对应的信道空闲时,利用所述信道将所述消息体发送到所述第一RAID卡节点。

在一些实施例中,还包括:

响应于接收到所述第一RAID卡节点发送的携带有所述第二全局序列号的反馈消息,将相应的消息体从所述第二回收队列删除;

响应于接收到所述第一RAID卡节点反馈的错误消息,将所述第二回收队列中所有消息体放入到所述第二模块中的第二重传队列中以进行重传。

基于同一发明构思,根据本发明的另一个方面,本发明的实施例还提供了一种存储系统,所述存储系统包括多个RAID卡,每一个RAID卡包括若干个RAID卡节点,所述RAID卡节点两两之间通过光纤直连,并基于上述实施例任一项所述的方法的步骤实现节点间通信。

基于同一发明构思,根据本发明的另一个方面,本发明的实施例还提供了一种计算机设备,包括:

至少一个处理器;以及

存储器,所述存储器存储有可在所述处理器上运行的计算机程序,所述处理器执行所述程序时执行如上所述的任一种RAID卡节点之间的消息传输方法的步骤。

基于同一发明构思,根据本发明的另一个方面,本发明的实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时执行如上所述的任一种RAID卡节点之间的消息传输方法的步骤。

本发明具有以下有益技术效果之一:本发明提出的方案通过第一模块负责与业务模块交互从而接收待处理消息并进行解析,然后将解析通过的待处理消息发送到第二模块,利用第二模块将待处理消息发送到目标方节点,相较于现有技术中的RAID卡节点之间的通信方法,减少了消息转发次数,从而提高通信速度,而且还降低了系统的复杂度,并且也无需增加额外的硬件设备,节约成本。

附图说明

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

图1为本发明的实施例提供的RAID卡节点之间的消息传输方法的流程示意图;

图2为本发明的实施例提供的RAID卡的结构示意图;

图3为本发明的实施例提供的第一RAID卡节点和第二RAID卡节点的交互流程示意图;

图4为本发明的实施例提供的第一RAID卡节点和第二RAID卡节点的另一交互流程示意图;

图5为本发明的实施例提供的第一RAID卡节点和第二RAID卡节点的另一交互流程示意图;

图6为本发明的实施例提供的计算机设备的结构示意图;

图7为本发明的实施例提供的计算机可读存储介质的结构示意图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明实施例进一步详细说明。

需要说明的是,本发明实施例中所有使用“第一”和“第二”的表述均是为了区分两个相同名称非相同的实体或者非相同的参量,可见“第一”“第二”仅为了表述的方便,不应理解为对本发明实施例的限定,后续实施例对此不再一一说明。

根据本发明的一个方面,本发明的实施例提出一种RAID卡节点之间的消息传输方法,所述方法应用于作为发起方的第一RAID卡节点,如图1所示,其可以包括步骤:

S1,利用在作为发起方的第一RAID卡节点中的第一模块的第一接收队列获取待处理消息,并基于所述第一接收队列的标识确定所述待处理消息的类型以调用所述第一模块中与所述待处理消息的类型对应的接口函数对所述待处理消息进行解析,其中,所述标识与所述待处理消息的类型相关联;

S2,响应于解析通过,利用所述第一模块调用所述第一RAID卡节点中的第二模块中与所述待处理消息的类型对应的接口函数以将所述消息发送到所述第二模块;

S3,利用所述第二模块将所述待处理消息发送到作为目标方的第二RAID卡节点。

本发明提出的方案通过第一模块负责与业务模块交互从而接收待处理消息并进行解析,然后将解析通过的待处理消息发送到第二模块,利用第二模块将待处理消息发送到目标方节点,相较于现有技术中的RAID卡节点之间的通信方法,减少了消息转发次数,从而提高通信速度,而且还降低了系统的复杂度,并且也无需增加额外的硬件设备,节约成本。

在一些实施例中,如图2所示的存储系统中RAID卡的结构图,相对于现有技术中的RAID,本发明在RAID卡节点的固件层增加了第一模块110和第二模块120。图2中两个RAID卡节点160、170之间通过第二模块发送/接收消息150以此实现节点间通信。RAID卡中固件层还包括驱动程序、RAID卡内核、文件系统、业务模块等等(其他部分在图2中没有说明),RAID卡内核和文件系统可以提供对文件和逻辑单元号LUN访问的功能,以及对这些功能的管理。RAID卡中固件层的驱动程序和处理器执行一些程序指令,用于处理主机I/O请求。图2中磁盘组1(130)构成1号RAID阵列,磁盘组2构成2号RAID阵列,以此类推,磁盘组N构成N号RAID阵列。1号RAID阵列、2号RAID阵列......N号RAID阵列一起构成RAID组。RAID卡控制器140负责RAID卡中的软件处理功能,由RAID卡控制器专门实现软件功能,硬件模块执行一些算法、数据管理以及其他一些功能,以此实现软硬分离,硬件和软件各自独立、平行工作,通过软硬分离系统架构设计提高RAID卡管理下挂磁盘的性能。另外本发明中新增的第一模块和第二模块,既可以做成硬件的集成电路也可以做成软件的单元模块,

图2中主机系统可以是PC机、主机、数据中心或移动手机等等,多个主机系统之间通过网络共享存储系统中的存储资源,网络可以采用存储区域网络(SAN)、局域网(LAN)连接、广域网(WAN)连接和无线WIFI连接等等。网络可以包括一个或多个有线、无线连接的网络,如图2所示,一个网络可以通过交换机连接到其他外部网络。多个RAID卡组成的存储系统之间可以通过PCIe总线、以太网、SAS总线、光纤通道等等连接组成一个大型的存储环境。需要注意的是,主机系统、网络和RAID卡的数量和类型并不限于图2中所示的这些。在不同的时间段内,一个或多个主机系统可能会离线,而且在使用存储环境期间,用户可能会操作主机系统连接、断开连接和重新连接到存储环境,所以每个主机系统的连接状态可能会发生改变。每个主机系统可以利用多个RAID卡节点进行业务处理,多个RAID卡节点之间可以利用150指示的通过第二模块发送/接收消息基于各个节点的地址/编号实现节点间通信。需要说明的是,因为节点间通信是双向的,所以每个节点既是发起方也是目标方。

在一些实施例中,S1,在所述利用在作为发起方的第一RAID卡节点中的第一模块的第一接收队列获取待处理消息的步骤之前还包括:

判断所述第一模块和所述第二模块中是否注册有相应的所述接口函数;

响应于所述第一模块和所述第二模块中没有注册有所述接口函数,利用所述第一RAID卡节点中的业务模块将所述接口函数注册到所述第一模块并将所述接口函数的指针保存到所述第一模块中预先创建的第一函数队列中,以及利用所述第一模块将所述接口函数注册到所述第二模块并将所述接口函数的指针保存到所述第二模块中预先创建的第二函数队列中。

具体的,如图3所示,在作为发起方的第一RAID卡节点中,在利用第一模块获取待处理的消息前,首先判断第一模块和第二模块中是否注册有对应的接口函数,如果没有注册接口函数,则先利用业务模块向将接口函数注册到第一模块中,并将接口函数的指针保存第一模块的第一函数队列中,然后利用第一模块向传输模块注册接口函数,同样将接口函数的指针保存到第二模块的第二函数队列中。然后在第一模块中创建与该接口函数对应的第一接收队列以接收通过调用该接口函数发送的消息,可以将消息的类型作为第一接收队列的标识,这样当第一模块检测到第一接收队列中存在消息后,通过该第一接收队列的标识即可确定消息的类型,然后调用相应的接口函数进行处理,从而将第一接收队列与该接口函数相对应。同样的在第二模块中创建与该接口函数对应的第二接收队列以接收通过调用该接口函数发送的消息,并将消息的类型作为第二接收队列的标识。

在一些实施例中,还包括:

响应于所述第一模块和所述第二模块中注册有所述接口函数且所述第一函数队列和所述第二函数队列未保存所述接口函数的指针,直接将所述接口函数的指针保存到所述第一函数队列中,以及直接将所述接口函数的指针保存到所述第二函数队列中。

具体的,在作为发起方的第一RAID卡节点中,若第一模块和第二模块中已经注册有接口函数,无需再次向第一模块和第二模块中再次注册接口函数,只需要判断第一函数队列和第二函数队列中是否存在该接口函数的指针,如果不存在,则直接将所述接口函数的指针保存到所述第一函数队列中以及直接将所述接口函数的指针保存到所述第二函数队列中即可,如果存在,直接根据两个函数队列中的指针调用相应的接口函数即可。

在一些实施例中,还包括:

分别判断所述第一函数队列和/或所述第二函数队列中是否已满;

响应于所述第一函数队列和/或所述第二函数队列中未满,将所述接口函数的指针保存到所述第一函数队列和/或所述第二函数队列中;

响应于所述第一函数队列和/或所述第二函数队列中已满,根据预设算法对所述第一函数队列和/或所述第二函数队列中若干个当前保存的指针进行回收后,将所述接口函数的指针保存到所述第一函数队列和/或所述第二函数队列中。

具体的,在作为发起方的第一RAID卡节点中,为了节约资源,可以限制两个函数队列的长度,因此当两个函数队列中没有相应的接口函数的指针时,先判断两个函数队列是否有空闲位置,如果没有,说明两个函数队列已满,需要将函数队列中的若干个指针删除,例如可以根据入队时间,选择删除若干个入队时间长的指针,还可以根据使用率,选择删除若干个使用率低的指针。这样即能将相应的接口函数的指针保存到函数队列。

在一些实施例中,S1,所述利用在作为发起方的第一RAID卡节点中的第一模块的第一接收队列获取待处理消息,并基于所述第一接收队列的标识确定所述待处理消息的类型,以调用所述第一模块中与所述待处理消息的类型对应的接口函数对所述待处理消息进行解析的步骤,进一步包括:

所述业务模块根据所述待处理消息的类型确定对应的所述接口函数,进而根据所述第一函数队列中的指针调用对应的所述接口函数以将所述待处理消息发送到所述第一模块中与所述接口函数对应的第一接收队列;

所述第一模块根据所述第一接收队列的标识确定所述待处理消息的类型,以根据所述待处理消息的类型确定对应的所述接口函数,进而根据所述第一函数队列中的指针调用对应的所述接口函数对所述待处理消息进行解析。

具体的,在作为发起方的第一RAID卡节点中,业务模块在向第一模块发送待处理消息时,例如发送message(可携带信令,无大块数据)或bulk(带数据)消息,可以根据待处理消息的类型确定对应的所述接口函数,从而根据第一模块的第一函数队列中的指针调用对应的所述接口函数以将所述待处理消息发送到所述第一模块中与所述接口函数对应的第一接收队列,第一模块在检测到第一接收队列中接收到待处理消息后,根据第一接收队列的标识即可确定待处理消息的类型,从而确定对应的所述接口函数,进而根据所述第一函数队列中的指针调用对应的所述接口函数对所述待处理消息进行解析。

在一些实施例中,根据所述第一函数队列中的指针调用对应的所述接口函数对所述待处理消息进行解析,进一步还包括:

判断对所述待处理消息进行解析得到的参数是否合理;

响应于不合理,向所述业务模块反馈。

具体的,在作为发起方的第一RAID卡节点中,第一模块从第一接收队列取出待处理消息后,利用接口函数对待处理消息进行解析,根据解析得到的参数判断待处理消息是否合理,合理则将该待处理消息发送到第二模块,参数不合理则返回给业务模块。

在一些实施例中,S2,所述利用第一模块调用所述第一RAID卡节点中的第二模块中与所述待处理消息的类型对应的接口函数以将所述消息发送到所述第二模块的步骤,进一步包括:

所述第一模块根据所述第二函数队列中的指针调用相应的接口函数以将所述待处理消息发送到所述第二模块中与所述接口函数对应的第二接收队列。

具体的,在作为发起方的第一RAID卡节点中,当判断出解析得到的参数合理,即解析通过后,第一模块将待处理消息发送到第二模块,此时第一模块可以根据第二模块的第二函数队列中的指针调用相应的接口函数即能将所述待处理消息发送到所述第二模块中与所述接口函数对应的第二接收队列。由于第二接收队列使用同样的标识,因此根据待处理消息的类型调用相应的接口函数,从而将待处理消息发送到第二模块中相应的第二接收队列。

在一些实施例中,S3,所述利用所述第二模块将所述待处理消息发送到作为目标方的第二RAID卡节点的步骤,进一步包括:

根据所述第二函数队列中的指针调用相应的接口函数以从所述第二接收队列中取出所述待处理消息并根据所述待处理消息的类型设置相应的第一全局序列号;

将设置有第一全局序列号的所述待处理消息封装成消息体放入到所述第二模块中的发送队列以顺序发送到所述第二RAID卡节点,并在发送后将所述消息体放入到所述第二模块中的第一回收队列。

具体的,在作为发起方的第一RAID卡节点中,第二模块在检测到第二接收队列中接收到待处理消息,则根据所述第二函数队列中的指针调用相应的接口函数以从所述第二接收队列中取出所述待处理消息,然后根据待处理消息的类型设置相应的第一全局序列号,需要说明的是,第一全局序列号包括用于指示待处理消息类型的标识位和该待处理消息的顺序编号。接着将设置有第一全局序列号的所述待处理消息封装成消息体并放入到发送队列中,以顺序发送到所述第二RAID卡节点,并在发送后将所述消息体放入到所述第二模块中的第一回收队列。

在一些实施例中,所述将设置有第一全局序列号的所述待处理消息封装成消息体放入到所述第二模块中的发送队列以顺序发送到所述第二RAID卡节点的步骤,进一步还包括:

根据所述接口函数的指针在所述第二函数队列中的位置分配通道号;

检测到所述通道号对应的信道空闲时,利用所述信道将所述消息体发送到所述第二RAID卡节点。

具体的,如图3所示,在作为发起方的第一RAID卡节点中,可以根据接口函数的指针在所述第二函数队列中的位置分配通道号,例如一个位置对应一个或多个固定的通道号,通过该一个或多个通道号对应的信道向对端的第二RAID卡节点发送消息。

在一些实施例中,还包括:

利用所述第二模块中与所述接口函数对应的第三接收队列接收所述第二RAID卡节点基于所述待处理消息反馈的回应消息;

基于所述回应消息中携带的第二全局序列号在所述第一回收队列中进行匹配;

响应于匹配到相同的所述第一全局序列号,将相应的消息体从所述第一回收队列中删除;

生成携带有所述第二全局序列号的反馈消息并发送给所述第二RAID卡节点。

在一些实施例中,还包括:

利用所述第一模块获取所述第三接收队列中的回应消息并反馈给所述业务模块。

具体的,如图3和图4所示,在作为发起方的第一RAID卡节点中,业务模块可以以异步的方式向第一模块发送消息。而在作为目的方的第二RAID卡节点中,第一模块以同步的方式向业务模块发送待处理消息,而在第二RAID卡节点的业务模块完成对待处理消息的处理后,生成回应消息,以同步的方式将回应消息发送到第二RAID卡节点的第一模块和第二模块,第一RAID卡节点的第二模块利用第三接收队列接收第二RAID卡节点的第二模块发送的回应消息,第一RAID卡节点的第一模块也是以同步的方式从第一RAID卡节点的第二模块的第三接收队列中获取回应消息,第一RAID卡节点的第一模块在以同步的方式向第一RAID卡节点的业务模块发送回应消息。

第二RAID卡节点生成的回应消息中可以携带第二全局序列号,从而基于所述回应消息中携带的第二全局序列号在第一RAID卡节点的第二模块的第一回收队列中进行匹配,如果匹配到,则将相应的消息体从所述第一回收队列中删除,并生成携带有所述第二全局序列号的反馈消息并发送给所述第二RAID卡节点,以通知第二RAID卡节点已收到回应消息。

在一些实施例中,还包括:

接收所述第二RAID卡节点发送的携带有第二全局序列号的心跳消息并基于所述心跳消息对所述第一回收队列中的消息体进行标记。

在一些实施例中,还包括:

响应于所述第二模块接收到所述第二RAID卡节点反馈的错误消息,将所述第一回收队列中未被标记的所有消息体放入到所述第二模块中的第一重传队列中以进行重传。

具体的,如果所述第二RAID卡节点长时间未发送回应消息,则发送心跳消息给第一RAID卡节点,基于心跳消息对所述第一回收队列中的消息体进行标记。这样,当第一RAID卡节点接收到对端第二RAID卡发送的反馈的错误消息时,所述第一回收队列中未被标记的所有消息体放入到所述第二模块中的第一重传队列中以进行重传,重新参加调度,保证了消息不会在第一模块和第二模块时丢失。

基于同一发明构思,根据本发明的另一个方面,本发明的实施例还提供了一种RAID卡节点之间的消息传输方法,所述方法应用于作为目标方的第二RAID卡节点,包括以下步骤:

利用作为目标方的第二RAID卡节点中的第二模块接收作为发起方的第一RAID卡节点发送的消息体并对所述消息体解封装得到待处理消息以及第一全局序列号;

根据所述第一全局序列号确定所述待处理消息的类型并通知所述第二RAID卡节点中的第一模块;

利用所述第一模块根据所述待处理消息的类型调用所述第二模块中相应的接口函数以获取所述待处理消息;

利用第二RAID卡节点中的业务模块调用所述第一模块中相应的接口函数以获取所述待处理消息并进行处理。

在一些实施例中,在所述利用作为目标方的第二RAID卡节点中的第二模块接收作为发起方的第一RAID卡节点发送的消息体并对所述消息体解封装得到待处理消息以及第一全局序列号的步骤之前,还包括:

利用所述第二RAID卡节点的第二模块接收所述第一RAID卡节点发送的通知;

根据所述通知判断所述第一模块和所述第二模块中是否注册有所述相应的接口函数;

响应于所述第一模块或所述第二模块中没有注册有所述相应的接口函数,利用所述第一RAID卡节点将所述相应的接口函数注册到所述第二模块并将所述相应的接口函数的指针保存到所述第一模块中预先创建的第二函数队列中,以及利用所述第二模块将所述相应的接口函数注册到所述第一模块并将所述相应的接口函数的指针保存到所述第一模块中预先创建的第一函数队列中。

在一些实施例中,还包括:

响应于所述第一模块和/或所述第二模块中注册有所述相应的接口函数且第一函数队列和所述第二函数队列未保存所述接口函数的指针,直接将所述相应的接口函数的指针保存到所述第一函数队列中,以及直接将所述接口函数的指针保存到所述第二函数队列中。

在一些实施例中,还包括:

分别判断所述第一函数队列和/或所述第二函数队列中是否已满;

响应于所述第一函数队列和/或所述第二函数队列中未满,将所述相应的接口函数的指针保存到所述第一函数队列和/或所述第二函数队列中;

响应于所述第一函数队列和/或所述第二函数队列中已满,根据预设算法对所述第一函数队列和/或所述第二函数队列中若干个当前保存的指针进行回收后,将所述相应的接口函数的指针保存到所述第一函数队列和/或所述第二函数队列中。

具体的,如图5所示,当第一RAID卡节点的第二模块中有需要向第二RAID卡节点发送的消息体时,第一RAID卡节点的第二模块通知第二RAID卡节点的第二模块,以确定第二RAID卡节点的第二模块和第一模块是否注册有相应的接口函数,如果没有注册,则由第一RAID卡节点的第二模块向第二RAID卡节点的第二模块注册接口函数,第二RAID卡节点的第二模块向第二RAID卡节点的第一模块注册接口函数,同样的在第二RAID卡节点的第一模块和第二模块中,也有第一函数队列和第二函数队列,具体注册流程与上文类似。

在一些实施例中,所述利用所述第二RAID卡节点中的第二模块接收作为发起方的第一RAID卡节点发送的消息体并对所述消息体解封装得到待处理消息以及第一全局序列号的步骤,进一步包括:

获取接收到的与所述待处理消息的类型相同的上一个待处理消息的第一全局序列号;

将上一个待处理消息的第一全局序列号加一后与当前的待处理消息的第一全局序列号进行比较;

响应于相等,将所述当前的待处理消息放入到所述第二模块中与所述相应的接口函数对应的第五接收队列中;

响应于上一个待处理消息的第一全局序列号加一后大于所述当前的待处理消息的第一全局序列号,将所述当前的待处理消息丢弃;

响应于上一个待处理消息的第一全局序列号加一后小于所述当前的待处理消息的第一全局序列号,将所述当前的待处理消息放入到所述第五接收队列中并按所述第一全局序列号进行排序。

具体的,如图5所示,第一RAID卡节点的第二模块会基于通道数量不断循环利用通道发送封装的消息体,当第二RAID卡节点接收到第一RAID卡节点发送的消息体后,会检查接收到的消息体的第一全局序列号,将其与前一个同类型的消息的第一全局序列号+1进行比较,若两者相等,说明该消息正是期待的消息,将所述当前的待处理消息放入到所述第二模块中与所述相应的接口函数对应的第五接收队列中并通知第一模块从第五接收队列中获取该消息;若上一个待处理消息的第一全局序列号加一后大于所述当前的待处理消息的第一全局序列号,说明该消息已被接收过,是重复消息,直接丢弃;若上一个待处理消息的第一全局序列号加一后小于所述当前的待处理消息的第一全局序列号,说明消息未按顺序抵达,放入到所述第五接收队列中并按所述第一全局序列号进行排序,等待下次调度。

在一些实施例中,所述利用所述第一模块根据所述待处理消息的类型调用所述第二模块中相应的接口函数以获取所述待处理消息的步骤,进一步包括:

所述第一模块根据所述第二函数队列中的指针调用相应的接口函数获取所述第五接收队列中的所述待处理消息并放入所述第一模块中与所述相应的接口函数对应的第六接收队列中。

具体的,如图5所示,在作为目的方的第二RAID卡节点中,当第二模块检测到第五接收队列中存在第一RAID卡节点发送的消息体后,对消息体进行解封装,并通知第一模块,第一模块则根据所述第二函数队列中的指针调用相应的接口函数获取所述第五接收队列中的所述待处理消息并放入所述第一模块中与所述相应的接口函数对应的第六接收队列中。

在一些实施例中,所述利用第二RAID卡节点中的业务模块调用所述第一模块中相应的接口函数以获取所述待处理消息并进行处理的步骤,进一步包括:

利用所述业务模块根据所述第一函数队列中的指针调用相应的接口函数获取所述第六接收队列中的所述待处理消息以进行处理并生成回应消息。

在一些实施例中,还包括:

利用所述业务模块根据所述第一函数队列中的指针调用相应的接口函数以将所述回应消息发送到所述第一模块中与所述相应的接口函数对应的第七接收队列;

利用所述第一模块根据所述第二函数队列中的指针调用相应的接口函数以将所述回应消息发送到所述第二模块中与所述相应的接口函数对应的第八接收队列;

根据所述第二函数队列中的指针调用相应的接口函数以从所述第八接收队列中取出所述回应消息并根据所述回应消息对应的所述待处理消息设置相应的第二全局序列号;

将设置有第二全局序列号的所述回应消息封装成消息体放入到发送队列以顺序发送到所述第一RAID卡节点,并在发送后将所述消息体放入到所述第二模块中的第二回收队列。

在一些实施例中,所述将设置有第二全局序列号的所述回应消息封装成消息体放入到发送队列以顺序发送到所述第一RAID卡节点的步骤,进一步还包括:

根据所述相应的接口函数的指针在所述第二函数队列中的位置分配通道号;

检测到所述通道号对应的信道空闲时,利用所述信道将所述消息体发送到所述第一RAID卡节点。

在一些实施例中,还包括:

响应于接收到所述第一RAID卡节点发送的携带有所述第二全局序列号的反馈消息,将相应的消息体从所述第二回收队列删除;

响应于接收到所述第一RAID卡节点反馈的错误消息,将所述第二回收队列中所有消息体放入到所述第二模块中的第二重传队列中以进行重传。

具体的,如图5所示,在作为目的方的第二RAID卡节点中,当第一模块从第二模块中获取到待处理消息后,通知业务模块获取该待处理消息进行处理。业务模块在完成处理后生成回应消息,基于同样的流程,业务模块将回应消息发送到第二模块中,第二模块在根据相应的接口函数的指针在所述第二函数队列中的位置分配通道号,然后利用通道号对应的信道将封装后的设置有第二全局序列号的回应消息发送到所述第一RAID卡节点。同样在发送后,将对应的消息体放入到第二回收队列中,当第二RAID卡节点收到第一RAID卡节点基于回应消息生成的反馈消息后,将相应的消息体从所述第二回收队列删除,若接收到所述第一RAID卡节点反馈的错误消息,则将所述第二回收队列中所有消息体放入到所述第二模块中的第二重传队列中以进行重传。

基于同一发明构思,根据本发明的另一个方面,本发明的实施例还提供了一种存储系统,所述存储系统包括多个RAID卡,每一个RAID卡包括若干个RAID卡节点,所述RAID卡节点两两之间通过光纤直连,并基于上述实施例任一项所述的方法的步骤实现节点间通信。

基于同一发明构思,根据本发明的另一个方面,如图6所示,本发明的实施例还提供了一种计算机设备501,包括:

至少一个处理器520;以及

存储器510,存储器510存储有可在处理器上运行的计算机程序511,处理器520执行程序时执行如上的任一种RAID卡节点之间的消息传输方法的步骤。

基于同一发明构思,根据本发明的另一个方面,如图7所示,本发明的实施例还提供了一种计算机可读存储介质601,计算机可读存储介质601存储有计算机程序610,计算机程序610被处理器执行时执行如上的任一种RAID卡节点之间的消息传输方法的步骤。

最后需要说明的是,本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,可以通过计算机程序来指令相关硬件来完成,程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。

此外,应该明白的是,本文的计算机可读存储介质(例如,存储器)可以是易失性存储器或非易失性存储器,或者可以包括易失性存储器和非易失性存储器两者。

本领域技术人员还将明白的是,结合这里的公开所描述的各种示例性逻辑块、模块、电路和算法步骤可以被实现为电子硬件、计算机软件或两者的组合。为了清楚地说明硬件和软件的这种可互换性,已经就各种示意性组件、方块、模块、电路和步骤的功能对其进行了一般性的描述。这种功能是被实现为软件还是被实现为硬件取决于具体应用以及施加给整个系统的设计约束。本领域技术人员可以针对每种具体应用以各种方式来实现的功能,但是这种实现决定不应被解释为导致脱离本发明实施例公开的范围。

以上是本发明公开的示例性实施例,但是应当注意,在不背离权利要求限定的本发明实施例公开的范围的前提下,可以进行多种改变和修改。根据这里描述的公开实施例的方法权利要求的功能、步骤和/或动作不需以任何特定顺序执行。此外,尽管本发明实施例公开的元素可以以个体形式描述或要求,但除非明确限制为单数,也可以理解为多个。

应当理解的是,在本文中使用的,除非上下文清楚地支持例外情况,单数形式“一个”旨在也包括复数形式。还应当理解的是,在本文中使用的“和/或”是指包括一个或者一个以上相关联地列出的项目的任意和所有可能组合。

上述本发明实施例公开实施例序号仅仅为了描述,不代表实施例的优劣。

本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。

所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本发明实施例公开的范围(包括权利要求)被限于这些例子;在本发明实施例的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,并存在如上的本发明实施例的不同方面的许多其它变化,为了简明它们没有在细节中提供。因此,凡在本发明实施例的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本发明实施例的保护范围之内。

相关技术
  • 一种消息传输方法、装置、设备及介质
  • OAM消息传输方法、传输设备及存储介质
  • 一种RAID卡性能优化方法、装置、终端及存储介质
  • 一种用于存储系统之间的信息传输方法、装置及介质
  • 一种Raid特性测试方法、装置、设备及存储介质
  • 一种集群节点间分层消息传输方法、系统、设备及介质
  • 一种集群节点间分层消息传输方法、系统、设备及介质
技术分类

06120116513453