使用网络和基于碟片上的方案的混合锁定的制作方法

文档序号:7722342阅读:157来源:国知局
专利名称:使用网络和基于碟片上的方案的混合锁定的制作方法
使用网络和基于碟片上的方案的混合锁定相关申请的交叉引用本申请要求2009年2月5日提交的美国临时申请No.61/150,094的权益。本申请是 2007 年 2 月 16 日提交的名称为 “System and Method forlmplemented Distributed Locks via On-Disk Heartbeating”的美国专利申请No. 11/676,109的部分继续申请,以 R 2004 ^f-2 J3i 6 Hil^W^^^J "Providing multiple concurrent access to a file system"的美国专利申请No. 10/773,613的部分继续申请,以引用的方式将这两个申请并 入本文。
背景技术
分布式(或跨主机的)锁可以用于同步多个节点(即主机)的操作。可以使用网 络锁管理器(NLM),或替代地,在更加可靠的存储区域网络(SAN)可用的系统中,使用碟片 上基于租用的锁(on-disklease-based lock)来实施分布式锁。网络容易出故障,并且当主机的IP网络不工作或者管理锁的主机崩溃时,必须选 出用于锁的新管理器,而且有很多复杂的实施问题。这些系统还必须从网络分区中恢复, 这会导致所谓的“脑分裂”问题,其中集群可能分裂为两个或更多的子集群,每个子集群可 能对重要的碟片上资源要求独占。因此,NLM对节点失效的最大数量有限制。NLM可以将 至IJ “仲裁(quorum) ”碟片的心跳选作为帮助确定节点是否宕机的额外途径,诸如Red Hat Cluster Suite和VERITAS ClusterService的集群软件在过去已经使用“仲裁”碟片的概 念,尽管它们不具体实施锁。碟片上基于租用的锁依赖于互斥原语(mutual exclusionprimitives),诸如为绝 大多数碟片阵列控制器所支持的SCSI-2保留/释放或SCSI-3持久性保留/释放。碟片阵 列控制器管理物理碟片驱动,并将它们作为逻辑数据存储单元(DSU)向连接的计算机系统 呈现,每个物理碟片驱动用逻辑单元号(LUN)来标识。碟片上基于租用的锁的性能取决于 这些存储系统所提供的互斥原语的功效。具体地,SCSI-2保留可能与LUN粒度上的那些操作一样花费大,并将对DSU的访 问限制到持有保留的节点。因此,连附到DSU的任何其他计算机系统在保留持续结束之前, 不能进行到LUN的输入输出。同时,基于SCSI-3的保留允许来自持有保留的节点之外的节 点/起始器的输入输出,但是SCSI保留/释放的开销可能仍然被禁止。

发明内容
在一个实施例中,公开了一种由节点获取在多个互连节点的系统中的共享资源上 的锁的方法。竞争共享资源上的锁的每个节点维护该节点当前所拥有的锁的列表。锁元数 据被维护在共享存储上,可能竞争共享资源上的锁的所有节点可以访问该共享存储。在对 应于每个节点的共享资源上维护心跳区,这样节点可以注册其活性。锁状态被维护在共享 存储内的锁元数据中。锁状态可以指示锁被排他持有、锁空闲或锁处于管理模式(managed mode)。如果锁是以管理模式被持有,则可以不必使用互斥原语,将锁的所有权转移给另一节点。在另一实施例中,公开了一种在第一节点从第二节点接收释放锁的请求的方法。 该方法包括检查第一节点的本地锁元数据。如果本地锁元数据包括指示该锁正由第一节点 以排他模式所拥有的信息,则向第二节点发送指示该锁正被使用的消息。如果本地锁元数 据包括指示该锁正由第一节点持有但不被使用的信息,则第二节点将该锁的信息从本地锁 元数据移除,并且更新在对应于该锁的心跳区中的信息,以将该锁授予给第二节点。向第二 节点返回指示该锁被授予的消息。在一个实施例中,释放请求经由IP网络被接收。在又一实施例中,公开了一种用于存储以执行以下方法步骤的程序指令的计算机 可读介质(a)探查节点的本地锁元数据,以确定在本地锁元数据中是否存在该锁的锁元 数据,其中锁元数据包括锁的标识和锁状态;(b)如果在所述本地锁元数据中不存在所述 锁元数据,则执行步骤(i)到(iv),(i)从共享存储中读取所述锁的共享锁元数据,所述读 取包括识别所述锁的当前拥有者和所述锁的当前状态;(ii)探查所述锁的所述当前拥有 者的心跳区,以确定所述当前拥有者是否活着,其中如果所述当前拥有者不是活着的,则等 待锁租用时间流逝,然后获取所述锁,并更新所述共享锁元数据以指示所述锁现在由所述 节点拥有;(iii)如果所述锁的所述当前状态指示所述当前拥有者正以排他模式持有所述 锁,则向所述节点返回消息以通知所述锁不是空闲的;(iv)如果所述锁的当前状态指示所 述当前拥有者正以管理模式持有所述锁,则向所述当前拥有者发送释放所述锁的请求,其 中如果所述当前拥有者还没有将所述锁释放给另一请求节点,则将所述锁授予给所述节点 而不在所述共享资源上执行互斥原语操作,并且更新所述共享锁元数据以指示新的锁所有 权和锁状态;(c)如果在所述本地锁元数据中存在所述节点的所述锁元数据,则探查在所 述本地锁元数据中的所述锁的所述锁状态,如果在所述本地锁元数据中的所述锁的锁状态 指示所述锁正以管理模式被拥有,则改变本地锁元数据中的所述锁的锁状态以指示所述节 点对所述锁的排他使用,并更新所述共享锁元数据(而不用执行互斥原语)以指示所述锁 正以排他模式被所述节点拥有。所述管理模式意指所述锁正由所述节点拥有,但是所述锁 未被所述节点使用。


