一种云计算环境下分布式锁的实现方法及系统
技术领域
本发明涉及云计算的技术领域,尤其涉及一种云计算环境下分布式锁的实现方法及系统。
背景技术
近年来,在分布式服务中,如果各个服务节点需要竞争资源,不能像单机多线程应用一样使用线程锁,需要由一套分布式锁机制保证节点对资源的访问。大规模云计算场景中,为了保障数据的分布式一致性,数量众多的计算节点往往依赖分布式锁服务来同步各自对某共享资源的访问,或者是协调各计算节点之间的行为动作。
现有技术下,当出现某个工作主机因为自身原因无法提供对外服务的情况时,分布式锁服务能及时释放该工作主机持有的资源锁,使得其他健康的工作主机能获取资源锁提供对外的服务。但是该方案无法解决以下的场景:在云计算环境中,如果某个工作主机被攻击了成为恶意工作节点,该恶意节点或者不断的续租持有的资源锁,并且正常响应调度服务器的健康度检查请求,导致其他的工作主机无法获取资源锁对外提供服务;或者云计算环境本身是个开放环境允许工作主机自由加入,如果某个工作主机满足调度服务器的健康度检查,并且一直续租持有的资源锁,也会影响其他工作主机公平获取锁的机会。因此恶意节点持续持有分布式锁的问题始终没有得到解决。
发明内容
本部分的目的在于概述本发明的实施例的一些方面以及简要介绍一些较佳实施例。在本部分以及本申请的说明书摘要和发明名称中可能会做些简化或省略以避免使本部分、说明书摘要和发明名称的目的模糊,而这种简化或省略不能用于限制本发明的范围。
鉴于上述现有存在的问题,提出了本发明。
因此,本发明解决的技术问题是:提供一种云计算环境下分布式锁的实现方法,能够避免在云计算环境下,工作节点长期持有分布式资源锁而导致正常主机无法对外提供服务,同时保证所有工作节点可以公平的持有资源锁。
为解决上述技术问题,本发明提供如下技术方案:一种云计算环境下分布式锁的实现方法,包括以下步骤,在主调度服务器上进行资源锁配置信息的配置,并向一致性服务器下发资源锁配置信息;所述主调度服务器收到工作任务请求,将工作任务的类型下发给工作节点;所述工作节点执行工作任务的过程中需要申请共享资源时,向所述一致性服务器请申请资源锁,且申请时携带工作类型;所述一致性服务器对所述工作节点进行资源锁信息检查,通过检查后向资源服务器发出资源分配请求;所述资源服务器对资源分配请求进行处理,分配资源成功时,所述一致性服务器根据资源持有时间启动定时器,并返回资源锁获取成功。
作为本发明所述的云计算环境下分布式锁的实现方法的一种优选方案,其中:所述资源锁配置信息包括,工作任务类型、资源类型和资源持有时间,且数据格式为JSON格式。
作为本发明所述的云计算环境下分布式锁的实现方法的一种优选方案,其中:所述一致性服务器接收资源锁配置信息后,采用MYSQL数据库进行保存,且向所述一致性服务器中配置资源类型对应的资源服务器的地址信息。
作为本发明所述的云计算环境下分布式锁的实现方法的一种优选方案,其中:所述一致性服务器进行资源锁信息检查还包括以下步骤,所述一致性服务器根据申请携带的工作类型从存储中获取对应的资源锁记录,包括资源锁类型、资源持有时长以及该资源占用信息;若对应的资源锁被占有,所述一致性服务器返回给所述工作节点资源锁申请失败;若对应的资源锁未被占有,所述一致性服务器判断所述工作节点是否在短时间内频繁申请资源锁,返回申请失败或申请成功。
作为本发明所述的云计算环境下分布式锁的实现方法的一种优选方案,其中:所述判断还包括以下步骤,所述一致性服务器根据请求的工作节点的标识,计算工作节点本次申请资源锁的时间和最近一次释放该资源锁的时间差T;对比时间差T和预置的时间t,若T<t,则返回申请失败,并给出申请的间隔时间为2t;若T≥t,则申请成功,所述工作节点通过所述资源服务器的资源锁信息检查。
作为本发明所述的云计算环境下分布式锁的实现方法的一种优选方案,其中:所述对资源分配请求进行处理还包括以下步骤,所述资源服务器根据所述一致性服务器传入的资源标识以及工作节点标识,查询资源标识对应的资源是否已被占用;若资源标识对应的资源已被占用,则所述资源服务器返回给所述一致性服务器资源分配失败;若资源标识对应的资源未被占用,则将所述工作节点的标识信息写入该资源的占用信息中,并将该资源设置为已被占用,并返回给所述一致性服务器资源分配成功。
作为本发明所述的云计算环境下分布式锁的实现方法的一种优选方案,其中:所述定时器的工作还包括以下步骤,所述一致性服务器收到所述工作节点释放资源锁的请求或者资源锁定时器发生超时时,所述一致性服务器向所述资源服务器发送资源释放的请求;所述资源服务器收到资源释放的请求后,更新该资源的占用信息,将工作节点从占用信息中删除。
作为本发明所述的云计算环境下分布式锁的实现方法的一种优选方案,其中:还包括以下步骤,所述工作节点获取资源锁成功后,访问资源服务器的资源;所述资源服务器根据资源类型和所述工作节点的标识查询保存的资源占用信息,若资源占用信息中的工作节点标识和访问的工作节点标识一致,则允许所述工作节点访问并获取资源,若不一致,则返回工作节点访问失败。
本发明解决的又一个技术问题是:提供一种云计算环境下分布式锁的实现系统,上述云计算环境下分布式锁的实现方法能够依托于该系统实现。
为解决上述技术问题,本发明提供如下技术方案:一种云计算环境下分布式锁的实现系统,包括,主调度服务器,所述主调度服务器用于进行资源锁配置信息的配置并保存,以及接收工作任务请求;一致性服务器,所述一致性服务器用于处理申请资源锁的请求,并判断申请成功或失败;工作节点,所述工作节点能够执行工作任务,并在需要申请共享资源时,向所述一致性服务器请申请资源锁;资源服务器,所述资源服务器用于存储资源,并能够根据需求释放资源。
作为本发明所述的云计算环境下分布式锁的实现系统的一种优选方案,其中:所述一致性服务器还包括定时器,所述定时器设置于所述所述一致性服务器内部,能够设置时间。
本发明的有益效果:本发明提出的云计算环境下分布式锁的实现方法,能够根据工作任务配置独立的资源锁超时时间,避免云计算环境下恶意或异常工作主机长期持有分布式资源锁后,导致正常主机无法对外提供服务,另外也可以保证所有工作主机可以公平的持有资源锁,提升云计算服务的可靠性和可服务性。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。其中:
图1为本发明第一种实施例所述云计算环境下分布式锁的实现方法的整体流程示意图;
图2为本发明第一种实施例中所述一致性服务器处理工作节点申请资源的流程示意图;
图3为本发明第二种实施例所述云计算环境下分布式锁的实现系统的整体结构示意图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合说明书附图对本发明的具体实施方式做详细的说明,显然所描述的实施例是本发明的一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明的保护的范围。
在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是本发明还可以采用其他不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本发明内涵的情况下做类似推广,因此本发明不受下面公开的具体实施例的限制。
其次,此处所称的“一个实施例”或“实施例”是指可包含于本发明至少一个实现方式中的特定特征、结构或特性。在本说明书中不同地方出现的“在一个实施例中”并非均指同一个实施例,也不是单独的或选择性的与其他实施例互相排斥的实施例。
本发明结合示意图进行详细描述,在详述本发明实施例时,为便于说明,表示器件结构的剖面图会不依一般比例作局部放大,而且所述示意图只是示例,其在此不应限制本发明保护的范围。此外,在实际制作中应包含长度、宽度及深度的三维空间尺寸。
同时在本发明的描述中,需要说明的是,术语中的“上、下、内和外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一、第二或第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。
本发明中除非另有明确的规定和限定,术语“安装、相连、连接”应做广义理解,例如:可以是固定连接、可拆卸连接或一体式连接;同样可以是机械连接、电连接或直接连接,也可以通过中间媒介间接相连,也可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。
实施例1
在云计算环境下,数量众多的工作节点往往依赖分布式锁服务来同步各自对某共享资源的访问,或协调各工作节点之间的行为动作,因此需要确保各个工作节点公平地获取资源,以及防止恶意节点长时间占有资源从而影响正常的工作节点获取资源。
参照图1~2的示意,本实施例提供了一种云计算环境下分布式锁的实现方法,具体的,该方法包括以下步骤,
S1:在主调度服务器100上进行资源锁配置信息的配置,并向一致性服务器200下发资源锁配置信息。
其中,资源锁配置信息包括,工作任务类型、资源类型和资源持有时间,且数据格式为JSON格式,资源持有时间以秒为单位。具体的,运维人员在主调度服务器上进行配置不同工作任务不同资源不同的持有时间,该过程采用的是人工配置。
主调度服务器100向一致性服务器200下发资源锁配置信息时采用HTTP进行通信,HTTP协议是基于客户/服务器模式,且面向连接的通信协议,是一个简单的请求-响应协议,允许传送任意类型的数据对象。
一致性服务器200收到主调度服务器100发送的请求后,保存其传输的资源锁配置信息记录。在本实施例中,一致性服务器200采用MYSQL数据库对接收到的资源锁配置信息进行保存,MYSQL是一种开放源代码的关系型数据库管理系统,具有体积小、速度快、成本低的特点,由于是完全开源的,因此很容易获取和使用。此外,一致性服务器200的数据库中保存了资源类型对应的资源服务器400的地址信息,且该信息由运维人员采用人工配置的方式配置到一致性服务器200中。
S2:主调度服务器100收到工作任务请求,将工作任务的类型下发给工作节点300。
具体的,该步骤中基于HTTP协议进行通信,且传输的数据格式采用JSON,JSON是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据,其层次结构简洁清晰,易于阅读和编写,同时也易于机器解析和生成,能够有效地提升网络传输效率。
S3:工作节点300执行工作任务的过程中需要申请共享资源时,向一致性服务器200请申请资源锁,且申请时携带工作类型。
具体的,工作节点300收到工作任务类型后,启动进行相关工作任务计算,在执行工作任务计算过程中,根据工作任务类型向一致性服务器200申请共享资源锁,且申请携带时的数据为工作任务类型。其中,资源锁是数据库中的一条记录,一致性服务器200的数据库通过写入记录保证某个时刻只有一个工作节点300访问一致性服务器200,在本实施例中,采用HTTP进行通信,数据格式采用JSON。
S4:一致性服务器200对工作节点300进行资源锁信息检查,通过检查后向资源服务器400发出资源分配请求。具体的,还包括以下步骤,
一致性服务器200根据工作节点300申请时携带的工作类型从存储中获取对应的资源锁记录,包括资源锁类型、资源持有时长以及该资源占用信息;具体的,资源锁记录存储在MYSQL数据库中。
根据一致性服务器200获取的资源锁记录,若对应的资源锁被占有,一致性服务器200返回给工作节点300资源锁申请失败;具体的,若资源锁已被占有,一致性服务器200除了返回给工作节点300资源已被占有信息,还会给出下次申请的建议间隔时长,且建议间隔时长的值默认是该资源持有时长的二分之一,也可以通过配置进行人工更改,给出建议间隔时长的目的是避免工作节点300在短时间内频繁请求已被占有的资源锁,既可以减少一致性服务器200处理无效请求的负担,也能够避免工作节点300的无效请求。
若对应的资源锁未被占有,一致性服务器200需要判断工作节点300是否在短时间内频繁申请资源锁,并根据判断结果返回申请失败或申请成功;具体的,所述判断还包括以下步骤,
一致性服务器200根据请求的工作节点300的标识,计算工作节点300本次申请资源锁的时间和最近一次释放该资源锁的时间差T;其中,在本实施例中采用工作节点300的IP和端口号进行标识。
对比时间差T和预置的时间t,若T<t,则返回申请失败,并给出申请的间隔时间为2t;具体的,判断工作节点300是否在预置的时间t内连续占用资源锁,若T<t,则工作节点300在时间t内连续申请资源锁,则返回申请失败,并且给出申请的间隔时间是时间t的2倍,即2t,此步骤的目的是防止一个工作节点300在短时间内频繁申请资源锁成功,导致其他工作节点300无法公平参与申请竞争和获取资源。
若T≥t,则申请成功,工作节点300通过资源服务器400的资源锁信息检查。
S5:资源服务器400对资源分配请求进行处理,分配资源成功时,一致性服务器200根据资源持有时间启动定时器201,并返回资源锁获取成功。具体的,工作节点300通过资源服务器400的资源锁信息检查后,一致性服务器200携带工作节点300的标识,向资源服务器400申请资源分配,在本实施例中标识为工作节点300的IP和端口号。资源服务器400的信息由运维人员配置在一致性服务器200中,一致性服务器200根据资源锁的资源类型信息获取资源服务器400信息,其中,资源类型表示工作任务相关的资源,如资源服务器400上某个文件的名字或者资源服务器400上数据库的信息。在本实施例中的一致性服务器200和资源服务器400之间的通信协议采用HTTP协议,传输的数据格式采用JSON。其中,资源服务器400对资源分配请求进行处理还包括以下步骤,
资源服务器400根据一致性服务器200传入的资源标识以及工作节点300的标识,查询资源标识对应的资源是否已被占用;在本实施例中,资源服务器400MYSQL数据库保存资源占用信息,查询的具体方式是查询数据中资源标识对应的记录,以及该记录的占用字段,该字段值如果是1表示资源被占用。
若资源标识对应的资源已被占用,则资源服务器400返回给一致性服务器200资源分配失败;具体的,一致性服务器200接收到资源分配失败的信息后,返回给工作节点300资源分配失败信息。
若资源标识对应的资源未被占用,则将工作节点300的标识信息写入该资源的占用信息中,并将该资源设置为已被占用,返回给一致性服务器200资源分配成功。具体的,当返回给一致性服务器200分配资源成功时,一致性服务器200根据资源的最长持有时间启动定时器201,然后返回工作节点300资源锁分配成功。其中,定时器201的工作还包括以下步骤,
一致性服务器200收到工作节点300释放资源锁的请求或者资源锁定时器201发生超时时,一致性服务器200向资源服务器400发送资源释放的请求;具体的,一致性服务器200在两种情况下会向资源服务器400发送资源释放的请求,一是工作节点300主动发起释放资源锁的请求,二是工作节点300在定时器201超时之前没有通知一致性服务器200释放资源锁,此时一致性服务器200在定时器201超时之后,主动向资源服务器400下发释放资源的请求,且释放资源锁的请求中需要携带资源类型和工作节点300的标识。
资源服务器400收到资源释放的请求后,更新该资源的占用信息,将工作节点从占用信息中删除。当资源服务器400释放了工作节点300占用的资源之后,工作节点300向资源服务器400请求资源访问时,资源服务器400返回失败信息给工作节点300。
一致性服务器200启动定时器201,并返回资源锁获取成功后,还包括以下步骤,
工作节点300获取资源锁成功后,访问资源服务器400的资源;具体的,工作节点300获取资源锁后访问资源服务器400的资源,访问时需要携带资源类型。
资源服务器400根据资源类型和工作节点300的标识查询保存的资源占用信息,若资源占用信息中的工作节点300标识和访问的工作节点300标识一致,则允许工作节点300访问并获取资源,若不一致,则返回工作节点访问失败。具体的,本实施例中工作节点300的标识为IP地址和端口,当资源占用信息中的工作节点300标识和访问的工作节点300标识一致时,工作节点300能够正常地从资源服务器400获取资源。
相对于传统的分布式锁的控制和调度方法,传统的处理方式是在工作节点因为自身原因无法提供对外服务的情况下,分布式锁服务释放该工作节点持有的资源锁,使得其他健康的工作节点能获取资源锁提供对外的服务,但传统的方案不能解决以下问题:即工作节点被攻击了成为恶意工作节点或者因为自身异常导致该工作节点不断的续租持有的资源锁,并且正常响应调度服务器的健康度检查请求,导致其他的工作节点无法获取资源锁对外提供服务;或者云计算环境本身是个开放环境并且允许任意工作节点自由加入,如果某个工作节点满足调度服务器的健康度检查,并且一直续租持有的资源锁,也会影响其他工作主机公平获取锁的机会,本发明提供的云计算环境下分布式锁的实现方法针对恶意工作节点长期持有的资源锁以及频繁申请资源锁的问题进行针对性解决,通过人为制造一个恶意节点,测试其是否会长期恶意占用资源锁,测试能够得到结果如下:
表1:恶意节点长时间恶意占用资源锁的情况,设定最长占用时间为6h
表2:恶意节点持续申请资源锁的情况,设定最小访问间隔为4h
时间间隔(h) |
1 |
2 |
3 |
4 |
5 |
6 |
本发明 |
失败 |
失败 |
失败 |
成功 |
成功 |
成功 |
传统调度方法 |
成功 |
成功 |
成功 |
成功 |
成功 |
成功 |
通过表1~2可以看出,相对于传统的分布式锁的控制和调度方法,本发明提供的方法既能够根据设定的访问时间控制节点对资源锁的占用时长、从而防止恶意节点对资源锁的长期占用;也能够通过设定访问间隔时长、从而避免恶意节点对资源锁过于频繁的申请,可以看出,本发明对于在对恶意节点的防范和对资源的保护上相对于传统方式有了极大的改进,在实际使用中能够令正常节点更加公平、合理的使用资源,减小恶意节点的干扰。
实施例2
参照图3的示意,示意为本实施例提出的一种云计算环境下分布式锁的实现系统,上述云计算环境下分布式锁的实现方法能够依托于本系统实现,具体的,该系统包括,主调度服务器100、一致性服务器200、工作节点300和资源服务器400。
主调度服务器100用于进行资源锁配置信息的配置并保存,以及接收工作任务请求。具体的,主调度服务器100是云计算平台对客户可见的服务器,客户端能够通过访问主调度服务器100发送工作请求,主调度服务器100能够在收到工作请求后,进行任务分解,再分派到各个工作节点300。
一致性服务器200用于处理申请资源锁的请求,并判断申请成功或失败。具体的,一致性服务器200是一个分布式锁的管理的服务器,在本实施例中采用数据库实现,本领域技术人员可以理解的是,也可以用redis或者zk实现。一致性服务器200实质上通过数据的互斥写保证某时刻只有一台工作节点可以成功写入一条它获取资源锁的信息到数据库,而别的工作节点再写就会失败。
优选的,一致性服务器200还包括定时器201,其中,定时器201设置于一致性服务器200内部,能够设置时间,在本实施例中,定时器201能够起到计时的作用,从而确保工作节点300占有资源的时间不超过配置的资源最长持有时间。
工作节点300能够执行工作任务,并在需要申请共享资源时,向一致性服务器200请申请资源锁。具体的,工作节点300是用于执行工作任务的服务器。
资源服务器400用于存储资源,并能够根据需求释放资源。具体的,资源服务器400存储资源,工作节点300在执行工作任务时根据其需求访问资源服务器400的资源,比如读写文件、访问数据库等。
应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。