管理锁的方法及装置、确定锁管理服务器的方法及装置的制造方法_3

文档序号:9451561阅读:来源:国知局
,资源标识为客户端发送的锁申请请求或锁释放请求包含的资源标识,资源标识对应的历史故障锁管理服务器列表中包含:客户端在确定能够向哪个锁管理服务器发送锁申请请求或锁释放请求的过程中,确定出的锁管理服务器中发生故障的锁管理服务器的标识。
[0123]在客户端根据第二锁资源标识,按照预定函数关系确定出第二锁管理服务器的过程中,资源标识对应的故障服务器列表为初始列表,初始列表的内容为空。客户端确定出第二锁管理服务器后,如果第二锁管理服务器发生故障,则将第二锁管理服务器的标识存入资源标识对应的历史故障锁管理服务器列表,也即资源标识对应的历史故障锁管理服务器列表由初始列表更新为第一列表,其中,第一列表包含第二锁管理服务器的标识。然后客户端重新确定与第二锁管理服务器不同的且工作正常的第三锁管理服务器。
[0124]客户端确定第三锁管理服务器的一种实现方式为:为锁管理服务器集群中的每个锁管理服务器设置哈希函数,记为Hash_serveice,每个锁管理服务器的Hash_serveice是专有的,一个锁管理服务器的Hash_serveice用于在该锁管理服务器发生故障时,客户端利用该锁管理服务器的Hash_serveice确定新的锁管理服务器。
[0125]具体来讲,客户端利用锁管理服务器专有的Hash_serveice,以Resource ID和Resource ID对应的历史故障锁管理服务器列表为入参,得到新的Server ID。其中,Hash_serveice是带历史故障锁管理服务器列表的哈希函数,历史故障锁管理服务器列表在实际应用中是这样的-Resource ID对应的历史故障节点列表初始化为空,客户端利用Hash_cluster,以Resource ID为入参,计算得到A锁管理服务器,如果A锁管理服务器发生故障,则将A锁管理服务器的标识存入Resource ID对应的历史故障锁管理服务器列表,接着,如果A锁管理服务器专有的Hash_serveice为Hash_A,则客户端以Resource ID和ResourceID对应的历史故障锁管理服务器列表(包含A锁管理服务器的标识)为入参,得到新的锁管理服务器(称为第三锁管理服务器)。
[0126]客户端确定出第三锁管理服务器之后,同样需要判断第三锁管理服务器(记为新的Lock Server)是否工作正常,如果是,贝Ij向新的Lock Server发送锁申请请求或锁释放请求,如果否,则表明新的Lock Server发生故障,此时,客户端将第三锁管理服务器的标识存入Resource ID对应的历史故障锁管理服务器列表,也即资源标识对应的历史故障锁管理服务器列表由第一列表更新为第二列表,其中,第一列表包含第二锁管理服务器的标识,第二列表包含第二锁管理服务器的标识和第三锁管理服务器的标识。然后客户端可以重新确定锁管理服务器,直到确定出的锁管理服务器是正常工作的锁管理服务器为止,客户端重新确定锁管理服务器的方法请参考前述,在此就不再赘述。
[0127]如图3所示,客户端每次确定出锁管理服务器后,都要判断确定出的锁管理服务器(记为Lock Server)是否工作正常,如果是,则向Lock Server发送锁申请请求或锁释放请求,如果否,则执行Lock Server专有的Hash_serveice,得到新的Lock Server。
[0128]需要说明的是,如果锁资源标识对应的历史故障锁管理服务器列表中包含分布式系统中所有锁管理服务器的标识,也即客户端确定分布式系统中的所有锁管理服务器均发生故障,则客户端无需发送锁申请请求或锁释放请求,因为分布式系统中没有工作正常的锁管理服务器对锁申请请求或锁释放请求进行响应。
[0129]接下来说明锁管理服务器接收到客户端发送的锁申请请求之后,针对锁申请请求的处理过程。
[0130]如图4所示,客户端针对锁申请请求的处理过程包括以下步骤:
[0131]步骤41:第一锁管理服务器接收第一客户端发送的锁申请请求,所述锁申请请求包含资源标识,所述第一锁管理服务器是所述第一客户端根据所述资源标识按照预定函数关系,从所述多个锁管理服务器中确定出的。
[0132]第一客户端通过执行图2所示的方法,可以确定向第一锁管理服务器发送锁申请请求。因此,第一锁管理服务器可以接收到第一客户端发送的锁申请请求。
[0133]步骤42:若所述第一锁管理服务器中所述资源标识对应的锁的状态为空闲,则所述第一锁管理服务器将所述锁分配给所述第一客户端。
[0134]步骤43:若所述第一锁管理服务器没有所述资源标识对应的锁,则所述第一锁管理服务器根据所述资源标识生成锁,并分配给所述第一客户端。
[0135]步骤42和步骤43中分别针对的是第一客户端请求申请的锁存储在第一锁管理服务器中以及未存储在第一锁管理服务器的情况。因此,在执行步骤42和步骤43之前,第一锁管理服务器还可以执行以下步骤:
[0136]所述第一锁管理服务器判断所述资源标识对应的锁是否存储在所述第一锁管理服务器中。
[0137]第一锁管理服务器判断第一客户端请求申请的锁是否存储在第一锁管理服务器中,也就是判断在接收到第一客户端发送的锁申请请求之前,是否有其他客户端向第一锁管理服务器申请过该资源标识对应的锁,如果有其他客户端向第一锁管理服务器申请过该资源标识对应的锁,则第一锁管理服务器中存储有该资源标识对应的锁,以便其他客户端能够申请到该资源标识对应的锁;否则,第一锁管理服务器生成锁,并分配给第一客户端。
[0138]步骤42中在第一客户端请求申请的锁存储在第一锁管理服务器中的前提下,还针对该资源标识对应的锁的状态是空闲的情况。因此,在所述第一锁管理服务器确定所述锁存储在所述第一锁管理服务器中之后,还可以执行以下步骤:
[0139]所述第一锁管理服务器判断所述资源标识对应的锁的状态是否为空闲,如果是,则执行步骤42,如果否,则根据分布式系统中部署的集群管理服务(Cluster ManagementService, CMS)是否同时管理锁管理服务器和客户端的状态,可能会执行以下步骤:
[0140]若所述第一锁管理服务器中所述锁的状态为占用、且占用所述锁的第二客户端故障,则所述第一锁管理服务器将所述锁分配给所述第一客户端。
[0141]具体来讲,在第一客户端请求申请的锁存储在第一锁管理服务器的前提下,如果该锁的状态是空闲,则说明该锁可以被分配给第一客户端,此时,第一锁管理服务器将该锁分配给第一客户端,并启动该锁的租约定时器、将该锁的状态设置为占用,将该锁的持有者设置为第一客户端。之后通知第一客户端锁申请成功。
[0142]在第一客户端请求申请的锁存储在第一锁管理服务器的前提下,如果该锁的状态不是空闲,而是占用,则说明该锁已经被分配给其他客户端,为方便表述,占用该锁的客户端记为第二客户端。此时第一锁管理服务器需要针对第二客户端的状态是工作正常的情况以及第二客户端的状态是发生故障的情况分别做不同的处理。第一锁管理服务器可以通过CMS获知第二客户端的状态。
[0143]如图5所示,CMS为分布式系统提供集群管理和所有的锁管理服务器的状态同步服务。目前对CMS有多种实现方案,本发明实施例对其实现方案没有限定。实际CMS在分布式系统中的部署有两种场景:
[0144]第一种场景:CMS只管理锁管理服务器,而不管理客户端,即客户端是无状态的。客户端通过CMS可以得到锁管理服务器的状态,而锁管理服务器通过CMS无法得到客户端的状态。满足这个功能,记为“CMS仅支持锁管理服务器状态查询”。
[0145]第二种场景:CMS既管理锁管理服务器,也管理客户端。通过CMS,锁管理服务器和客户端能够相互得到对方的状态。满足这个功能,记为“CMS同时支持锁管理服务器和客户端状态查询”。
[0146]其中,与第二客户端的状态类似,锁管理服务器的状态可以是工作正常,还可以是发生故障。
[0147]如果CMS仅支持锁管理服务器状态查询,则第一锁管理服务器通过CMS无法得到第二客户端的状态,也即第一锁管理服务器无法获知第二客户端是工作正常还是发生故障,因此,第一锁管理服务器只能通知第一客户端锁分配失败。
[0148]如果CMS同时支持锁管理服务器和客户端状态查询,则第一锁管理服务器通过CMS可以获知第二客户端是工作正常还是发生故障,如果第二客户端工作正常,则表明第二客户端正在正常占用该锁,第一锁管理服务器不能将该锁分配给第一客户端,只能通知第一客户端锁分配失败;如果第二客户端发生故障,则表明第二客户端没有能力占用该锁,第一锁管理服务器将该锁分配给第一客户端,并启动该锁的租约定时器、将该锁的状态设置为占用,将该锁的持有者设置为第一客户端。之后通知第一客户端锁申请成功。
[0149]步骤43针对第一客户端请求申请的锁未存储在第一锁管理服务器中的情况。
[0150]具体来讲,第一锁管理服务器接收到第一客户端发送的锁申请请求,但是第一客户端请求申请的锁未存储在第一锁管理服务器中,一种实施方式为第一锁管理服务器直接生成锁,并分配给第一客户端。另一种实施方式为:在第一锁管理服务器生成锁之前,需要检查一下该锁申请请求的合法性,在该锁申请请求合法的前提下,才生成锁,并分配给第一客户端。因此,在另一实施例中,步骤43具体包括:
[0151]所述第一锁管理服务器根据所述资源标识确定由所述第一锁管理服务器生成所述锁,则所述第一锁管理服务器根据所述资源标识生成锁,并分配给所述第一客户端。
[0152]其中,第一锁管理服务器检查锁申请请求的合法性的方法为:第一锁管理服务器利用资源标识确定出一个锁管理服务器,第一锁管理服务器可以使用前文所述的预定函数关系,例如:HaSh_ClutSer,也可以使用其他方法,只要根据资源标识能够确定出一个锁管理服务器即可。
[0153]如果第一锁管理服务器利用资源标识确定出的锁管理服务器是自己,则说明该锁申请请求是合法的,应该由第一锁管理服务器生成锁,则第一锁管理服务器生成锁,并分配给第一客户端。
[0154]如果第一锁管理服务器利用资源标识确定出的锁管理服务器不是自己,例如是第四锁管理服务器,则说明原本应该由第四锁管理服务器生成锁,但是第四锁管理服务器发生故障,因为通过图2所示的方法可知,第一客户端根据资源标识,按照预定函数关系,确定出第四锁管理服务器之后,在第四锁管理服务器发生故障的情况下,第一客户端才会向其他锁管理服务器(例如第一锁管理服务器)发送锁申请请求。此时,一种可能的实施方式是:第一锁管理服务器直接生成锁,并分配给第一客户端。另一种可能的实施方式是:第一锁管理服务器判断资源标识对应的历史故障锁管理服务器列表中各个标识分别对应的锁管理服务器是否均已故障,如果是,则生成锁,并分配给第一客户端;如果否,则说明第一客户端误将正常工作的锁管理服务器的标识放入资源标识对应的历史故障锁管理服务器列表,第一客户端本应将锁申请请求发送给除第一锁管理服务器外的一个工作正常的锁管理服务器,但是第一锁客户却端误将锁申请请求发送给第一锁管理服务器,则第一锁管理服务器通知第一客户端锁分配失败。
[0155]接下来说明锁管理服务器接收到客户端发送的锁释放请求之后,针对锁释放请求的处理过程。
[0156]如图6所示,锁管理服务器针对锁释放请求的处理过程包括以下步骤:
[0157]步骤61:第一锁管理服务器接收第一客户端发送的锁释放请求,所述锁释放请求包含资源标识,所述第一锁管理服务器是所述第一客户端根据所述资源标识按照预定函数关系,从所述多个锁管理服务器中确定出的。
[0158]与锁申请请求类似,第一客户端通过执行图2所示的方法,可以确定向第一锁管理服务器发送锁释放请求。因此,第一锁管理服务器可以接收到第一客户端发送的锁释放请求。
[0159]步骤62:若所述第一锁管理服务器中所述锁被所述第一客户端占用,则所述第一锁管理服务器将所述锁的状态设置为空闲。
[0160]步骤63:若所述第一锁管理服务器没有所述锁,则所述第一锁管理服务器根据所述资源标识生成锁,并设置生成的锁的状态为占用。
[0161]与锁申请请求类似,步骤62和步骤63中分别针对的是第一客户端请求释放的锁存储在第一锁管理服务器中以及未存储在第一锁管理服务器的情况。因此,在执行步骤62和步骤63之前,第一锁管理服务器还可以执行以下步骤:
[0162]所述第一锁管理服务器判断所述资源标识对应的锁是否存储在所述第一锁管理服务器中。
[0163]具体可参考
当前第3页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1