图1图示了根据本发明一个或多个实施例的用于提供混合锁定的系统的逻辑图。图2图示了根据本发明一个或多个实施例的用于存储锁信息的存储段的逻辑图。图3从概念上图示了根据本发明一个或多个实施例的多个节点、节点实例、锁、和 心跳之间的逻辑组织和关系。图4从概念上图示了根据本发明一个或多个实施例的锁、心跳区和心跳段之间的逻辑组织和关系。图5-9图示了根据本发明一个或多个实施例的用于获取锁的流程图。
具体实施例方式图1图示了用于提供对共享资源的混合锁定的系统。资源可以是必须控制对其的 共享访问的实体,典型地是文件、记录、或共享存储器的区域,但是也可以是应用设计者选 择的任何实体。节点是有资源所有权能力的任何实体。另外,节点可以具有由系统内的持久性标识符识别的可选特性,并且具有对共享资源保持基于租用的锁的能力。在一个或多个实施例中,每次节点被重启或重新初始化,创建该节点的不同实例。如在此所使用的,术语“节点”意指连接到计算机网络的任何设备。节点可以是计 算机、个人数字助理(PDA)、蜂窝电话、或多种其他网络装置。在IP网络上,节点是具有IP 地址的任何设备。在图1图示的系统中,任何计算机102均可以是节点。当在虚拟机环境中实施本 发明时,可以将任何虚拟机100认为是节点。在一个或多个实施例中,节点用锁获取对资源 的控制。特定节点实例所获取的锁与单个心跳相关联。心跳被实施为碟片上的数据结构, 其包含用于识别特定节点实例的各种信息。锁也被实施为碟片上的数据结构,其包含用于 识别拥有锁的节点实例的信息和对应于心跳的节点的地址。图1的系统包括共享存储104,其包括用来存储锁定信息的心跳区106。共享资源 和节点使用局域网(LAN) 108和存储区域网络(SAN) 110互连,局域网108可以是因特网、局 域网或广域网。在一个实施例中,SAN 110和LAN 108可以是同一网络。应当注意,可以在 非虚拟化环境以及虚拟化环境中实践此处描述的实施例。图2图示了在共享存储中的心跳区106的逻辑图。心跳区106包括存储结构,用 于存储心跳数据130、锁元数据132和实施本文档以下将要描述的锁定方法可能需要的其 他锁相关数据134。在一个实施例中,网络108中的所有节点都可以访问心跳数据存储130 和锁元数据存储132。然而,该可访问性易遭受到网络故障。在其他实施例中,还可以将锁 元数据存储在与心跳区相分离的区中。在一个或多个实施例中,每个主机或节点具有用于每个文件系统的心跳区106,以 指示节点的活性。在一个实施例中,节点的活性由节点更新心跳区中的节点心跳数据的能 力所指示。例如,如果因故障或负载大或从网络断开连接,节点变得不可操作,则节点可能 失去其更新心跳数据的能力。节点在获取锁之后改变特定锁元数据区的状态,使得其他节 点在给定的时间能够确定特定锁的拥有者。类似地,当锁被释放时,在对应的锁元数据区更 新锁状态。图3示出多个节点、锁、资源和心跳之间的逻辑组织和关系。在一个实施例中,节 点是与其他节点共享相同资源的任何实体。如所图示,节点280可以已与一个或多个锁 290a, 290b,290c,. . . 290η相关联,每个锁与资源相关联。节点280所持有的锁290a,290b, 290c,.. . 290η中的每个已与指针数据相关联,指针数据识别与节点280的实例唯一关联的 心跳区342a。同样,节点282所持有的锁292a,292b,292c,. . . 292η中的每个已与指针数据 相关联,指针数据识别与节点282的实例唯一关联的心跳区342b。通过要求所有节点在系 统级时间常数内刷新其各自的心跳区,使得其他节点能够确定心跳及其各自的锁是否为有 效或失效的协议是可能的。例如,在图3中,从节点280和282中的每个到其各自心跳的实 曲线指示心跳数据结构的刷新。以虚线图示的节点N是节点的过期实例。节点N不再刷新 其心跳,但是与该节点相关联的锁仍旧指向其各自的心跳342η。如从节点280出发的虚线 所图示的,如果节点280希望获取节点282当前持有的锁,则节点280可以通过监视心跳数 据结构来确定心跳342b是否存活,其在该实例中是仍然“心跳着”。因而,节点280将必须 为获取锁而等待。在另一实施例中,获取锁的失败导致锁操作的失败。相反,如从节点282 出发的虚线所图示的,如果来自节点282的过程希望获取当前由节点N锁定的资源,则节点282可以通过监视心跳数据结构来确定心跳342η是否仍然存活,其在该实例中是“失效”, 因而,节点282可以通过修改其状态值来清除心跳342η,并且此后节点282可以自由地获取 与心跳342η相关联的锁中的一个或多个。在一个实施例中,碟片用于存储心跳段340。通过分配大到足够容纳多个心跳 区342的例如IOM字节的碟片的段340,来实现心跳分配。在该心跳段340中,系统的每 个心跳区342a,342b,... 342η通常可以至少与碟片上的最小扇区大小一样大。例如,在 SCSI碟片上,每个心跳区可以是512字节。替代性地,设计者自行选择各个心跳区342a, 342b,. . . 342η以及整个心跳段可以具有的大小,以优化存储器使用并容纳与系统内的节点 相关联的心跳的预计数目。在本发明中,心跳段340内的心跳区342的数目典型地大于系 统内的活动节点的最大数目。在本文中除非另外指出,否则术语“心跳”可互换使用来指代 数据结构345和数据结构驻留的心跳区342。在此公开的动态心跳分配算法避免了任何将节点提前配置为群集的一部分的要 求。一旦节点分配了心跳区,则其也可以将关于自身的配置信息,比如其IP地址或主机名, 存储在心跳区345的“其他特定于节点的信息”区354中。在图4中,占据心跳区342a,342b,. . . 342η的心跳数据结构345包括以下字段拥 有者标识符、心跳状态、心跳产生数、脉冲字段、其他特定于节点的信息和心跳超时。也称为拥有者的拥有者标识符字段344唯一地标识拥有心跳区的节点,并且可以 用包括但不 限于字母数字或二进制的任何数据类型来实施,该数据类型的长度被选择为允 许系统内的充足的唯一标识符。可以使用任何数量的不同标识方案,只要系统内的所有节 点可以识别当前拥有特定心跳区342的节点。在优选实施例中,通用唯一标识符(UUID)用 于识别节点。在替代实施例中,在仅使用心跳区的地址和心跳产生数就可以唯一地标识节 点实例时,可以省略拥有者字段。然而应当注意,拥有者字段使得能够进行多种优化并简化 调试ο心跳状态字段346指示心跳的当前状态,并且可以用能够采取多种状态的枚举数 据类型来实施。在说明性实施例中,心跳状态值可以采取任何以下状态CLEAR-心跳当前未被使用;IN_USE_心跳结构正由节点使用;BREAKING-心跳已超时,并正由另一节点清除。心跳产生数348是可修改的值,其指示心跳区已被初始化的次数,并可以用64位 整数数据类型来实施。心跳产生数348可以被修改,典型地是每次将心跳区分配给节点时 递增。与心跳区的地址一起,心跳产生数348可以用于唯一地识别心跳的特定实例。例如, 心跳产生数348可以用于确定节点是否已经解除分配心跳区,然后重新分配同一区域。因 此,心跳产生数使其他节点能够确定心跳是否被与锁数据结构中记录的节点相同的实例 (instance)拥有。脉冲字段350是每次心跳由其各自的拥有者更新(心跳着)时改变的值,并且可 以用64位整数数据类型实施。在一个实施例中,脉冲字段350可以用时间戳来实施。替代 地,脉冲字段350可以用另一值来实施,其可以不是时间格式,但是确保心跳每次更新时改 变。其他节点可以通过观察脉冲字段350中的变化来获悉拥有者节点是否在心跳。可以使 用多种技术更新脉冲字段350的值。例如,脉冲字段350可以相对从系统内部得到的初始启动值而递增。替代地,在更新时刻等,可以将脉冲字段350设置为本地时间的值。在说明 性实施例中,为使在此公开的锁租用技术工作,不需要时钟跨主机同步。其他特定于节点的信息区354是未定义的附加存储,其不需要与特定的数据类型 相关联。数据结构345的该区允许将其他有用的数据与特定于心跳的数据一起存储,并且 可以包括对当前拥有心跳的节点唯一或与之相关联的数据。例如,在分布式文件系统的环境中,可以将到用于主题节点的日志文件的指针存储在心跳数据结构345的其他特定于节 点的信息区354内,如果该节点崩溃可以重放该日志文件。在说明性实施例中,碟片上锁365可以用包含以下内容的数据结构来实施持有 锁的节点的地址、到持有锁的节点实例的心跳区342的指针、和获取锁时的心跳的产生数。 以此方式,其他节点可以验证该锁定节点是否仍在心跳,并且自获取锁之后没有崩溃。可以 将锁典型地存储在与心跳段340相同的故障域诸如相同的碟片内。在本发明中,锁数据结 构365与系统内的每个资源相关联并且可以保持在碟片上。在图4中,可以与系统内的每个资源相关联的锁数据结构365包括以下字段拥有者标识符(拥有锁的节点)或拥有者通用唯一标识符(UUID)、心跳地址、心跳产生数、锁类 型、其他特定于锁的信息。可以用类似于心跳数据结构345的拥有者标识符字段344的方式实施拥有者标识 符字段364。在预期的系统中,拥有者标识符字段364和拥有者标识符字段344对没有失效 或过期的心跳可以具有相同的值,即拥有心跳的节点也拥有与该心跳相关联的所有锁。该 要求在其中在心跳中没有指定拥有者的替代实施例中不存在,即使出于优化和调试的原因 锁包含拥有者。可以用类似于心跳数据结构345的心跳产生数348的方式实施心跳产生数366。 在预期的系统中,心跳产生数348和心跳产生数366对于还没有成为失效的心跳可以具有 相同的值。锁类型字段368指示与资源相关联的锁的类型,并且可以用能够采取多个状态的任何枚举数据类型来实施。在说明性实施例中,锁类型字段典型地可以具有将由在系统内 可用的锁的数目和类型限定的多个值。诸如这些值留待系统设计者决定。可以使用任何锁 类型实施此处描述的系统。典型的锁类型可以包括空、并发读、并发写、读保护、写保护、或排他锁类型中的任 何一个。心跳地址字段372识别锁拥有者心跳区的位置,并且可以用到心跳段340的特定心跳区342的指针来实施,该特定心跳区342包含对应于与锁相关联的心跳的拥有者的心 跳数据结构345。可选地,锁数据结构365可以进一步包括用于与其相关联的其他数据类型的其他特定于锁的信息区(未示出)。数据结构365的该区允许将其他有用的数据与锁数据一起 存储,并且可以包括对当前拥有锁的节点唯一或与之相关联的数据。在本发明中,锁数据结 构365与系统内的每个资源相关联并且可以保持在SAN的碟片上。在说明性实施例中,每 个锁数据结构365与其对应的资源驻留在一起,所以映射系统资源或与其相关联。当节点 试图获取对资源的访问时,该节点可以通过从碟片读取锁数据结构来立刻确定资源是否被 锁定。取决于此处描述的技术是与传统计算机系统还是与完全或部分虚拟化的计算机系统一起使用,资源到锁的映射可以随设计者的决定而变化,只要在两者之间保持某种关联。例如,可以使用存储在碟片上或与心跳段340相同的故障域内的一个或多个表实施这样的映射。如以上所描述的,在共享存储的锁元数据区中维护用于每个锁的锁状态或类型。 在一个实施例中,锁类型包括三个值“空闲”、“管理”和“锁定”。应当注意,这些名称值(例 如,空闲、管理和锁定)仅是用来说明管理锁的方法。只要遵循在本文档全文中描述的管理 和获取锁的过程,不论是所述的过程还是等效的过程,可以代替使用任何其他值或名称。如 果锁处于“空闲”状态,则任何节点可以使用诸如SCSI保留的互斥原语来获取锁。当节点获 取锁时,该锁的锁状态在锁元数据中变为“锁定”。“锁定”状态还意指锁的当前拥有者正以 排他模式持有锁。然而,由于在存储区域网络中通过互斥原语获取锁的该过程代价高昂,所 以在一个实施例中,如果节点不再需要锁,则该锁的状态在锁元数据中变为“管理”,以指示 尽管当前拥有者仍然持有该锁,但如果请求,当前拥有者将释放该锁。此外,维护锁元数据 中的指针,以识别当前拥有锁的节点。通过使用“管理”这种中间状态,大大减少了在获取 锁中互斥原语的使用。当节点需要获取锁时,探查锁元数据以识别1)谁是该锁的当前拥有 者,和2)该锁的当前状态是什么。如果该锁处于“空闲”状态,则将该锁授予请求节点。如 果该锁处于“锁定”状态,则探查当前拥有该锁的节点的心跳区,以确定拥有节点是否仍然 是活着的。如果该节点仍然活着,则将消息发送给请求节点,以通知请求节点该锁不是空闲 的。然而,如果拥有节点不是活着的,则释放该锁,并将该锁的所有权传递给请求节点。如 果该锁处于“管理”状态,则这意指拥有节点不再需要该锁但仍持有它以供其他节点获取该 锁。在该情况中,通知拥有节点并将该锁授予给请求节点,并且相应地更新锁元数据。如果 锁处于“锁定”或“管理”状态,则在一个实施例中,可以使用租用超时(典型地以较高的毫 秒或秒为单位)值来释放锁。在正常操作中,拥有节点将更新心跳以延长租用超时。然而, 如果拥有节点更新其心跳失败并因而没能延长锁租用(例如,由于SAN故障或节点故障), 则可以在经过租用时间之后释放该锁。以下描述将详细描述本段中描述的过程。在优选实施例中,当节点需要共享资源上的锁时,该节点检查在该节点之中的本 地锁元数据中的锁的状态。在其他实施例中,可以将本地锁元数据存储在节点外。如果在 该节点的本地锁元数据中找到锁元数据,并且锁状态指示该锁正以“管理”模式被持有,则 该节点将本地锁元数据和碟片上(即共享存储)锁元数据存储中的锁状态改变为“持有”, 并且获取该锁而不触发诸如SCSI保留过程的互斥原语。如果该节点的本地锁元数据不包 含该锁的锁元数据,并且碟片上元数据指示该锁是空闲的,则该节点尝试通过诸如SCSI保 留的互斥原语获取该锁。如果获取该锁的这种尝试成功,则在该节点的本地锁元数据中产 生具有锁状态为“持有”的锁条目。如果另一节点在该节点之前成功获取了该锁,则该尝试 将会失败。如果碟片上锁元数据指示该锁由另一节点排他持有,则该节点对另一节点发送 消息以尝试获取该锁。如果另一节点仍使用该锁,则其可以通知该节点该锁不是空闲的。如 果另一节点正以“管理”模式持有该锁,则其可以将该锁释放给该节点。在该情况中,该节点 不执行SCSI保留过程就获取该锁,并且更新碟片上和本地锁元数据以指示该锁的所有权 和状态。在一个示例中,可能有第三节点也对另一节点做出同样的请求,并成功获取该锁。 在该情况中,另一节点将通知该节点自己不再是该锁的拥有者了。在另一节点未能对该节 点的请求成功响应情况下,该节点首先检查碟片上存储以验证另一节点是否仍在心跳。在该情况中,节点在发起获取该锁的另一请求之前,等候选定的时间段。然而,如果另一节点 不响应也不心跳,则该节点尝试通过SCSI保留过程破解(break)该锁。图5图示了由节点获取锁的过程400。在一个实施例中,节点维护自己拥有的所有 锁的本地锁元数据。在一个实施例中,在存储器缓存中维护本地锁元数据。在步骤402,节 点开始获取在共享资源上的锁。在步骤404,检查本地锁元数据以确定正被获取的锁是否是 已由该节点拥有,或该节点是否已对相同的锁做出了另一锁获取请求。在决定步骤406,确 定正被获取的锁的锁状态是否存在于本地锁元数据中。如果否,则在步骤408,将锁状态设 置为“锁请求”。回到决定步骤406,如果是,则在决定步骤410,确定该锁是否处于“管理” 状态并且锁租用还未超时。如果否,则在步骤414,将锁状态改变为“锁请求”。在步骤416, 从心跳区读取锁信息。如果是(在决定步骤410),接着在步骤422,在锁元数据的共享存储中更新锁状 态,并且将本地缓存中的锁状态改变为“持有”并返回“成功”消息。换言之,不经过诸如 SCSI保留的互斥原语的过程,获取该锁。在决定步骤428,确定请求的锁是否空闲,或者存 储在锁元数据中的拥有者UUID是否与请求节点的UUID相同,或者该锁是否指向失效的心 跳区。如先前所描述的,锁元数据包括用于锁的心跳区的位置。如果该锁是空闲的,则该锁 不指向心跳区。否则,该锁正由节点持有,该节点将定期更新心跳区以指示该节点是活着的 并连接到网络。如果是,则在步骤412,如在图9中进一步描述地发起获取该锁的过程。如 果否,则在步骤420,如图6中描述地将对该锁释放的请求发送给该锁的当前拥有者。图6图示了接收请求锁释放的过程450。在步骤452,从网络中的另一节点接收锁 释放的请求。在步骤454,检查当前拥有或请求的锁的本地锁元数据。在决定步骤456,检 查本地锁元数据以确定本地锁元数据中是否有锁状态条目。如果否,则在步骤458,通知请 求节点该节点不是锁的当前拥有者。在决定456,如果是,则该锁或者已被拥有或者由接收 节点请求。在决定步骤460,如果锁状态指示该锁正由接收节点“持有”,则在步骤462,发送 消息给请求节点以指示该锁非空闲。如果否,且在决定步骤464,若锁状态是“管理”,那么 在步骤466,将锁状态条目从本地锁元数据移除,并将碟片上锁授予给请求节点,接着在步 骤470,将“已获取锁”消息发送给请求节点以指示该锁被授予给请求节点。如果在决定步 骤464,回答是否,则在步骤468,读取碟片上锁。在决定步骤472,如果该锁已被授予,则在 步骤478,将锁状态设置为“持有”,接着在步骤480,将消息发送给请求节点以指示该锁非 空闲。如果在决定步骤472,回答是否,则在步骤474,将消息发送给请求节点以指示正请求 释放该锁的节点不是该锁的拥有者。图7图示了释放锁的过程500。当节点需要释放锁时,在步骤502,节点将本地锁 元数据中的锁状态改变为“管理”,并更新该锁的时间戳。进一步,在步骤504,节点将共享 存储中的心跳区的锁状态改变为“管理”,并用新的时间戳更新锁元数据。应当注意,使用词 “管理”仅是为了说明目的。可以使用任何其他合适的标记或指示符来代替。对锁状态的该 更新确保其他请求该锁的节点在尝试获取该锁时,将对该节点发送网络消息,而不是使用 诸如SCSI保留的互斥原语。在锁租用时间内,该节点继续持有“管理”状态的锁。如果该 节点在租用时间内请求锁,则租用可以展期。一旦在该“管理”锁上的租用期满,则在步骤 506,从该节点中的本地锁元数据中移除锁状态,并且在步骤508,改变碟片上锁状态(共享 存储中)以指示该锁现在空闲。
11
图8A图示了对来自另一节点的“非拥有者”(见图6,元素458)消息进行处理的过 程550。在步骤552,响应于节点的释放锁的请求,节点从另一节点接收“非拥有者”消息。 在步骤554,节点重新读取该锁以确定该锁现在是否可用,因为在节点发送请求之前,该锁 可能在此期间已被另一节点释放。在决定步骤558,如果锁状态与上次读取的不同,则在决 定步骤560,确定该锁是否空闲。如果是,则控制移动到步骤556以尝试通过图9描述的过 程来破解该锁。如果否,则在步骤562,返回消息以指示该锁非空闲。回到决定步骤558,如 果是,在步骤556,尝试通过图9描述的过程来破解该锁。在决定步骤564,如果破解该锁的 尝试成功,则在步骤566,本地缓存中的锁状态变为“持有”,并且返回“成功”消息。如果否, 则在步骤562,返回消息以指示该锁非空闲。图8B图示了节点处理“非空闲”消息的过程。当节点向另一节点发送请求以请求 锁时,该节点在其本地缓存中产生已经对特定锁做出请求的条目。在步骤580,节点接收从 另一节点返回的“非空闲”消息。在步骤582,从本地锁元数据移除锁状态,并且在步骤584, 将“非空闲”消息发送给请求锁的应用或代码。图8C图示了子系统处理“已获取锁”消息的过程。在步骤590,接收指示根据节点 的锁请求已获取锁的消息。在步骤592,更新节点的本地锁元数据以指示该锁正由该节点持 有。在步骤594,将成功消息返回给请求该锁的应用或代码。图9图示了尝试破解锁的过程600。在步骤602,在需要时,尝试破解锁(例如,见 图8A,元素556)。在步骤604,检查共享存储内的心跳区和锁元数据以识别该锁的当前状 态。在决定步骤606,如果锁元数据指示该锁空闲,则在步骤608,通过诸如SCSI保留的互 斥原语来尝试获取该锁。在获取该锁之后,如果需要则重放文件系统或其他类型的日志以 保持数据的完整性。如果否,则在决定步骤610,将存储在锁元数据中的锁拥有者UUID与请 求节点的UUID进行比较。如果UUID匹配,则在步骤616,将指示已获取该锁的消息发送给 请求该锁的应用或代码。如果否,在步骤612,检查当前锁模式。回到决定步骤614,如果破解该锁的尝试成功,则在步骤616,将共享缓存更新为 “持有”,并发送指示已获取该锁的消息。如果破解该锁的尝试不成功,则在步骤614,发送指 示该锁非空闲的消息。这种获取该锁的失败可能是由于步骤606和608之间的事实,即另 一节点可能获取该锁。在决定步骤612,确定当前锁模式是否是排他的。在一个实施例中,“排他”锁模式 意指该锁正由一个节点持有。如果是,在步骤622,再次读取心跳和锁元数据。在决定步骤 626,确定锁状态是否改变。如果否,在决定步骤632,确定是否已发生心跳超时。如果锁的 拥有者在选定的时间段内未能成功更新共享存储中的心跳数据,则心跳超时可能产生。如 果是,重复步骤608,其包括清除该锁的当前拥有者,该拥有者因为没能心跳,所有失去其租 用。如果否,在步骤634,在选定的时间段内使过程进入休眠,然后重复步骤622。如果决定 步骤626的答案为是,则在决定步骤650,确定是否仅有心跳已改变。如果是,在步骤652, 移除锁缓存条目,并返回“非空闲”消息。如果在决定步骤650是否,则在决定步骤654,确 定锁状态是否已变为“管理”。如果是,则控制前进到决定步骤624。如果否,则控制前进到 决定步骤632。在决定步骤624,确定该锁是否处于“管理”模式。在一个实施例中,如果先前获取 该锁的节点不再需要该锁,但在其他节点请求该锁之前一直持有该锁,则该锁可以是处于管理模式的。如果否,则在步骤628,发送指示该锁非空闲的消息。如果是,在步骤630,读 取锁元数据。在决定步骤638,确定自从上次读取,锁状态是否已改变。如果是,执行步骤 640。在决定步骤640,将锁拥有者UUID与本地UUID进行比较。如果UUID匹配,则在步骤 642,将共享缓存更新为“持有”并发送“已获得锁”消息。如果UUID不匹配,则在步骤628, 将共享缓存更新为“持有”并发送“非空闲”消息。如果否,在决定步骤644,确定该锁是否 超时。如果当前拥有者没能成功延长锁租用,则锁可能超时。如果是,执行步骤608。如果否,在步骤648,在选定的时间段内使破解该锁的过程进入休眠,然后重复步骤630。考虑以上实施例,应当理解本发明可以采用各种计算机实施的涉及存储在计算机 系统内的数据的操作。这些操作是需要对物理量进行物理操控的。任何此处描述的构成本 发明一部分的操作是有用的机器操作。本发明还涉及用于执行这些操作的设备或装置。在 一个实施例中,该装置可以是为了所需目的而专门构建的(例如专用机器),或者该装置可 以是由存储在计算机中的计算机程序选择性激活或配置的通用计算机。具体而言,各种通 用机器可以与根据本文的教导所编写的计算机程序一起使用,或者更便利地是构建更加专 用的装置来执行所需的操作。还可以将本发明的实施例定义为将数据从一种状态变换为另一种状态的机器。可 以将变换后的数据存储在存储中,然后由处理器操控。于是,处理器将数据从一个形态变换 为另一形态。进一步,可以由一个或多个可以通过网络互连的机器或处理器来处理本方法。 还可以虚拟化本机器,以将对存储的物理访问和处理能力提供给一个或多个用户、服务器 或客户端。于是,可以将虚拟化的系统认为是可以作为一个或多个通用机器操作或可以被 配置为专用机器的机器。每个机器或机器的虚拟表示可以将数据从一种状态或形态变换为 另一种,并且还可以处理数据、将数据存储在存储中、显示结果、或将结果通信给其他机器。还可以将本发明实施为在计算机可读介质上的计算机可读代码。计算机可读介 质是可以存储此后可以由计算机系统读取的数据的任何数据存储设备。计算机可读介质 的示例包括硬盘驱动、网络附加存储(NAS)、只读存储器、随机存取存储器、CD-ROM、CD-R、 CD-RW、磁带和其他光和非光数据存储设备。计算机可读介质可以包括分布在联网计算机系 统上的计算机可读有形介质,使得可以以分布式方式存储和执行计算机可读代码。尽管以特定顺序描述了本方法操作,但是应当理解,在操作之间可以执行其他辅 助操作,或者可以调整操作以使得操作发生的时间略有不同,或者可以将操作分布在允许 处理操作在与处理相关联的各种时间间隔上发生的系统中,只要重叠操作的处理是按期望 的方式来执行的。尽管已经为了理解上的清楚,在某些细节上描述了以上发明,但是很显然,可以在 所附权利要求的范围内实践特定变化和修改。因此,将本实施例认为是说明性而不是限制 性的,并且本发明不受限于本文给出的细节,而是可以在所附权利要求的范围和等效内容 进行修改。
权利要求
一种由节点获取在多个互连节点的系统中的共享资源上的锁的方法,所述方法包括(a)探查所述节点的本地锁元数据,以确定在所述本地锁元数据中是否存在所述锁的锁元数据,其中所述锁元数据包括所述锁的标识和锁状态;(b)如果在所述本地锁元数据中不存在所述锁元数据,则执行步骤(i)到(iv),(i)从共享存储中读取所述锁的共享锁元数据,所述读取包括识别所述锁的当前拥有者和所述锁的当前状态;(ii)探查所述锁的所述当前拥有者的心跳区,以确定所述当前拥有者是否活着,其中如果所述当前拥有者不是活着的,则等待锁租用时间流逝,然后获取所述锁,并更新所述共享锁元数据以指示所述锁现在由所述节点拥有;(iii)如果所述锁的所述当前状态指示所述当前拥有者正以排他模式持有所述锁,则向所述节点返回消息以通知所述锁不是空闲的;(iv)如果所述锁的所述当前状态指示所述当前拥有者正以管理模式持有所述锁,则向所述当前拥有者发送释放所述锁的请求,其中如果所述当前拥有者还没有将所述锁释放给另一请求节点,则将所述锁授予给所述节点而不在所述共享资源上执行互斥原语操作,并且更新所述共享锁元数据以指示新的锁所有权和锁状态;以及(c)如果在所述本地锁元数据中存在所述节点的所述锁元数据,则探查在所述本地锁元数据中的所述锁的所述锁状态,如果在所述本地锁元数据中的所述锁的所述锁状态指示所述锁正以管理模式被拥有,则改变所述本地锁元数据中的所述锁的所述锁状态以指示所述节点对所述锁的排他使用,并更新所述共享锁元数据以指示所述锁正以排他模式被所述节点拥有,其中所述管理模式意指所述锁正由所述节点拥有,但是所述锁未被所述节点使用。
2.如权利要求1所述的方法,其中等待所述锁租用时间流逝包括在选定的时间间隔 内,探查所述锁的所述当前拥有者的所述心跳区以确定所述当前拥有者是否活着,其中所 述选定的时间间隔是小于所述锁租用时间的时间段。
3.如权利要求1所述的方法,其中如果所述节点的所述本地锁元数据未指示所述锁正 由所述节点拥有,则更新所述本地锁元数据以指示所述锁正被请求。
4.如权利要求1所述的方法,其中获取所述锁包括更新所述本地锁元数据以包括所 述节点拥有所述锁的信息,并且更新所述共享存储中的所述锁元数据以添加指向所述心跳 区的指针。
5.如权利要求4所述的方法,其中更新所述锁元数据包括更新锁时间戳。
6.如权利要求4所述的方法,其中更新所述锁元数据包括更新所述锁的状态。
7.如权利要求1所述的方法,其中识别所述锁租用是否期满的过程包括在存储中维护至少一个心跳数据结构,所述心跳数据结构包括拥有者数据,识别所述心跳的当前拥有者;状态数据,识别所述心跳的当前状态;脉冲数据,识别所述心跳的上次更新的时间;以及如果所述脉冲数据在选定的时间段内没有改变,则允许所述心跳被修改。
8.如权利要求7所述的方法,所述心跳数据结构进一步包括识别所述心跳的版本的产生数据。
9.如权利要求8所述的方法,进一步包括维护与多个共享资源中的一个相关联的锁数据结构,所述锁数据结构包括识别心跳的 数据。
10.如权利要求9所述的方法,其中识别所述心跳的所述数据包括识别所述心跳的当 前拥有者的拥有者数据和识别所述心跳的位置的地址数据中的一个。
11.一种在第一节点从第二节点接收释放锁的请求的方法,所述方法包括 检查所述第一节点的本地锁元数据;如果所述本地锁元数据包括指示所述锁正以排他模式被拥有的信息,则向所述第二节 点发送指示所述锁正被使用的消息;如果所述本地锁元数据包括指示所述锁正由所述第一节点持有但是没有被使用的信 息,则将所述锁的信息从所述本地锁元数据移除,并且更新对应于所述锁的心跳区中的信 息,以将所述锁授予给所述第二节点;以及向所述第二节点返回指示所述锁空闲的消息, 其中所述释放请求是经由IP网络接收的。
12.如权利要求11所述的方法,其中,如果所述本地锁元数据不包括关于所述锁的信 息,则向所述第二节点返回指示所述第一节点不是所述锁的拥有者的消息。
13.如权利要求12所述的方法,其中一旦接收到所述消息,所述第二节点再次重新读 取所述心跳区中的所述锁元数据,以确定所述锁的状态是否有任何改变。
14.如权利要求13所述的方法,其中如果在第一次读取和所述重新读取之间所述锁的 状态没有变化,则尝试破解所述锁。
15.如权利要求13所述的方法,其中如果在第一次读取和所述重新读取之间所述锁的 状态已变化,则确定所述锁是否是空闲的。
16.如权利要求11所述的方法,其中所述心跳区包括至少一个心跳数据结构,所述心 跳数据结构包括拥有者数据,识别所述心跳的当前拥有者; 状态数据,识别所述心跳的当前状态; 脉冲数据,识别所述心跳的上次更新的时间。
17.如权利要求16所述的方法,进一步包括如果所述脉冲数据在选定的时间段内没有改变,则允许所述心跳被修改。
18.—种在网络上的共享资源上管理锁的方法,所述方法包括维护用于节点的心跳区,其中所述共享资源可由所述节点访问,并且在所述网络上的 共享存储上维护所述心跳区,所述心跳区包括用来存储所述节点的心跳的空间和用来存储 所述锁的锁元数据的空间;在所述节点中维护本地锁元数据,以在所述锁由所述节点拥有时存储所述锁的状态;以及其中,当所述节点尝试获取所述锁时,在所述本地锁元数据中进行检查以确定所述锁 是否已由所述节点所拥有,如果所述锁不由所述节点所拥有,则探查所述共享存储中的所 述锁元数据以检索所述锁的状态和所述锁的当前拥有者,如果所述状态指示所述锁正由另一节点以管理模式持有,则请求所述另一节点将所述锁授予给所述节点,其中将所述锁授予给所述节点而不使用互斥原语,其中所述管理模式意指所述锁正由所述节点拥有,但是所述锁未被所述节点使用。
19.如权利要求18所述的方法,其中如果所述锁已由所述节点拥有,则更新所述锁元数据中的所述状态和所述节点中的所述本地锁元数据,以指示所述锁正由所述节点排他持 有。
20.如权利要求19所述的方法,其中当所述节点不再需要所述锁时,更新在所述锁元数据和所述本地锁元数据中的所述锁的状态,以指示所述锁正由所述节点以所述管理模式 拥有。
全文摘要
本发明涉及使用网络和基于碟片上的方案的混合锁定。公开了一种由节点获取在多个互连节点的系统中的共享资源上的锁的方法。竞争共享资源上的锁的每个节点维护节点当前拥有的锁的列表。在共享存储上维护锁元数据,该共享存储可以被竞争共享资源上的锁的所有节点访问。在对应于每个节点的共享资源上维护心跳区,这样节点可以注册其活性。在共享存储的锁元数据中维护锁状态。锁状态可以指示锁被排他持有、锁空闲或锁处于管理模式。如果锁是以管理模式被持有的,则可以不使用诸如SCSI保留的互斥原语,将锁的所有权转移给另一节点。
文档编号H04L29/08GK101800763SQ20091025409
公开日2010年8月11日 申请日期2009年12月18日 优先权日2009年2月5日
发明者丹尼尔·J·斯凯尔斯, 李金远, 穆拉利·维莱阿努尔, 马扬克·拉瓦特 申请人:威睿公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1