一种基于Raft算法的分布式锁的实现方法及系统与流程

专利2022-06-29  64


本发明涉及计算机技术领域,尤其涉及一种基于raft算法的分布式锁的实现方法及系统。



背景技术:

在现代分布式的架构下,大部分的大型网站都采用分布式集群模式,然而在分布式集群模式下,客户端之间存在资源竞争的问题,不可控的资源竞争将引起流程阻塞、阻断客户端的运行,进而降低系统的整体性能。

现有技术中,采用基于redis算法的分布式锁以实现数据的一致性,从而解决分布式场景中资源竞争的问题,具体的工作流程如下:

步骤1,客户端向服务器请求setnx,以请求占有资源标志位,若客户端占位成功时,则获得分布式锁;若客户端占位失败时,则等待下次抢占。

步骤2,当客户端占有分布式锁后,利用expire方法设置过期时间,当客户端占有分布式锁的时间大于过期时间时,系统自动删除分布式锁,以释放资源。

步骤3,当资源释放后,其他客户端继续轮询抢占分布式锁,重复步骤1和2,以实现数据一致性。

在本发明研究的过程中,发明人发现基于redis算法的分布式锁,至少存在以下问题:

1、每一个客户端都能连接redisserver,请求占用同一个锁资源,因此,没法保证同个时间同一个锁,只有一个客户端能拥有。不仅如此,其他客户端还可以删除当前的有效锁。

2、若setnx执行过程中,发生宕机或者阻塞的现象,则客户端将获取不到锁。

3、若在setnx执行成功后,在执行expire方法之前,发生宕机现象,将产生死锁现象。

4、redis是单进程实现组件,lock的字符串只能在单机的setnx设置,并不能把锁节点信息及时同步到各个客户端中。

5、redis集群使用异步复制,服务器宕机情况下,有丢失锁数据的情况,不能正常解锁,产生死锁。



技术实现要素:

本发明实施例提供了一种基于raft算法的分布式锁的实现方法及系统,能够避免多个客户端同时操作同一个锁,从而使得同一时间只有一个客户端持有同一个锁,进一步提高数据一致性。

为了解决上述技术问题,本发明实施例提供了一种基于raft算法的分布式锁的实现方法,包括:

服务器接收第一客户端发送第一锁的获锁请求信息;

根据所述获锁请求信息,生成第一日志信息和键值对列表;其中,所述键值对列表包含若干个日志信息,每个日志信息分别对应一个修订号;

根据所述第一日志信息的第一修订号和所述键值对列表中最小的第二修订号,确定所述第一客户端是否获得所述第一锁的操作权限。

作为优选方案,所述根据所述获锁请求信息,生成第一日志信息,具体为:

根据所述获锁请求中的第一锁的前缀路径和第一客户端的标识,生成第一日志信息;其中,所述第一日志信息包括第一任期号、第一索引号和第一修订号。

作为优选方案,所述根据所述获锁请求信息,生成键值对列表,具体为:

根据所述获锁请求信息中的第一锁的前缀路径,获取所有与所述第一锁的前缀路径相同的日志信息,并将所述日志信息按照修订号的大小进行升序排列,构成所述键值对列表。

作为优选方案,所述根据所述第一日志信息的第一修订号和所述键值对列表中最小的第二修订号,确定所述第一客户端是否获得所述第一锁的操作权限,具体为:

若所述第一修订号等于所述第二修订号时,则所述第一客户端获得第一锁的操作权限;

若所述第一修订号大于所述第二修订号时,则根据所述第一修订号,获取所述第一修订号在键值对列表中的第一位置;

根据所述第一位置,监听在所述键值对列表中第一位置的前一个位置对应的第二客户端,一旦所述第二客户端释放所述第一锁时,则所述第一客户端获得所述第一锁的操作权限。

作为优选方案,在所述第一客户端获得第一锁的操作权限之后,还包括:

若所述第一客户端获得所述第一锁的操作权限的时间超过预设租约时,则删除所述第一锁,以便于其他客户端申请重新创建所述第一锁或者其他客户端自由调用所述第一锁对应的数据资源;

若所述第一客户端获得所述第一锁的操作权限的时间未超过预设租约时,则所述第一客户端完成所述第一锁对应的业务操作后,所述第一客户端自动释放所述第一锁,以便于其他客户端获得所述第一锁的操作权限。

作为优选方案,在所述服务器接收第一客户端发送第一锁的获锁请求信息之前,还包括:

所述服务器接收任一所述客户端发送的加锁请求信息;

根据所述加锁请求信息创建所述第一锁。

作为优选方案,在生成第一日志信息之后,还包括:

所述服务器将所述第一日志信息复制到候选服务器中,以便于当所述服务器发生宕机时,所述第一日志信息不会丢失。

作为优选方案,当所述服务器发生宕机时,将任期号最大、索引号最大的日志信息对应的候选服务器作为新的服务器。

相应地,本发明还提供一种基于raft算法的分布式锁的实现系统,包括:

接收模块,用于接收第一客户端发送第一锁的获锁请求信息;

数据生成模块,用于根据所述获锁请求信息,生成第一日志信息和键值对列表;其中,所述键值对列表包含若干个日志信息,每个日志信息分别对应一个修订号;

诊断模块,用于根据所述第一日志信息的第一修订号和所述键值对列表中最小的第二修订号,确定所述第一客户端是否获得所述第一锁的操作权限。

实施本发明实施例,具有如下有益效果:

本发明实施例提供的基于raft算法的分布式锁的实现方法,该方法先接收第一客户端发送第一锁的获锁请求信息;根据获锁请求信息,生成第一日志信息和键值对列表;其中,键值对列表包含若干个日志信息,每个日志信息分别对应一个修订号;根据第一日志信息的第一修订号和键值对列表中最小的第二修订号,确定第一客户端是否获得第一锁的操作权限。相比于现有技术采用基于redis算法的分布式锁以实现数据的一致性,本发明技术方案中的各个客户端将当前操作的修订号与键值对列表中的修订号进行比较,从而确定自身是否获得锁的操作权限,采用本发明技术方案有效避免多个客户端在同个时间内获取同一把锁的操作权限,使得获锁和解锁都是同一个客户端操作,进而提高了数据的一致性。

附图说明

图1是本发明提供的基于raft算法的分布式锁的实现方法的第一实施例的流程示意图;

图2是本发明提供的基于raft算法的分布式锁的实现系统的第二实施例的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

应注意到,本发明的描述中,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。

第一实施例:

参见图1,是本发明提供的基于raft算法的分布式锁的实现方法的一种实施例的流程示意图。如图1,该构建方法包括步骤101至步骤103,各步骤具体如下:

步骤101:服务器接收第一客户端发送第一锁的获锁请求信息。

在本实施例中,步骤101具体为:服务器接收第一客户端发送第一锁的获锁请求信息;其中,第一锁的获锁请求信息包括第一锁前缀路径和第一客户端标识。譬如,第一锁的前缀路径为/lock/samp,第一客户端标识为uuidaa;因此,第一锁的获锁请求信息为/lock/samp uuidaa。需说明的是,第一锁的前缀路径表示为第一锁在服务器中的存储地址,客户端标识用uuid方法确定,从而使得每个客户端的标识是唯一的。

在本实施例中,在服务器接收第一客户端发送第一锁的获锁请求信息之前,服务器先接收客户端发送的加锁请求信息,并根据加锁请求信息创建第一锁,其中,加锁请求信息包括加锁数据和第一锁名称。譬如,第i个客户端发送的加锁请求信息包括第一数据和第一锁名称samp,则根据第一数据和第一锁名称samp,创建一个名为samp的锁,并保存在lock的存储路径下,因此第一锁的前缀路径为/lock/samp;需说明的是,第一数据表示为任意一个准备加锁的数据,第一锁表示为该第一数据对应的锁,第一客户端表示任意一个向服务器发送加锁请求信息或获锁请求信息的客户端,需说明的是,当第一锁创建成功后,对第一锁设置租约,以便于当第一客户端获取第一锁的操作权限的时间超过租约而导致其他客户端获取不到第一锁的操作权限。

步骤102:根据获锁请求信息,生成第一日志信息和键值对列表;其中,键值对列表包含若干个日志信息,每个日志信息分别对应一个修订号。

在本实施例中,步骤102具体为:根据获锁请求中的第一锁的前缀路径和第一客户端的标识,自动生成第一日志信息。其中,日志信息包括任期号、索引号和修订号,需说明的是,任期号为服务器的任期标识,譬如,当前服务器的任期号为1、该服务器产生的日志信息中的任期号均为1,之后该服务器发生宕机了,集群会自主选择新的服务器,那么新服务器的任期号为2,产生的日志信息的任期号也均为2。索引号为数据项的编号。修订号全局唯一,每一次生成日志信息、客户端访问服务器、服务器将日志信息赋值给客户端时,均会在全局修订号的基础上加一。在生成的第一日志信息后,服务器不仅将第一日志信息存储在自身的日志存储模块中,还将第一日志信息返回发送到第一客户端,并保存在第一客户端的日志存储模块中。

在本实施例中,根据获锁请求信息,生成键值对列表,具体为:根据获锁请求信息中的第一锁的前缀路径,在服务器的日志存储模块中获取所有与第一锁的前缀路径相同的日志信息,并将日志信息按照修订号的大小按照升序进行排列,构成键值对列表。

步骤103:根据第一日志信息的第一修订号和键值对列表中最小的第二修订号,确定第一客户端是否获得第一锁的操作权限。

在本实施例中,步骤103具体为:若第一修订号等于第二修订号时,则第一客户端获得第一锁的操作权限;若第一修订号大于第二修订号时,则根据第一修订号,获取第一修订号在键值对列表中的第一位置;根据第一位置,监听在键值对列表中第一位置的前一个位置对应的第二客户端,一旦第二客户端释放第一锁时,则第一客户端获得第一锁的操作权限。

在本实施例中,客户端通过键值对列表中的修订号,判断自身的修订号是否与键值对列表中最小的修订号是否相等,确定自身是否获得锁的操作权限,进而避免多个客户端在同个时间内获取同一把锁的操作权限,使得获锁和解锁都是同一个客户端操作,提高了数据的一致性。

在本实施例中,当第一客户端发现当前操作的修订号与键值对列表中修最小修订号不相等时,获取第一修订号在键值对列表中的第一位置;根据第一位置,提取在键值对列表中第一位置的前一个位置的第二日志信息,并监听第二日志信息对应的第二客户端;一旦第二客户端释放第一锁时,则第一客户端获得第一锁的操作权限,使得客户端只需要向服务器发送一次获锁请求信息,便可进入等待,从而避免了客户端不断向服务器发送获锁请求信息而引起惊群效应的发生。

在本实施例中,在第一客户端获得第一锁的操作权限之后,若第一客户端获得第一锁的操作权限的时间超过预设租约时,则删除第一锁,以便于其他客户端申请重新创建第一锁或者其他客户端自由调用第一锁对应的数据资源;若第一客户端获得第一锁的操作权限的时间未超过预设租约时,则第一客户端完成第一锁对应的业务操作后,第一客户端自动释放第一锁,以便于其他客户端获得第一锁的操作权限。通过对锁设置租约,即使客户端没有正常的释放锁,也能保证在租约过后,其他客户端加锁、获锁和解锁服务的正常进行。

在本实施例中,当服务器发生宕机时,将任期号最大、索引号最大的日志信息对应的候选服务器标记为新的服务器。具体为:每个客户端将日志存储模块中所有日志信息按照修订号的大小进行升序排列,提取每个候选服务器最后一条日志信息,分别比较最后一条日志信息的任期号和索引号,将任期号最大、索引号最大的候选服务器标记为新的服务器。

在本实施例中,当服务器发生宕机时,不会因服务器发生宕机而导致系统无法进行相应的数据加锁操作,而是会从候选服务器中重新挑选出一个新的服务器,继续执行服务器接收客户端的请求操作,从而提高系统的稳定性。不仅如此,服务器将生成的日志信息同步到每个候选服务器的存储模块中,一旦服务器发生宕机,新的服务器从存储模块中提取全部的日记信息到日志存储模块中,使得客户端能够将当前的日志信息与服务器中的键值对列表的日志信息进行比较,该过程能够有效防止数据的丢失,进一步增加数据的一致性。

为了更好的说明本实施例的流程和原理,以下面例子作为详细说明:

步骤一:服务器接收客户端发送的加锁请求,加锁请求为“第一数据 samp”,根据加锁请求创建一个名为samp的锁,并存储在服务器的存储路径为/lock/samp中,同时为samp锁设置租约。

步骤二:服务器接收客户端samp锁的获锁请求信息时;其中,获锁请求信息为/lock/samp uuidaa,服务器根据获锁请求信息自动生成第一日志信息,需说明的是,日记信息包括任期号、索引号和修订号,且每一个锁对应的日志信息全局唯一。在生成日志信息之后,服务器不仅将第一日志信息存储在自身的日志存储模块中,还将第一日志信息返回发送到第一客户端并保存在第一客户端的日志存储模块中。

步骤三:客户端根据samp锁的前缀路径/lock/samp,获取所有与samp锁的前缀路径相同的日志信息,并将日志信息按照修订号的大小进行升序排列,构成键值对列表,并从键值对列表中,获取修订号最小的日志信息,需说明的是,键值对列表根据修订号的大小进行升序排列,因此,客户端只需要将自身的修订号与排在键值对列表中首位的日志信息进行比较即可。

步骤四:将第一日志信息的第一修订号和键值对列表中最小的第二修订号进行比较,若第一修订号等于第二修订号时,则第一客户端获得第一锁的操作权限;若第一修订号大于第二修订号时,则根据第一修订号,获取第一修订号在键值对列表中的第一位置;根据第一位置,监听在键值对列表中第一位置的前一个位置对应的第二客户端;一旦第二客户端释放第一锁时,则第一客户端获得第一锁的操作权限。

步骤五:在第一客户端获得第一锁的操作权限之后,若第一客户端获得第一锁的操作权限的时间超过预设租约时,则删除第一锁,以便于其他客户端申请重新创建第一锁或者其他客户端自由调用第一锁对应的第一数据;若第一客户端获得第一锁的操作权限的时间未超过预设租约时,则第一客户端完成第一锁对应的业务操作后,第一客户端自动释放第一锁,以便于其他客户端获得第一锁的操作权限。

由上可见,本发明实施例提供的基于raft算法的分布式锁的实现方法,该方法先接收第一客户端发送第一锁的获锁请求信息;根据获锁请求信息,生成第一日志信息和键值对列表;其中,键值对列表包含若干个日志信息,每个日志信息分别对应一个修订号;根据第一日志信息的第一修订号和键值对列表中最小的第二修订号,确定第一客户端是否获得第一锁的操作权限。相比于现有技术采用基于redis算法的分布式锁以实现数据的一致性,本发明技术方案中的各个客户端将当前操作的修订号与键值对列表中的修订号进行比较,从而确定自身是否获得锁的操作权限,采用本发明技术方案有效避免多个客户端在同个时间内获取同一把锁的操作权限,使得获锁和解锁都是同一个客户端操作,进而提高了数据的一致性。

第二实施例:

请参见图2,是本发明提供的一种基于raft算法的分布式锁的实现系统的第二实施例的结构示意图,该系统包括接收模块201、数据生成模块202和诊断模块203。

接收模块201,用于接收第一客户端发送第一锁的获锁请求信息;

数据生成模块202,用于根据获锁请求信息,生成第一日志信息和键值对列表;其中,键值对列表包含若干个日志信息,每个日志信息分别对应一个修订号;

诊断模块203,用于根据第一日志信息的第一修订号和键值对列表中最小的第二修订号,确定第一客户端是否获得第一锁的操作权限。

本实施例更详细的工作原理和流程可以但不限于参见第一实施例的基于raft算法的分布式锁的实现方法。

由上可见,本发明技术方案相比于现有技术采用基于redis算法的分布式锁以实现数据的一致性,本发明技术方案中的各个客户端将当前操作的修订号与键值对列表中的修订号进行比较,从而确定自身是否获得锁的操作权限,采用本发明技术方案有效避免多个客户端在同个时间内获取同一把锁的操作权限,使得获锁和解锁都是同一个客户端操作,进而提高了数据的一致性。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,的存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)或随机存储记忆体(randomaccessmemory,ram)等。

以上是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。


技术特征:

1.一种基于raft算法的分布式锁的实现方法,其特征在于,包括:

服务器接收第一客户端发送第一锁的获锁请求信息;

根据所述获锁请求信息,生成第一日志信息和键值对列表;其中,所述键值对列表包含若干个日志信息,每个日志信息分别对应一个修订号;

根据所述第一日志信息的第一修订号和所述键值对列表中最小的第二修订号,确定所述第一客户端是否获得所述第一锁的操作权限。

2.如权利要求1所述的基于raft算法的分布式锁的实现方法,其特征在于,所述根据所述获锁请求信息,生成第一日志信息,具体为:

根据所述获锁请求中的第一锁的前缀路径和第一客户端的标识,生成第一日志信息;其中,所述第一日志信息包括第一任期号、第一索引号和第一修订号。

3.如权利要求1所述的基于raft算法的分布式锁的实现方法,其特征在于,所述根据所述获锁请求信息,生成键值对列表,具体为:

根据所述获锁请求信息中的第一锁的前缀路径,获取所有与所述第一锁的前缀路径相同的日志信息,并将所述日志信息按照修订号的大小进行升序排列,构成所述键值对列表。

4.如权利要求3所述的基于raft算法的分布式锁的实现方法,其特征在于,所述根据所述第一日志信息的第一修订号和所述键值对列表中最小的第二修订号,确定所述第一客户端是否获得所述第一锁的操作权限,具体为:

若所述第一修订号等于所述第二修订号时,则所述第一客户端获得第一锁的操作权限;

若所述第一修订号大于所述第二修订号时,则根据所述第一修订号,获取所述第一修订号在键值对列表中的第一位置;

根据所述第一位置,监听在所述键值对列表中第一位置的前一个位置对应的第二客户端,一旦所述第二客户端释放所述第一锁时,则所述第一客户端获得所述第一锁的操作权限。

5.如权利要求4所述的基于raft算法的分布式锁的实现方法,其特征在于,在所述第一客户端获得第一锁的操作权限之后,还包括:

若所述第一客户端获得所述第一锁的操作权限的时间超过预设租约时,则删除所述第一锁,以便于其他客户端申请重新创建所述第一锁或者其他客户端自由调用所述第一锁对应的数据资源;

若所述第一客户端获得所述第一锁的操作权限的时间未超过预设租约时,则所述第一客户端完成所述第一锁对应的业务操作后,所述第一客户端自动释放所述第一锁,以便于其他客户端获得所述第一锁的操作权限。

6.如权利要求5所述的基于raft算法的分布式锁的实现方法,其特征在于,在所述服务器接收第一客户端发送第一锁的获锁请求信息之前,还包括:

所述服务器接收任一所述客户端发送的加锁请求信息;

根据所述加锁请求信息创建所述第一锁。

7.如权利要求1所述的基于raft算法的分布式锁的实现方法,其特征在于,在生成第一日志信息之后,还包括:

所述服务器将所述第一日志信息复制到候选服务器中,以便于当所述服务器发生宕机时,所述第一日志信息不会丢失。

8.如权利要求1-7任意一项所述的基于raft算法的分布式锁的实现方法,其特征在于,当所述服务器发生宕机时,将任期号最大、索引号最大的日志信息对应的候选服务器作为新的服务器。

9.一种基于raft算法的分布式锁的实现系统,其特征在于,包括:

接收模块,用于接收第一客户端发送第一锁的获锁请求信息;

数据生成模块,用于根据所述获锁请求信息,生成第一日志信息和键值对列表;其中,所述键值对列表包含若干个日志信息,每个日志信息分别对应一个修订号;

诊断模块,用于根据所述第一日志信息的第一修订号和所述键值对列表中最小的第二修订号,确定所述第一客户端是否获得所述第一锁的操作权限。

技术总结
本发明公开了一种基于Raft算法的分布式锁的实现方法及系统,该方法先接收第一客户端发送第一锁的获锁请求信息;根据获锁请求信息,生成第一日志信息和键值对列表;其中,键值对列表包含若干个日志信息,每个日志信息分别对应一个修订号;根据第一日志信息的第一修订号和键值对列表中最小的第二修订号,确定第一客户端是否获得第一锁的操作权限。采用本发明技术方案能够避免多个客户端同时操作同一个锁,从而使得同一时间只有一个客户端持有同一个锁,进一步提高数据一致性。

技术研发人员:李章铭;罗伟杰;卢彬;刘志辉;李宇昊;陈罗威
受保护的技术使用者:青木数字技术股份有限公司
技术研发日:2020.01.16
技术公布日:2020.06.09

转载请注明原文地址: https://bbs.8miu.com/read-27758.html

最新回复(0)