CN114579321A - 分布式锁的实现方法及装置 - Google Patents
分布式锁的实现方法及装置 Download PDFInfo
- Publication number
- CN114579321A CN114579321A CN202210135345.2A CN202210135345A CN114579321A CN 114579321 A CN114579321 A CN 114579321A CN 202210135345 A CN202210135345 A CN 202210135345A CN 114579321 A CN114579321 A CN 114579321A
- Authority
- CN
- China
- Prior art keywords
- information
- command
- lock
- side management
- storage
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/524—Deadlock detection or avoidance
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Storage Device Security (AREA)
Abstract
本申请实施例公开了一种分布式锁的实现方法及装置,应用于包含多个主机、多个存储侧管理节点、分布式装置和共享存储空间的系统。具体技术方案包括:存储侧管理节点接收主机请求所述共享存储空间的相关命令;根据所述存储侧管理节点本地的锁共享信息,确定是否允许所述相关命令;若允许所述相关命令,则更新所述锁共享信息,将允许所述相关命令的信息共享给其他存储侧管理节点以供更新其他存储侧管理节点本地的锁共享信息;其中,所述锁共享信息维护有所述共享存储空间的状态信息,所述状态信息包括被注册的信息、被预留的信息、被抢占的信息或空闲的信息。本申请通过分布式锁实现了合理地共享存储空间。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种分布式锁的实现方法及装置。
背景技术
随着混合云及线下企业客户市场的争夺越来越激烈,公有云存储产品如何满足线下企业客户存储特性需求也变得越来越重要,企业特性的满足逐步成为线下客户竞标中的关键项。诸如共享LUN(Logical Unit Number,逻辑单元号)等共享存储空间特性是在企业存储中非常核心及基础的特性之一。
在一个共享存储的环境下,多个前端计算节点可能会通过分布式架构同时访问同一存储空间,如果此时多个前端计算节点在同一时间点对同一存储空间(例如同一个LUN)进行I/O(输入/输出)操作,则会造成I/O冲突,甚至可能会导致数据损坏。因此亟需一种分布式锁的实现方式,通过分布式锁来实现合理地共享存储空间。
发明内容
有鉴于此,本申请提供了一种分布式锁的实现方法及装置,以便通过分布式锁来实现合理地共享存储空间。
本申请提供了如下方案:
根据第一方面,提供了一种分布式锁的实现方法,应用于包含多个主机、多个存储侧管理节点和共享存储空间的系统;所述方法包括:
存储侧管理节点接收主机请求所述共享存储空间的相关命令;
根据所述存储侧管理节点本地的锁共享信息,确定是否允许所述相关命令;
若允许所述相关命令,则更新所述锁共享信息,将允许所述相关命令的信息共享给其他存储侧管理节点;
其中,所述锁共享信息维护有所述共享存储空间的状态信息,所述状态信息包括被注册的信息、被预留的信息、被抢占的信息或空闲的信息。
根据本申请实施例一可实现的方式,在根据所述存储侧管理节点本地的锁共享信息,确定是否允许所述相关命令之前,还包括:
识别所述相关命令的类型;
若所述相关命令为预留命令或抢占命令,则继续执行根据所述存储侧管理节点本地的锁共享信息,确定是否允许所述相关命令的步骤;
若所述相关命令为注册命令,则确定允许所述注册命令,并将注册信息共享给其他存储侧管理节点。
根据本申请实施例一可实现的方式,根据所述存储侧管理节点本地的锁共享信息,确定是否允许所述相关命令包括:
若所述锁共享信息包含所述共享存储空间被其他主机预留或抢占的信息,则不允许所述预留命令或抢占命令,否则,允许所述预留命令或抢占命令;
更新所述锁共享信息包括:在所述锁共享信息中更新所述共享存储空间被发送所述相关命令的主机预留或抢占的信息。
根据本申请实施例一可实现的方式,该方法还包括:
若依据其他存储侧管理节点针对允许所述相关命令的信息返回的响应,确定存在存储侧管理节点失联或存在命令冲突,则不允许所述预留命令或抢占命令。
根据本申请实施例一可实现的方式,该方法还包括:
若允许所述预留命令或抢占命令,则为所述主机分配锁钥。
根据本申请实施例一可实现的方式,该方法还包括:
若接收到I/O命令,则判断所述I/O命令是否携带被分配的锁钥,如果是,则允许所述I/O命令;否则,拒绝所述I/O命令。
根据本申请实施例一可实现的方式,还包括:
若接收到其他存储侧管理节点共享来的允许相关命令的信息,则返回响应;
其中,若允许相关命令的信息与本地存储的锁共享信息不冲突,则更新本地存储的锁共享信息,否则在所述响应中携带存在命令冲突的信息。
根据本申请实施例一可实现的方式,该方法还包括:
若不允许所述相关命令,则向所述主机返回拒绝所述相关命令的信息。
根据本申请实施例一可实现的方式,所述系统还包含分布式装置,所述方法还包括:
存储侧管理节点将本地存储的锁共享信息发送给分布式装置进行序列化存储,以便于新加入所述系统的存储侧管理节点从所述分布式装置获取锁共享信息并存储于本地。
根据第二方面,提供了一种分布式锁的实现装置,应用于包含多个主机、多个存储侧管理节点、分布式装置和共享存储空间的系统,所述装置设置于所述存储侧管理节点,包括:
第一通信单元,被配置为接收主机请求所述共享存储空间的相关命令;
决策单元,被配置为根据所述存储侧管理节点本地的锁共享信息,确定是否允许所述相关命令;
锁信息维护单元,被配置为若所述决策单元确定允许所述相关命令,则更新所述锁共享信息,其中,所述锁共享信息维护有所述共享存储空间的状态信息,所述状态信息包括被注册的信息、被预留的信息、被抢占的信息或空闲的信息;
第二通信单元,被配置为将允许所述相关命令的信息共享给其他存储侧管理节点。
根据第三方面,提供了一种分布式锁的实现系统,包括多个主机、多个存储侧管理节点和共享存储空间;
所述主机,被配置为向存储侧管理节点发送请求所述共享存储空间的相关命令;
所述存储侧管理节点,被配置为接收主机请求所述共享存储空间的相关命令;根据所述存储侧管理节点本地的锁共享信息,确定是否允许所述相关命令;若允许所述相关命令,则更新所述锁共享信息,将允许所述相关命令的信息共享给其他存储侧管理节点;其中,所述锁共享信息维护有所述共享存储空间的状态信息,所述状态信息包括被注册的信息、被预留的信息、被抢占的信息或空闲的信息。
根据第四方面,提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述第一方面中任一项所述的方法的步骤。
根据第五方面,提供了一种电子设备,其特征在于,包括:
一个或多个处理器;以及
与所述一个或多个处理器关联的存储器,所述存储器用于存储程序指令,所述程序指令在被所述一个或多个处理器读取执行时,执行上述第一方面中任一项所述的方法的步骤。
根据本申请提供的具体实施例,本申请的技术方案可以具备以下优点:
1)本申请中接收到主机请求共享存储空间的相关命令后,通过存储侧管理节点维护的锁共享信息来确定是否允许该相关命令,其中该锁共享信息是通过与各存储侧管理节点的锁信息共享机制来维护的,从而保证主机对共享存储空间的操作不发生冲突。
2)本申请中的分布式锁不是在存储设备实现,而是在存储侧的第一层(传输承载层)实现,能够与现有主机和存储设备硬件适配,无需进行硬件改造,降低了实现成本。
3)本申请能够进一步在被动节点失联或被动节点确定存在命令冲突的情况下,拒绝相关命令,更加高可靠地避免冲突导致的数据损坏。
当然,实施本申请的任一产品并不一定需要同时达到以上所述的所有优点。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示出了可以应用本申请实施例的示例性系统架构;
图2为本申请实施例提供的主要方法流程图;
图3为本申请实施例提供的分布式锁在存储管理节点上的实现架构;
图4为本申请实施例提供的处理register命令的流程图;
图5为本申请实施例提供的处理reserve命令的流程图;
图6为本申请实施例提供的处理抢占命令的流程图;
图7为本申请实施例提供的处理I/O命令的流程图;
图8示出根据一个实施例的分布式锁的实现装置的示意性框图;
图9示例性的展示出了电子设备的架构。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本申请保护的范围。
在本发明实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。
应当理解,本文中使用的术语“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”或“响应于检测”。类似地,取决于语境,短语“如果确定”或“如果检测(陈述的条件或事件)”可以被解释成为“当确定时”或“响应于确定”或“当检测(陈述的条件或事件)时”或“响应于检测(陈述的条件或事件)”。
目前已有一些企业在存储产品中实现了分布式锁,但其实现方式是通过在存储设备中设置双控制器来实现。在同一存储空间的访问路径上需要两个控制器同时存在,并且需要特殊的硬件支持,即需要对存储设备进行硬件改造,造成了成本的增加。
而本申请则采用了完全不同的实现思路,不是在存储设备实现,而是在接收命令的第一层即传输承载层实现。为了方便对本申请的理解,首先参见图1,图1示出了可以应用本申请实施例的示例性系统架构。
该系统架构主要包括多个主机(initiator)、多个存储侧管理节点和共享存储空间,还可以进一步包括分布式装置。其中主机为访问共享存储空间的设备,可以为各种计算节点,可以是物理设备,也可以是虚拟设备。主机提供iSCSI initiator(发起方)能力,例如可以通过libiscsi(iscsi的一种静态数据连接库)提供。iSCSI initiator可以发现后端iSCSI Target Server(目标服务器)以及对应的存储空间所对应LUN的扫描能力。iSCSI(Internet Small Computer System Interface,Internet小型计算机系统接口)是一种IPSAN((Storage Area Network,存储区域网络)技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,基于TCP/IP的协议连接iSCSI Target Server和iSCSIInitiator,使得封装后的SCSI数据包可以在通用互联网传输。iSCSI initiator和iSCSITarget Server是SCSI协议的客户端设备和服务端设备。iSCSI initiator用于将请求连接到iSCSI Target Server,由iSCSI Target Server响应该请求。
存储侧管理节点是存储设备侧负责管理共享存储空间的节点,处于iSCSI TargetServer的传输承载层。在本申请中由存储侧管理节点负责分布式锁的实现。存储侧管理节点根据本地的锁共享信息对来自主机的相关命令进行决策,确定是否允许该相关命令,并将允许相关命令的信息共享给其他存储侧管理节点,从而保证各存储侧管理节点本地的锁共享信息统一。
分布式装置用以对各存储侧管理节点本地的锁共享信息进行序列化存储。
在本系统中,存储侧管理节点通常为多个。多个主机可以通过不同的存储侧管理节点访问共享存储空间。主机发送的相关命令通常会被其中一个存储侧管理节点拦截。例如,主机发送的相关命令通过负载均衡的方式被发送至其中一个存储侧管理节点。再例如,主机发送的相关命令基于就近原则被发送至其中一个存储侧管理节点,等等。
主机与存储侧管理节点之间、存储侧网络节点之间、存储侧网络节点和分布式装置之间可以通过各种网络连接进行交互,例如有线、无线通信链路或者光纤电缆等等。
共享存储空间指的是存储设备中的硬盘等可用于多个主机进行数据存储的空间。由于通常为了避免数据读写冲突,是按照最小存储单元进行锁控制的,因此,本申请实施例中涉及的分布式锁的实现中所针对的共享存储空间通常是诸如LUN所指向的最小存储单元。各存储侧管理节点连接共同的共享存储空间,但在各存储侧逻辑节点中均存在指向该共享存储空间的LUN。
应该理解,图1中的主机、存储侧管理节点、分布式装置和共享存储空间的数目仅仅是示意性的。根据实现需要,可以具有任意数目的主机、存储侧管理节点和共享存储空间。
图2为本申请实施例提供的主要方法流程图,该方法由图1所示架构中的存储侧管理节点执行。如图2中所示,该方法可以包括以下步骤:
步骤201:接收主动节点发送的主机请求共享存储空间的相关命令。
在此需要说明的是,在本申请实施例中,将接收到主机请求共享存储空间的相关命令的存储侧管理节点为主动(Active)节点,其他存储侧管理节点为被动(Passive)节点。对于一个存储侧管理节点而言,在一些情况下其可能作为主动节点,在另一些情况下可能作为被动节点。
步骤202:根据存储侧管理节点本地的锁共享信息,确定是否允许该相关命令,如果允许执行步骤203;否则执行步骤204。
步骤203:更新上述锁共享信息,将允许该相关命令的信息共享给其他存储侧管理节点以供其他存储侧管理节点更新本地的锁共享信息。
步骤204:向主机返回拒绝该相关命令的消息。
可以看出,本申请中接收到主机请求共享存储空间的相关命令后,通过存储侧管理节点维护的锁共享信息来确定是否允许该相关命令,其中该锁共享信息是通过与各存储侧管理节点的锁信息共享机制来维护的,从而保证主机对共享存储空间的操作不发生冲突。
另外,本申请中的分布式锁不是在存储设备实现,而是在存储侧的第一层(传输承载层)实现,能够与现有主机和存储设备硬件适配,无需进行硬件改造,降低了实现成本。
下面对上述流程中的各步骤进行详细描述。首先结合实施例对上述步骤201即“接收主动节点发送的主机请求共享存储空间的相关命令”进行详细描述。
本申请所涉及的分布式锁可以适用于多种协议诸如SCSI和NVMe(non-volatilememory express,非易失性内存主机控制器接口规范),在本申请实施例中以SCSI协议为例。主机请求共享存储空间的相关命令主要包括register(注册)命令、reserve(预留)命令、抢占命令和I/O命令。原本这些相关命令是发送给存储设备的,本申请中由存储侧管理节点(主动节点)截获该相关命令。
由于诸如SCSIPR(Persistent Reservation,永久保留)锁等分布式锁的控制主要在reserve命令和抢占命令的实现上,因此,在本步骤中可以首先对接收到的主机请求共享存储空间的相关命令的类型进行解析,如果相关命令为reserve命令或抢占命令,则继续执行后续步骤202。
但若解析确定相关命令为注册命令,由于通常都会允许主机进行注册,注册不受是否冲突的影响,因此可以直接允许该注册命令,并将注册信息共享给各被动节点。这里将注册信息共享给被动节点的目的是为了使得其他存储侧管理节点也能够具有该主机的注册信息,下次该主机向其他存储侧管理节点发起预留命令或抢占命令时,其他存储侧管理节点也能够及时进行处理。注册命令的具体流程将在后续实施例中具体描述。
对于I/O命令而言,是否允许I/O命令采用的是另外一套逻辑,即要分析I/O命令是否携带被分配的锁key(钥),只有在携带正确的锁key的情况下,才允许I/O命令;否则拒绝I/O命令。其中锁key是在主机reserve或抢占成功后被分配的,将在后续实施例中详述。
下面结合实施例对上述步骤202即“根据存储侧管理节点本地的锁共享信息,确定是否允许该相关命令”进行详细描述。
本申请实施例中涉及的锁共享信息(例如表示为PRinfo)可以包括各存储侧管理节点本地存储的锁共享信息和分布式装置本地存储的锁共享信息。
其中,存储侧管理节点接收到主机请求共享存储空间的相关命令(例如reserve命令或抢占命令)后,需要判断该共享存储空间当前的锁状态。各存储侧管理节点本地维护有锁共享信息,该锁共享信息维护有共享存储空间的状态信息,其中状态信息可以主要包括被注册的信息、被预留的信息、被抢占的信息或空闲的信息等等。当然状态信息也可以采用其他更细粒度或者更粗粒度的表示方式,在此不做列举。
更具体地,共享存储空间的状态信息可以是诸如:host id-LUN id-register/reserve/抢占的信息,也可以是诸如LUN id-空闲的信息。即可以记录共享存储空间的标识、被主机register、reserve或抢占的状态以及主机标识,若处于空闲状态,则仅需要记录共享存储空间的标识以及空闲状态即可。也可以采用其他形式的记录方式,在此不做列举。
对于reserve命令或抢占命令而言,作为其中一种可实现的方式,若主机所请求的共享存储空间已被其他主机已经预留或者抢占,则不允许该reserve命令或抢占命令,否则允许该reserve命令或抢占命令。
例如,主机1向node1发送了reserve命令请求reserve LUN1,但node1根据本地PRinfo确定LUN1已被主机2reserve或者抢占,则拒绝该reserve命令。
由于在系统中存在多个存储侧管理节点,因此一方面所有存储侧管理节点维护的锁共享信息需要统一,另一方面每个存储侧管理节点都需要获知当前准确的锁状态。每次允许主机请求共享存储空间的相关命令后,作为主动节点的存储侧管理节点需要将关于该共享存储空间的最新锁信息分享给各存储侧管理节点,从而使得各存储侧管理节点获知最新的锁信息。因此会执行步骤203。
下面结合实施例对步骤203即“更新上述锁共享信息,将允许该相关命令的信息共享给各被动节点”。
若主动节点确定允许上述相关命令,除了更新本地的锁共享信息之外,还需要将允许该相关命令的信息分享给各被动节点。其中,主动节点在将允许相关命令的信息分享给各被动节点时,可以采用调用各被动节点接口的方式。各被动节点可以通过回调的方式向分布式装置返回响应消息。各存储侧管理节点中可以设置有分布式模块来实现各存储侧管理节点之间的通信。关于各存储侧管理节点之间的通信可以通过目前已有的诸如女娲系统等来实现,具体不做详述。
另外,各存储侧管理节点可以周期性地或者受到触发后或者接收到分布式装置的请求后,将本地存储的锁共享信息提供给分布式装置,由分布式装置进行锁共享信息的序列化保存。
作为一种可实现的方式,当存在新加入的存储侧管理节点时,能够从该分布式装置处获取锁共享信息,并存储于本地。或者,当某个存储侧管理节点发生异常丢失本地存储的锁共享信息或者没有及时更新锁共享信息时,能够从分布式装置处获取锁共享信息,并存储于本地。
更进一步地,本步骤中存储侧管理节点之间的通信实际上也同时实现了对存储侧管理节点的失联检测。例如,若主动节点将允许相关命令的信息发送给各被动节点的设定时长内,未收到该被动节点返回的响应,则确定该被动节点失联。由于系统中存在存储侧管理节点失联,因此无法确定该共享存储空间当前状态信息的准确性。作为一种可实现的方式,若存在存储侧管理节点失联,则不允许执行该相关命令,可以由主动节点返回拒绝该相关命令的消息。
若主动节点允许该主机执行reserve命令或抢占命令,则该主动节点会为该主机分配锁key,只有持该锁key的主机才能够对上述的共享存储空间进行I/O操作。上述锁key可以是一个随机或者按照一定规则生成字符串,本申请对锁key的生成方式并不加以限制,只要能够保证锁key的唯一性即可。
主动节点可以向主机返回允许该相关命令的消息,在该消息中携带上述为该主机分配的锁key。
除了上述分配锁key的方式之外,也可以不为主机分配锁key,仅在主动节点本地记录主机reserve或抢占共享存储空间成功。接收到该主机的I/O命令后,允许主机1的I/O命令。
更进一步地,作为被动节点的其他存储侧管理节点接收到允许相关命令的信息后,作为一种可实现的方式,可以利用允许相关命令的信息更新本地的锁共享信息。
但作为另一种可实现的方式,被动节点在接收到允许相关命令的信息后,如果相关命令为reserve或抢占命令,则可以首先依据本地的锁共享信息判断该reserve或抢占命令是否存在冲突,例如允许reserve或抢占命令是允许host1预留或抢占LUN1,但被动节点本地存储的锁共享信息表明已有其他主机例如host2预留或抢占了LUN1,则可以不更新本地的锁共享信息,且在返回给主动节点的响应中指示存在命令冲突的信息。
若相关命令为注册信息,则通常被动节点无需判断,直接在本地锁共享信息中存储注册信息即可。
为了方便对整个系统中分布式锁实现进行理解,以图3为例进行整体架构上的介绍。图3中以三个存储侧管理节点node-A、node-B和node-C为例,每个存储侧管理节点中包括接收队列(RequestQueue)和发送队列(ResponseQueue)。以node-A为例,接收到主机请求访问共享存储空间的相关命令后,将相关命令送入接收队列。对于向主机返回的拒绝相关命令或允许相关命令的消息则送入发送队列后,按顺序返回给主机。
存储侧管理节点中实现分布式锁的模块表示为TS,在图中分别以TS-A、TS-B和TS-C表示。以TS-A为例,其中分布式(Distribute)模块用以实现各存储侧管理节点之间的通讯。PR模块用以维护本地的PR info。本地的PR info可以在RAM(Random Access Memory,随机访问存储器)中实现,从而实现锁信息的快速读取和更新。
分布式装置负责将存储侧管理节点的PR info序列化保存。
下面结合实施例分别对register命令、reserve命令、抢占命令和I/O命令的实现流程进行举例描述。
图4为本申请实施例提供的处理register命令的流程图,鉴于图中空间的限制,该流程中以两个存储侧管理节点node1和node2为例,其他node并未示出。如图5中所示,该流程可以包括以下步骤:
步骤401:主机1向node1发送register命令,假设该register命令为主机1请求注册LUN1的命令。
步骤402:node1调用分布式模块的接口,将register信息发送至其他存储侧管理节点即node2。
步骤403:node2将主机1的register信息保存在本地。例如,node2可以在本地保存:host1-LUN1-register信息。
步骤404:node2返回响应消息。该响应消息用以指示已接收到该register信息。
步骤405:node1在本地保存register信息。例如,node2可以在本地保存:host1-LUN1-register信息。
步骤406:node1向主机1返回允许register的消息。
需要说明的是,上述步骤402~404与步骤405也可以同时执行,或者还可以先执行步骤405再执行步骤402~404,本申请对此不加以限制。
主机1通过上述流程注册完成后,可以通过图5所示流程请求预留共享存储空间。图5为本申请实施例提供的处理reserve命令的流程图,鉴于图中空间的限制,该流程中以两个存储侧管理节点node1和node2为例,其他node并未示出。如图5中所示,该流程可以包括以下步骤:
步骤501:主机1向node1发送reserve命令,假设该reserve命令包含主机1请求预留LUN1的信息。
步骤502:node1依据本地维护的锁共享信息确定LUN1的状态,如果锁共享信息包含LUN1被其他主机已经预留或抢占,需要拒绝该reserve命令,执行步骤509;否则允许该reserve命令,执行步骤503。
步骤503:node1更新本地维护的锁共享信息。
即在本地维护的锁共享信息中,记录host1-LUN1-reserve状态,还可以进一步记录是通过node1预留的信息。
步骤504:node1调用分布式模块的接口,将允许reserve的信息发送给其他存储侧管理节点即node2。
步骤505:node2更新本地存储的锁共享信息,即将本地存储的锁共享信息中LUN1的状态更新为host1-LUN1-reserve状态。
正常情况下,node2与分布式装置中的锁共享信息是统一的,但可能在某些异常情况下,node2本地存储的锁共享信息中LUN1的状态可能已被其他主机预留或抢占,则说明当前reserve命令发生冲突。这种情况下可以不做本地LUN1的状态更新。
步骤506:node2返回响应消息。
若node2依据本地存储的锁共享信息确定不存在命令冲突,则返回正常的响应消息指示已接收到共享的信息即可。
若node2依据本地存储的锁共享信息确定存在命令冲突,则可以在响应消息中存在命令冲突。
如果所有被动节点均返回正常的响应消息,则执行507。如果存在被动节点返回响应指示存在命令冲突,则拒绝reserve命令,即执行509。
步骤507:node1为主机1分配锁key。
需要说明的是,上述步骤503涉及的更新锁共享信息的步骤也可以在步骤507时执行。
步骤508:node1向主机1返回允许该reserve命令的信息,该信息中携带为主机1分配的锁key。
下面是不允许reserve命令时的步骤:
步骤509:node1向主机1返回拒绝该reserve命令的信息。
对于发生命令冲突的情况,可以启动异常处理机制,由异常处理机制来确定当前LUN1的状态并更新各node中LUN1的状态。具体异常处理机制的内容本申请不加以限制,例如可以人工参与进行异常处理。
若主机1通过上述流程被拒绝reserve,则可以通过抢占流程尝试抢占LUN1。或者,若主机1通过图4所示流程注册成功后,也可以直接尝试抢占流程。具体采用哪种方式取决于主机1的处理逻辑。图6为本申请实施例提供的处理抢占命令的流程图,鉴于图中空间的限制,该流程中以两个存储侧管理节点node1和node2为例,其他node并未示出。如图6中所示,该流程可以包括以下步骤:
步骤601:主机1向node1发送抢占命令,假设该抢占命令包含主机1请求预留LUN1的信息。
步骤602:node1依据本地维护的锁共享信息确定LUN1的状态,如果锁共享信息包含LUN1被其他主机已经预留或抢占,需要拒绝该抢占命令,执行步骤609;否则允许该抢占命令,执行步骤603。
在实际应用中,也可以设计其他抢占逻辑。例如,按照主机的级别高低决定同一时间只能有一个主机抢占成功,而哪个主机能够抢占成功则根据抢占的主机级别来确定。在此不做一一列举。
步骤603:node1更新本地维护的锁共享信息。
即在本地维护的锁共享信息中,记录host1-LUN1-抢占状态,还可以进一步记录是通过node1抢占的信息。
步骤604:node1调用分布式模块的接口,将允许抢占的信息发送给其他存储侧管理节点即node2。
步骤605:node2更新本地存储的锁共享信息,即将本地存储的锁共享信息中LUN1的状态更新为host1-LUN1-抢占状态。
正常情况下,node2与分布式装置中的锁共享信息是统一的,但可能在某些异常情况下,node2本地存储的锁共享信息中LUN1的状态可能已被其他主机预留或抢占,则说明当前抢占命令发生冲突。这种情况下可以不做本地LUN1的状态更新。
步骤606:node2返回响应消息。
若node2依据本地存储的锁共享信息确定不存在命令冲突,则返回正常的响应消息指示已接收到共享的信息即可。
若node2依据本地存储的锁共享信息确定存在命令冲突,则可以在响应消息中指示存在命令冲突。
如果所有被动节点均返回正常的响应消息,则执行607。如果存在被动节点返回响应指示存在命令冲突,则拒绝抢占命令,即执行609。
步骤607:node1为主机1分配锁key。
需要说明的是,上述步骤603涉及的更新锁共享信息的步骤也可以在步骤607时执行。
步骤608:node1向主机1返回允许该抢占命令的信息,该信息中携带为主机1分配的锁key。
下面是不允许抢占命令时的步骤:
步骤609:node1向主机1返回拒绝该抢占命令的信息。
主机1在reserve或抢占LUN1成功后,可以对LUN1进行I/O命令的处理,I/O命令主要包括读、写命令。图7为本申请实施例提供的处理I/O命令的流程图,鉴于图中空间的限制,该流程中以两个存储侧管理节点node1和node2为例,其他node并未示出。如图7中所示,该流程可以包括以下步骤:
步骤701:主机1向node1发送写命令。
步骤702:node1判断该写命令是否携带为主机1分配的锁key,如果是,则执行步骤803;否则执行步骤805。
步骤703:node1允许该写命令,可以将该写命令转发至存储设备进行写操作。
步骤704:node1向主机1返回写成功的信息。
步骤705:node1向主机1返回写失败的信息。
另外,若步骤703将写命令转发至存储设备进行写操作时发生错误,也可以向主机1返回写失败的信息。
图7中是以写命令为例,读命令的处理流程类似,不做赘述。
由以上实施例可以看出,本申请所提供的方式对于主机和存储设备硬件没有改动,能够完全适配,降低了硬件改动所带来的成本,实现了对后端存储完全透明。
上述系统和方法可以应用于混合云场景下企业存储用户对于共享LUN的核心特性需求。通过软件层面的创新,在存储侧的传输承载层通过分布式锁的方式,实现对SCSIPR锁的支持以共享LUN。
在此需要说明的是,本申请实施例中对于共享存储空间被抢占或被reserve状态的释放方式并不加以限制。可以在共享存储空间被抢占或被reserve的状态释放后,转成空闲状态。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
根据另一方面的实施例,提供了一种分布式锁的实现装置。图8示出根据一个实施例的分布式锁的实现装置的示意性框图。如图8所示,该装置800包括:第一通信单元801、决策单元802、锁信息维护单元803和第二通信单元804,还可以进一步包括类型识别单元805。其中各组成单元的主要功能如下:
第一通信单元801,被配置为接收主机请求共享存储空间的相关命令。
决策单元802,被配置为根据存储侧管理节点本地的锁共享信息,确定是否允许相关命令。
锁信息维护单元803,被配置为若决策单元802确定允许相关命令,则更新锁共享信息,其中,锁共享信息维护有共享存储空间的状态信息,状态信息包括被注册的信息、被预留的信息、被抢占的信息或空闲的信息。
第二通信单元804,被配置为将允许相关命令的信息共享给其他存储侧管理节点。
第一通信单元801,进一步被配置为若决策单元802不允许相关命令,则向主机返回拒绝相关命令的信息。
作为其中一种可实现的方式,类型识别单元805,被配置为识别相关命令的类型。若相关命令为预留命令或抢占命令,则触发决策单元802执行根据存储侧管理节点本地的锁共享信息,确定是否允许相关命令的处理。
若相关命令为注册命令,则触发决策单元802确定允许注册命令,并由第二通信单元804将注册信息共享给其他存储侧管理节点。
作为其中一种可实现的方式,决策单元802,被具体配置为:若锁共享信息包含共享存储空间被其他主机预留或抢占的信息,则不允许预留命令或抢占命令,否则,允许预留命令或抢占命令。
相应地,锁信息维护单元803更新锁共享信息时,可以在锁共享信息中更新共享存储空间被发送相关命令的主机预留或抢占的信息。
更进一步地,若决策单元802依据其他存储侧管理节点针对允许相关命令的信息返回的响应,确定存在存储侧管理节点失联或存在命令冲突,则不允许预留命令或抢占命令。
作为一种可实现的方式,所述锁共享信息维护单元803,还用于若允许预留命令或抢占命令,则为主机分配锁钥,并携带在允许预留或抢占的信息中由第一通信单元801返回给主机。
这种情况下,若接收到I/O命令,则决策单元802判断I/O命令是否携带被分配的锁钥,如果是,则允许I/O命令;否则,拒绝I/O命令。
作为一种可实现的方式,存储侧管理节点还可以作为被动节点,此时,第二通信单元804若接收到其他存储侧管理节点共享来的允许相关命令的信息,则返回响应。
其中,若允许相关命令的信息与本地存储的锁共享信息不冲突,则可以由锁信息维护单元803更新本地存储的锁共享信息,否则由第二通信单元804在响应中携带存在命令冲突的信息。
作为一种可实现的方式,上述系统中还可以包含分布式装置,此时锁信息维护单元803可以通过第三通信单元806将本地存储的锁共享信息发送给分布式装置进行序列化存储,以便于新加入系统的存储侧管理节点从分布式装置获取锁共享信息并存储于本地。
需要说明的是,本申请实施例中可能会涉及到对用户数据的使用,在实际应用中,可以在符合所在国的适用法律法规要求的情况下(例如,用户明确同意,对用户切实通知,等),在适用法律法规允许的范围内在本文描述的方案中使用用户特定的个人数据。
另外,本申请实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前述方法实施例中任一项所述的方法的步骤。
以及一种电子设备,包括:
一个或多个处理器;以及
与所述一个或多个处理器关联的存储器,所述存储器用于存储程序指令,所述程序指令在被所述一个或多个处理器读取执行时,执行前述方法实施例中任一项所述的方法的步骤。
其中,图9示例性的展示出了电子设备的架构,具体可以包括处理器910,视频显示适配器911,磁盘驱动器912,输入/输出接口913,网络接口914,以及存储器920。上述处理器910、视频显示适配器911、磁盘驱动器912、输入/输出接口913、网络接口914,与存储器920之间可以通过通信总线930进行通信连接。
其中,处理器910可以采用通用的CPU、微处理器、应用专用集成电路(ApplicationSpecific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本申请所提供的技术方案。
存储器920可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器920可以存储用于控制电子设备900运行的操作系统921,用于控制电子设备900的低级别操作的基本输入输出系统(BIOS)922。另外,还可以存储网页浏览器923,数据存储管理系统924,以及分布式装置/存储侧管理节点925等等。上述分布式装置/存储侧管理节点925就可以是本申请实施例中具体实现前述各步骤操作的应用程序。总之,在通过软件或者固件来实现本申请所提供的技术方案时,相关的程序代码保存在存储器920中,并由处理器910来调用执行。
输入/输出接口913用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
网络接口914用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。
总线包括一通路,在设备的各个组件(例如处理器910、视频显示适配器911、磁盘驱动器912、输入/输出接口913、网络接口914,与存储器920)之间传输信息。
需要说明的是,尽管上述设备仅示出了处理器910、视频显示适配器911、磁盘驱动器99、输入/输出接口913、网络接口914,存储器920,总线930等,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本申请方案所必需的组件,而不必包含图中所示的全部组件。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的系统及系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上对本申请所提供的技术方案进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本申请的限制。
Claims (13)
1.分布式锁的实现方法,应用于包含多个主机、多个存储侧管理节点和共享存储空间的系统;所述方法包括:
存储侧管理节点接收主机请求所述共享存储空间的相关命令;
根据所述存储侧管理节点本地的锁共享信息,确定是否允许所述相关命令;
若允许所述相关命令,则更新所述锁共享信息,将允许所述相关命令的信息共享给其他存储侧管理节点以供更新其他存储侧管理节点本地的锁共享信息;
其中,所述锁共享信息维护有所述共享存储空间的状态信息,所述状态信息包括被注册的信息、被预留的信息、被抢占的信息或空闲的信息。
2.根据权利要求1所述的方法,其中,在根据所述存储侧管理节点本地的锁共享信息,确定是否允许所述相关命令之前,还包括:
识别所述相关命令的类型;
若所述相关命令为预留命令或抢占命令,则继续执行根据所述存储侧管理节点本地的锁共享信息,确定是否允许所述相关命令的步骤;
若所述相关命令为注册命令,则确定允许所述注册命令,并将注册信息共享给其他存储侧管理节点。
3.根据权利要求2所述的方法,其中,根据所述存储侧管理节点本地的锁共享信息,确定是否允许所述相关命令包括:
若所述锁共享信息包含所述共享存储空间被其他主机预留或抢占的信息,则不允许所述预留命令或抢占命令,否则,允许所述预留命令或抢占命令;
更新所述锁共享信息包括:在所述锁共享信息中更新所述共享存储空间被发送所述相关命令的主机预留或抢占的信息。
4.根据权利要求2所述的方法,该方法还包括:
若依据其他存储侧管理节点针对允许所述相关命令的信息返回的响应,确定存在存储侧管理节点失联或存在命令冲突,则不允许所述预留命令或抢占命令。
5.根据权利要求2所述的方法,该方法还包括:
若允许所述预留命令或抢占命令,则为所述主机分配锁钥。
6.根据权利要求5所述的方法,其中,该方法还包括:
若接收到I/O命令,则判断所述I/O命令是否携带被分配的锁钥,如果是,则允许所述I/O命令;否则,拒绝所述I/O命令。
7.根据权利要求1所述的方法,还包括:
若接收到其他存储侧管理节点共享来的允许相关命令的信息,则返回响应;
其中,若允许相关命令的信息与本地存储的锁共享信息不冲突,则更新本地存储的锁共享信息,否则在所述响应中携带存在命令冲突的信息。
8.根据权利要求1至7中任一项所述的方法,该方法还包括:
若不允许所述相关命令,则向所述主机返回拒绝所述相关命令的信息。
9.根据权利要求1至7中任一项所述的方法,所述系统还包含分布式装置,所述方法还包括:
存储侧管理节点将本地存储的锁共享信息发送给分布式装置进行序列化存储,以便于新加入所述系统的存储侧管理节点从所述分布式装置获取锁共享信息并存储于本地。
10.分布式锁的实现装置,应用于包含多个主机、多个存储侧管理节点、分布式装置和共享存储空间的系统,所述装置设置于所述存储侧管理节点,包括:
第一通信单元,被配置为接收主机请求所述共享存储空间的相关命令;
决策单元,被配置为根据所述存储侧管理节点本地的锁共享信息,确定是否允许所述相关命令;
锁信息维护单元,被配置为若所述决策单元确定允许所述相关命令,则更新所述锁共享信息,其中,所述锁共享信息维护有所述共享存储空间的状态信息,所述状态信息包括被注册的信息、被预留的信息、被抢占的信息或空闲的信息;
第二通信单元,被配置为将允许所述相关命令的信息共享给其他存储侧管理节点。
11.一种分布式锁的实现系统,包括多个主机、多个存储侧管理节点和共享存储空间;
所述主机,被配置为向存储侧管理节点发送请求所述共享存储空间的相关命令;
所述存储侧管理节点,被配置为接收主机请求所述共享存储空间的相关命令;根据所述存储侧管理节点本地的锁共享信息,确定是否允许所述相关命令;若允许所述相关命令,则更新所述锁共享信息,将允许所述相关命令的信息共享给其他存储侧管理节点;其中,所述锁共享信息维护有所述共享存储空间的状态信息,所述状态信息包括被注册的信息、被预留的信息、被抢占的信息或空闲的信息。
12.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1至9中任一项所述的方法的步骤。
13.一种电子设备,其特征在于,包括:
一个或多个处理器;以及
与所述一个或多个处理器关联的存储器,所述存储器用于存储程序指令,所述程序指令在被所述一个或多个处理器读取执行时,执行权利要求1至9中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210135345.2A CN114579321A (zh) | 2022-02-14 | 2022-02-14 | 分布式锁的实现方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210135345.2A CN114579321A (zh) | 2022-02-14 | 2022-02-14 | 分布式锁的实现方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114579321A true CN114579321A (zh) | 2022-06-03 |
Family
ID=81770066
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210135345.2A Pending CN114579321A (zh) | 2022-02-14 | 2022-02-14 | 分布式锁的实现方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114579321A (zh) |
-
2022
- 2022-02-14 CN CN202210135345.2A patent/CN114579321A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11144209B2 (en) | Method, apparatus and computer program product for managing input/output | |
KR20220011063A (ko) | 서버 리소스 할당 방법, 장치, 전자 기기 및 저장 매체 | |
US10678465B2 (en) | Seamless migration of storage volumes between storage arrays | |
EP3470984B1 (en) | Method, device, and system for managing disk lock | |
CN109491725B (zh) | 应用程序可交互多开方法和系统、存储介质、电子设备 | |
JPH0628293A (ja) | サービス・アクセス・ポイントに接続を分散する通信制御システム | |
JP2002222110A (ja) | ストレージシステム及び仮想プライベートボリューム制御方法 | |
CN104937584A (zh) | 基于共享资源的质量向经优先级排序的虚拟机和应用程序提供优化的服务质量 | |
US8127062B2 (en) | Interlocking input/outputs on a virtual logic unit number | |
US20030225928A1 (en) | Method, system, and program for managing access to a device by device specific components and operating system specific components | |
US8677014B2 (en) | Fine granularity exchange level load balancing in a multiprocessor storage area network | |
CN111343262B (zh) | 分布式集群登录方法、装置、设备和存储介质 | |
EP2084611B1 (en) | Virtualization support in a multiprocessor storage area network | |
CN111324425B (zh) | 一种数据访问方法、装置、设备及存储介质 | |
US9588913B2 (en) | Management of allocation for alias devices | |
KR20100008363A (ko) | 물리적 네트워크 인터페이스 선택 | |
US7395337B2 (en) | Method, system, and program for establishing and requesting status on a computational resource | |
EP2087430B1 (en) | Lock manager rotation in a multiprocessor storage area network | |
CN115421787A (zh) | 指令执行方法、装置、设备、系统、程序产品及介质 | |
US9088569B2 (en) | Managing access to a shared resource using client access credentials | |
WO2006015924A2 (en) | Managing paths to an input/output (i/o) device | |
US5495582A (en) | System and method for interprocessor routing through an established communication session in a loosely coupled computer complex | |
US20180067780A1 (en) | Server storage system management system and management method | |
CN114579321A (zh) | 分布式锁的实现方法及装置 | |
US6886053B2 (en) | Method, system, and program for managing access to a device |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |