一种基于磁盘服务锁的裂脑预防的方法和装置的制作方法

文档序号:7553406阅读:102来源:国知局
专利名称:一种基于磁盘服务锁的裂脑预防的方法和装置的制作方法
技术领域
本发明属于计算机集群技术领域,适用于高可用性集群(High-avaiIabiIityclusters),尤其适用于一种基于磁盘服务锁的高可用性系统的裂脑预防的方法和装置。
背景技术
随着通信网络技术的飞速发展,电信、金融、电子政务等关键领域对服务器可用性的要求越来越高,高可用集群系统日益被越来越多的用户接受和广泛使用。为了避免因服务器或交换机的故障而使业务停止造成的巨大的经济损失,通过高可用性(HighAvailability,HA)系统可以大大减少了业务系统的常规维护和业务因软件、硬件等故障影响的停止时间。当前高可用集群系统主要通过网络或串口等连接作为集群通信的私有心跳网络,负责交换同步节点间的信息,监测集群中各个节点的运行情况。一般来说,集群有工作机和备份机,当备份机不能在一定时间内收到工作机的心跳信息,备份机则认为工作机发生了故障,接管了工作机上的业务并继续对外提供服务。高可用集群通过上述过程提高了业务的可用性,但是当心跳网络故障时,可能会导致工作机和备份机同时提供服务,会出现裂脑(Split Brain, SB),导致数据损坏。在实际的实施案例中,发明人发现网络容易受到网卡、交换机、心跳线路以及驱动等的影响。尤其在长时间运作的业务中,网卡故障、交换机掉电、网线被拔或驱动异常也时有发生,严重的时候会出现集群心跳网络全部断开,集群被分为多个。这时非常容易出现同一个服务同时在两节点上运行,导致客户的数据丢失或被破坏,这是高可用集群普遍存在的一个安全隐患问题。为了保障用户的数据不受破坏和服务可持续性,在集群心跳网络断开或异常时,防止集群裂脑是必不可少的。目前市场中为了解决此问题,通用做法都是采用将节点重启系统或将共享存储对其他节点进行隔离。但发明人发现这些方法并不能满足市场的要求,在实际的实施当中,备用节点上同样运行着其他重要的业务,客户不允许操作系统重启或整一块共享存储被隔离。在解决集群防止裂脑的过程中,发明人发现现有的技术存在如下的问题:集群心跳网络中断时,无法区别是心跳网络故障,还是节点死机,容易做出错误的判断,从而产生裂脑;在上述判断中,能够检测到工作机仍然活着,但无法确定服务是否停止成功,存在短暂裂脑的可能,造成数据损坏;在上述判断中,如果判断节点死机了,存在多个节点同时启动服务,产生裂脑,造成数据被破坏的可能。

发明内容
本发明实例提供一种基于磁盘服务锁的裂脑预防的方法和装置,在不需要将节点系统重启或共享存储隔离的情况下,仍然能够在集群心跳网络中断或异常时,实现防止集群裂脑发生,提高集群的高可用性。
一方面,提供了一种基于磁盘服务锁的裂脑预防的方法,包括:当心跳网络中断时,能够迅速区别是心跳网络故障还是节点死机的情况,避免做出误判,防止裂脑;如果是心跳网络故障,持续检测一段时间后,该服务锁没有释放,其他节点则不会再启动服务,避免工作机节点服务没有停止完成,备份机已启动而造成短暂的裂脑问题;如果是工作机死机,多个节点同时去抢占服务锁,只有唯一抢占成功的节点才有启动服务的权限,从而防止裂脑发生。另一方面,提供了一种基于磁盘服务锁的裂脑预防的装置,包括:节点检测判断模块,用于检测所有节点的心跳,判断出所有节点的当前的状态。当心跳网络中断时,判别心跳网络故障与工作节点死机的情况。磁盘服务锁查询模块,用于当心跳网络故障时,其他节点可以通过查询磁盘服务锁是否释放或已失效而做出对应策略,避免发生工作机的服务没有停止成功,备份机已启动造成的短暂裂脑发生。抢夺磁盘服务锁模块,用于在工作节点死机或因心跳网络故障后主机释放服务锁的情况下,多个节点同时去抢占服务锁,只有唯一抢占成功的节点才可以启动服务,防止裂脑发生。本发明实施提供了上述一种基于磁盘服务锁的裂脑预防的方法和装置,在心跳网络中断时,有效判别心跳网络故障还是节点死机的情况;通过查询磁盘服务锁可以正确获取服务是否已停止成功,从而避免了存在的短暂裂脑问题;在多个节点通过抢占服务锁,只有唯一抢占成功的节点才可以启动服务,防止裂脑发生。本发明实施提供的技术解决方案成功解决了目前在不需要将系统重启或共享存储隔离的情况下,集群在心跳网络中断或异常时,难以克服和避免的裂脑问题。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将用实施例或现有技术描述中所需要使用的附图作简单地介绍。图1为本发明提供的高可用双节点带磁盘服务锁的集群系统拓扑图;图2为本发明提供的磁盘服务锁内部结构图;图3为本发明提供的高可用多节点集群系统拓扑图;图4为本发明实施例一提供一种基于磁盘服务锁的裂脑预防的方法流程图;图5为本发明实施例一提供一种基于磁盘服务锁的裂脑预防的方法中情景之一的流程图;图6为本发明实施例一提供一种基于磁盘服务锁的裂脑预防的方法中情景之二的流程图;图7为本发明实施例一提供一种基于磁盘服务锁的裂脑预防的方法中情景之三的流程图;图8为本发明实施例一提供一种基于磁盘服务锁的裂脑预防的方法中情景之四的流程图;图9为本发明实施例二提供一种基于磁盘服务锁的裂脑预防的方法流程图;图10为本发明实施例三提供一种基于磁盘服务锁的裂脑预防的装置示意图一;
图11为本发明实施例三提供一种基于磁盘服务锁的裂脑预防的装置示意图二 ;
具体实施例方式下面将结合附图和实施例对本发明进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他的实施例,都属于本发明保护的范围。为了解决在集群心跳网络中断时,因不能有效判断其他节点及其运行服务状态而容易做出错误的策略,进而产生裂脑,破坏数据的问题。本发明实施例提供了一种基于磁盘服务锁,在不需要将系统重启或存储隔离的情况下,仍然有效地防裂脑的方法和装置。如图1所示,为有代表性的双机高可用带磁盘服务锁的集群系统拓扑图,系统有两台节点,服务器节点A和B,业务通过公有网络对外提供服务,节点间通过私有网络进行交换节点信息,监控节点上的服务运行状态,其中私有网络一般是两条或以上的直连网线或串口线。节点A定时将极小量的数据写磁盘分区中,同时由节点B读取,同样的,节点B也如此,本发明装置通过此原理检测节点的状态。而集群中的每一个服务在磁盘分区中有对应的一把服务锁,节点在启动服务前先抢到该服务锁,节点在停止服务后释放此服务锁。当节点持续一个时间常量,没有更新心跳,对应的节点所占用的服务锁将失效。运行在两台服务器中的集群软件包含本发明的装置。如图2所示,为双机高可用带磁盘服务锁的集群系统对应的磁盘服务锁的结构图,包括内容有分区唯一的分区标识、集群的节点和服务信息、服务锁以及节点信息等。如图3所示,高可用多节点集群系统拓扑图,在多节点高可用带磁盘服务锁的集群系统中,与双机系统类似地,各个节点分别定时将极小量的数据写到同一磁盘分区中的对应的区域,同时,读取其他所有节点写入的数据,各个节点根据读取的数据自动生成一份一致的节点状态列表。而集群中的每一个服务在磁盘分区中有对应的一把服务锁,节点在启动服务前先抢到该服务锁,节点在停止服务后释放此服务锁。当节点持续一个时间常量,没有更新心跳,对应的节点所占用的服务锁将失效。当工作节点死机或服务停止后,同一个服务域其他的节点都可以通过抢夺服务锁而接管服务。而运行在各个节点的服务器中的集群软件包含本发明的装置。以下的描述的实施例内容中,同时涵盖了双机和多节点的高可用性系统。如图4所示,本发明实施一提供一种基于磁盘服务锁的裂脑预防的方法,包括:步骤401,当集群心跳网络中断时,区别是心跳网络故障还是节点死机。在本实施例中,当集群心跳网络中断时,区别是心跳网络故障还是节点死机的过程包括:检测心跳断开的节点在磁盘的信息在最近一个时间常量t内是否有更新;根据更新的时间判断心跳断开的节点是否在线,从而区别心跳网络中断的原因是心跳网络故障还是节点死机。其中检测的时间常量t略小于接收到最后一个网络心跳到达到判定心跳网络中断的时间常量T,这样当时间常量t内的磁盘信息都没有更新,就可以有效力说明该节点网络与存储同时是崩溃了,我们可以认定。最为关键的是存储与系统断开,应用无法写入数据,不会对数据造成影响。一般来说,时间常量t越长越好,但这与高可用要求的故障时间短相悖,所以常量t 一般略小于时间常量T即可;如果在时间常量t内的磁盘信息仍然正常更新,我们可以证明该节点是由于集群私有网络故障而导致了该节点的心跳全部断开的。在本实施例中,如果采用的通过公有网络PING心跳断开节点的IP来判断节点的状态,在系统不允许PING(即系统不会回应icmp的请求包)、交换机端口损坏、网络风暴等等情况下,都不能有效地判断节点的状态,存在很大的安全风险隐患。发明人通过磁盘读写信息可以更准确地检测节点的状态,并且检测时间相对较长且不影响业务的切换时间,这是其他通过网络检测节点状态的方法无法做到的。在本实施例中,值得注意的是上述中的磁盘信息,并不是有关于集群的信息,而只是一个不会回卷的时间戳。因为集群的信息量很大,对磁盘的IO产生比较大的影响。而本发明只需要该时间戳的更新来判别出节点的状态的而非集群和服务的状态。所以本发明中使用的数据量极少,并非集群的心跳。在本实施例中,如果通过步骤401判断出心跳断开的节点是死机,就可以由集群其他备份工作节点进入步骤403抢锁,尝试去接受服务,如图5所示;如果通过步骤401判断出心跳断开的节点是网络故障,则集群其他备份工作节点进入了步骤402进行查询服务锁是否已释放,进而下一步操作。步骤402,在节点心跳全断了,但节点仍然在线的情况下,检测在一个时间常量S内该节点占用的磁盘服务锁是否已释放。在本实施例中,通过步骤401判断出心跳断开的节点是网络故障,此时存在很大的可能性是心跳断开节点的工作公有网络发生异常,会导致该节点上的服务停止。一般来说,节点的工作公有网络出现了故障都将服务转移,而服务停止的时间一般比上述判别节点心跳死的时间常量要长,因此,很容易出现一边还在停止服务,一边已在启动服务,产生了裂脑,短暂性的数据受损,磁盘阵列出现只读(read-only,R0)。对于多节点的集群更为容易出现这类问题。正确的做法,只有通过心跳断开的节点服务停止完成后,才可以启动服务,并且只能有一个节点启动。但心跳断开了,节点将服务停止完成后仍然不能告知其他节点。但通过磁盘服务锁就可以解决这一难以克服的问题,当故障节点将服务停止完成后,就会释放磁盘服务锁。其他节点就可以检测到,从而可以获知服务已停止成功。备份节点可以通过磁盘服务锁安全可靠地接管服务。在本实施例中,检测的时间常量S为两倍的服务停止超时时间,如果在一个时间常量S内心跳断开节点占用的磁盘服务锁仍然没有释放,可能存在两种情况,一是心跳断开的节点上的服务正常运行,二是该服务无法停止,服务不可转移。对于这两种情况,备份节点都不需要做出处理,并放弃接管服务。在本实施例中,如果通过步骤402在一个时间常量内心跳断开节点占用的磁盘服务锁已释放了,则其他备份节点可以进入步骤403进行抢锁,如图6和图7所示;如果一个时间常量内心跳断开节点占用的磁盘服务锁没有释放,则其他备份节点放弃接管服务,如图8所示。步骤403,在心跳断开节点死机或其占用的服务锁已释放的情况下,进行抢夺磁盘服务锁。在本实施例中,通过步骤401和步骤402判别允许抢夺磁盘服务锁,但只有唯一节点会抢夺服务锁成功,并且抢夺服务锁成功的节点才有启动该服务的权限。对于多节点,只有抢夺服务锁的机制才能保证只有一个节点能启动服务,防止裂脑。抢夺磁盘服务锁的机制包括:在加锁之前,各个节点都要按顺序去抢夺磁盘分区中的三个抢占点,如果抢占点I没有节点先占了,则继续抢夺抢占点2,抢占点3 ;如果抢占点I被占用了,则要休眠ls,再去抢夺抢占法2,抢占点2已被先占了,则抢夺失败;如果则前两个中成功抢夺一个或以上的才能抢夺抢占点3,抢夺抢占点2失败的同样需要休眠2s ;如果抢占点3已被占,则抢夺服务锁失败,至少三个抢占点中要获取两个才能胜出。胜出的节点才有权对磁盘服务锁进行加锁,并还原各个抢占点。通过多数抢夺,延时的优胜劣汰的算法成功地解决多节点共同竞争的问题。本实施例中,通过多次抢夺,延时的优胜劣汰的机制,决出唯一的胜出节点,胜出的节点才可以启动对应的服务,防止裂脑的发生。本实施例中,通过上述过程,在心跳网络中断的情况下,有效判别节点死机还是网络故障,避免将网络故障误判为节点死机,启动了服务而产生裂脑的风险;在上述过程中,当网络故障造成的心跳断开时,避免了在服务在停止过程中,但备份节点不去接管服务的问题;通过磁盘服务锁,也可以准备获知服务是否停止成功,从而防止一边仍在停止过程,一边已启动服务的问题;在启动服务之前通过上述中的抢夺服务锁的机制,有效避免多节点存在的共同竞争抢夺磁盘服务锁的问题,防止裂脑的发生。在本实施例中,对双机而言,服务A在节点I上运行,则认为节点I是服务A的工作节点,相应地,另外一个节点就是备份节点。如果两节点都有服务,则同一节点既是工作节点也是备份节点。对于多节点,服务所在节点为工作节点,相应地,服务域中其他的节点为备份节点。本发明实施例提供一种基于磁盘服务锁的裂脑预防的方法,在心跳网络中断的情况下,能够准确判别是节点死机还是网络故障,其他节点仍然能够准确获知服务是否已停止成功,避免裂脑产生的同时,也可以安全可靠地接管服务。本发明实施例提供的技术方案解决了目前在不需要将系统重启或共享存储隔离的情况下,在集群心跳网络中断时,难以克服和避免的裂脑问题。如图9所示,本发明实例二提供一种基于磁盘服务锁的裂脑预防的方法,包括:步骤901,在集群心跳网络中断时,通过网络都无法判别出节点的状态,但磁盘节点更新的信息,可以有效地判别出节点仍然在线。步骤901与步骤401功能类似,只是这里判别出了网络故障导致了心跳异常,在此不再一一赘述。本实施例中,通过步骤901判别心跳全部断开,但出节点仍然在线,则要进入步骤902.
步骤902,在一个时间常量S如果没有释放锁,可能存在两种情况,一是心跳断开的节点上的服务正常运行,二是该服务无法停止,服务不可转移。因此,备份节点认为服务仍然是正常的,并放弃接管服务,避免产生裂脑。本实施例中,通过步骤902在一个时间常量S如果没有释放锁,则可以放弃接管服务了。但为了增强集群的可高用性,在集群心跳全部断开的情况下,实际的环境中,有可能维护人员要经过一两天才能获知故障然后去维护,也有些没有告警的环境,因为业务能正常在运行,很可能不知道现场的集群已出现了异常。为了更好地解决在集群心跳网络中断的情况的问题,本实施例中还包括了步骤903.
步骤903,在心跳网络中断的情况下,各个节点仍然可以通过查询各个服务锁,而持续地监控各个服务的状态。本实施例中,通过步骤903可以查询到各个服务锁在心跳全部断开之后的服务的状态。当各个节点的心跳断开时,各个节点的服务仍然可能故障,需要其他可用的节点进行接管服务。通过步骤903可以接管能够正常停止故障服务的业务继续对外提供服务,事实上,这将实现了服务高可用性的最大化。在保证安全的并不影响其他业务的情况下,使得服务高可用最大化是一个集群系统最根本的原则。本实施例中,通过步骤903,进一步地解决了步骤402和步骤403中因为在一个时间常量S内释放了服务锁,并且由一个节点抢夺服务锁成功,并启动服务,但启动服务失败时,该服务将无法由其他节点接管的问题。因此,本实施例是对实施例一的功能进一步补充和完善。步骤904,通过三个抢占点最大程度地解决了多个节点同时加锁的问题,决出唯一胜出者获得启动服务的权限。本实施例中,步骤904与步骤403是类似的,但在这里,因为是在集群心跳全部断开后持续很长的时间,很可能要经过多次地服务倒换,由不同的节点进行接管,步骤904的抢夺服务锁机制为防止裂脑提供了很重要的保障。在此不再一一赘述了。在本实施例中,对双机而言,服务A在节点I上运行,则认为节点I是服务A的工作节点,相应地,另外一个节点就是备份节点。如果两节点都有服务,则同一节点既是工作节点也是备份节点。对于多节点,服务所在节点为工作节点,相应地,服务域中其他的节点为备份节点。本发明实施例提供一种基于磁盘服务锁的裂脑预防的方法,在心跳网络中断后,判别是网络故障后,各个节点仍然可以持续监控各个服务锁的状态,继续可以接管可以正常停止的故障业务对外提供服务,实现服务高可用性的最大化。本发明实施例提供的技术方案解决了目前在不需要将系统重启或共享存储隔离的情况下,在集群心跳网络中断后,仍然继续可以尽可能地接管故障节点的服务。如图10所示,本发明实例三提供一种基于磁盘服务锁的裂脑预防的装置,包括:节点状态检测判别模块1001,用于更新本节点的磁盘信息的同时,读取其他节点的信息并记录下来,作为判别节点状态的依据。本实施例中,节点状态检测判别模块1001首先通过读取系统信息自动生成一个永不会回卷的时间戳,并更新到磁盘中提供给其他节点读取;同时读取其他节点的在磁盘中的更新了的时间戳,并记录下来,作为判别节点状态的依据。根据各个节点的磁盘信息是定时去更新的并且时间戳是不会回卷的,因此,检测模块通过一个时间常量t各节点更新的时间戳的时间间隔就可以判别出各个节点的状态。本实施例中,值得注意的是为了不影响实际的业务正常的读写IO及增加系统的负担,上述的磁盘信息要求的数据量极少(为最小的磁盘IO读写单位:一个扇区),并且采用不带缓存的读写的技术,实现低时延。本装置是经过大量反复测试的,尤其在磁盘IO压力很大情况下,模拟满负荷的条件下,仍然保持稳定的读写更新磁盘信息。使得模块1001检测节点状态的准确度提供了保障。本实施例中,通过节点状态检测模块判别节点的状态,而现有的技术中在集群心跳网络中断后,可以通过业务公有网络判别节点的状态,如果能够PING到了 IP,则认为节点依然在线,不接管服务,但不确定服务的状态,是否处于停止的过程;如果不能PING到IP,则认为对方节点死机,就会尝试去启动服务,在实际应用环境中,有很多实例证明,这是不可靠,因为此时实际的网络很可能处于异常或堵塞的情况下,PING不到该节点也是很有可能的,这样直接产生了裂脑。节点状态检测模块就是可以解决了此问题,网络容易受到其他因素的影响,但对节点本身来说,读写磁盘依然是很正常的,不容易受到了干扰,就是有最坏的时间,到了干扰,节点状态检测模块在一个时间常量t,依然可以兼容和排除干扰,以避免不稳定的因素。本实施例中,通过节点状态检测模块判别节点的状态,可以准确地判别节点的状态,并且几乎不会增加和影响系统上运行的业务。当集群心跳网络中断时,通过模块1001判别如果是节点死机,则启动抢夺服务锁模块;如果判别只是网络故障,则启动磁盘服务锁检测模块。磁盘服务锁检测模块1002,用于检测服务是否已经加锁或释放,同时检测服务锁是否有效的。本实施例中,各个节点都是通过磁盘服务锁检测模块来判断对应的服务是否已被加锁,从而各个节点都可以获知各个服务分别在哪个节点上运行。节点在启动服务之前要先加锁,服务停止成功后再解锁,每一个服务均有一把服务锁,这样才保证一个服务只能在一个节点上运行,不管心跳好还是心跳全断了。本实施例中,值得注意的是本发明中的磁盘服务锁不会出现“死锁”,通常锁机制都会因为加锁的一方异常或死亡而无法解锁,而造成“死锁”,其他节点无法去加锁,进一步会导致服务无法接管。但本发明中磁盘服务锁引入了“有效期”,但判别加锁的节点死机,则对应地服务锁都将失效。其他节点就可以加锁,接管服务。本实施例中,根据模块1001判别出集群心跳网络断开了,但心跳断开的工作节点仍然在线,但这种情况下,而备份节点无法获知其服务状态,是否在停止服务。一个保守的策略就是不接管服务,但在这种情况下,事实告诉我们,工作节点的服务往往是异常了。这种的策略将影响了集群的高可用性,现有技术中因为无法解决该问题,只能通过将该节点的存储隔离或将其系统重启,以保证同时只有一个节点启动服务。但这里会带出了很多问题与风险,并不能满足市场的需求,在此不再一一赘述。本实施例中,通过模块1002,在一个时间常量S内如果能服务锁释放了,就可以安全地接管服务,启动抢夺服务锁模块。因为检测的时间常量S为两倍的服务停止超时时间,如果在一个时间常量S内心跳断开节点占用的磁盘服务锁仍然没有释放,可能存在两种情况,一是心跳断开的节点上的服务正常运行,二是该服务无法停止,服务不可转移。对于这两种情况,备份节点都不需要做出处理,并放弃接管服务。通过服务锁,节点可以获知工作节点的服务已停止成功,但无法停止。并且,这不需要将工作节点的存储隔离或将其系统重启,不影响系统上其他正常的服务或应用服务,当网络恢复正常时,又可以安全地加入到集群当中。抢夺服务锁模块1003,采用了多次抢夺,延时的优胜劣汰的机制,用于避免多个节点同时加锁启动服务而产生的裂脑问题。本实施例中,抢夺服务锁模块1003,包括了多次抢夺,抢夺失败者延时优胜劣汰的机制决出唯一的获胜者以及加锁和解锁三部分的实现。在多节点的环境中,心跳网络主要是通过局域网络进行通信的,当局域网的网络异常,就会将多节点集群划分多个集群,每集群都有节点尝试去启动服务,这时候就存在同时去抢夺服务锁的情况,为了避免同时抢夺的问题,本发明采用了多次抢夺,抢夺失败者延时优胜劣汰的机制,可以最大程度地避免此问题。本实施例中,通过抢夺机制,决出唯一的胜利者才能去加锁并且启动服务。而当服务停止成功,就相应去解锁。通过启动服务前去加锁,就可以通告其他节点,避免其他节点去尝试启动服务。通过停止服务完成后解锁,通告其他节点,可以让其他节点去接管服务。本发明服务锁的装置,就是使用最简单的设计,发挥最大的作用。进一步地,如图11所示,本发明实例三提供一种基于磁盘服务锁的裂脑预防的装置,还将包括:磁盘服务锁查询模块1103,用于提供对其他模块或进程进行查询,查询的内容包括节点的当前状态和服务锁的当前占用者等信息。在本实施例中,为了进一步地实现服务高可用的最大化,在心跳网络中断后,当工作节点的服务故障后仍然可以由其他备份节点接管。磁盘服务锁查询模块1103,提供了节点状态和服务锁的当然状态查询的接口,当心跳全部断开后,各个节点无法准确通过其他路径了解其他节点的服务状态。但通过查询磁盘服务锁的当前状态,就可以了解到各个节点上服务上的状态。显然的是,各个节点上的服务存在故障时,很多服务是可以停止成功的,但也存在有服务是停止不成功的。通过磁盘服务锁,却可以保障停止成功的服务可以由其他节点接管,不能停止的服务不会发生裂脑。在本实施例中,模块1103提供仅仅是查询接口,节点状态和服务锁的状态结果都是由磁盘服务锁检测模块1102去提供。所以,本装置具有很高统一性,各个模块相对独立,但每一个功能所调用的模块接口是一样的,保障什么时候都只有一份统一的数据,对于同一时候点,各个节点模块中的数据也是一致的。只有这样,才能使各个节点在行动上保持一致。在本实施例中,显然地,根据不同的需要,模块1103可以提供各种不同的查询接口,还可以不同的操作,如加锁或解锁等等的操作接口。在本实施例中,对双机而言,服务A在节点I上运行,则认为节点I是服务A的工作节点,相应地,另外一个节点就是备份节点。如果两节点都有服务,则同一节点既是工作节点也是备份节点。对于多节点,服务所在节点为工作节点,相应地,服务域中其他的节点为备份节点。本发明实施例提供一种基于磁盘服务锁的裂脑预防的装胃,在集群心跳网络中断的情况下,能够准备判别是节点机死机还是网络故障,如果心跳断开的节点死机,则可以抢夺服务锁,进而启动服务;如果心跳断开的节点是网络故障,则检测服务锁在一个时间常量S内是否释放,如果已释放,则可以抢夺服务锁,进而启动服务;如果没有释放,则放弃启动服务;通过查询功能,还可以接管再次出现故障的节点。本发明实施例提供一种基于磁盘服务锁的裂脑预防的装置,在心跳网络中断的情况下,能够准确判别是节点死机还是网络故障,其他节点仍然能够准确获知服务是否已停止成功,避免裂脑产生的同时,也可以安全可靠地接管服务。在心跳网络中断后,判别是网络故障后,各个节点仍然可以持续监控各个服务锁的状态,继续可以接管可以正常停止的故障业务对外提供服务,实现服务高可用性的最大化。本发明实施例提供的技术方案解决了目前在不需要将系统重启或共享存储隔离的情况下,在集群心跳网络中断后,仍然继续可以尽可能地接管故障节点的服务。本发明实施例提供一种基于磁盘服务锁的裂脑预防的方法和装置,都可以直接应用在高可用性的集群中。结合本文所公开的实施描述的方法或算法步骤可以直接应用于硬件、处理器执行的软件模块,或者二者综合来实施。以上所述,仅为本发明的具体实施方式
,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
权利要求
1.一种基于磁盘服务锁的裂脑预防的方法,其特征在于,包括: 在心跳网络中断时,备份节点通过磁盘服务锁的工作节点更新的时间戳判别工作节点是死机还是因网络故障而导致心跳断开; 所述工作节点是因网络故障而导致心跳断开时,所述的备份节点检测在一个时间常量S内工作节点占用的服务锁是否已释放; 所述工作节点占用的服务已释放,所述的备份节点可以进行抢夺磁盘服务锁,获胜者将启动对应的服务。
2.根据权利要求1所述的一种基于磁盘服务锁的裂脑预防的方法,其特征在于,还包括: 在心跳网络中断时,所述的备份节点通过磁盘服务锁判别所述的工作节点是否死机;所述的工作节点已死机,所述的备份节点可以进行抢夺磁盘服务锁,获胜者进行加锁并启动对应的服务。
3.根据权利要求1所述一种基于磁盘服务锁的裂脑预防的方法,其特征在于,还包括: 在心跳网络中断时,所述的备份节点通过磁盘服务锁判别所述的工作节点是否死机; 所述的工作节点没有死机,是因为网络故障而导致的心跳断开,所述的备份节点检测在一个时间常量S内工作节点占用的服务锁已释放,所述的备份节点可以进行抢夺磁盘服务锁,获胜者将启动对应的服务。
4.根据权利要求3所述的一种基于磁盘服务锁的裂脑预防的方法,其特征在于,还包 括: 所述的工作节点没有死机,是因为网络故障而导致的心跳网络断开,所述的备份节点检测在一个时间常量S内工作节点占用的服务锁没有释放,所述的备份节点放弃启动对应的服务。
5.根据权利要求4所述的一种基于磁盘服务锁的裂脑预防的方法,其特征在于,还包括: 所述的备份节点放弃启动对应的服务后,还可以继续提供查询检测该服务的磁盘服务锁是否因故障而停止成功,并释放锁的,所述的备份节点仍然可以加锁启动服务。
6.根据权利要求2和5所述的一种基于磁盘服务锁的裂脑预防的方法,其特征在于,还包括: 所述的备份节点成功接管对应的服务后,成为工作节点,当工作节点因故障而停止成功后,所述的其他备份节点仍然可以加锁启动服务。
7.根据权利要求3和5所述的一种基于磁盘服务锁的裂脑预防的方法,其特征在于,还包括: 所述的备份节点成功接管对应的服务后,成为工作节点,当工作节点因故障而停止成功后,通过查询磁盘服务锁的状态,所述的其他备份节点仍然可以加锁启动服务,直到最后一个备份节点故障而停止服务。
8.根据权利要求5所述的一种基于磁盘服务锁的裂脑预防的方法,其特征在于,所述的查询接口,包括: 查询节点的当前状态,包括节点距离节点死机的大致时间; 查询磁盘服务锁的当前状态,包括每个节点上的服务及每个服务所在节点。
9.根据权利要求1所述的一种基于磁盘服务锁的裂脑预防的方法,其特征在于,抢夺磁盘服务锁,包括: 加锁前,先按顺序抢夺三个抢占点; 每一个抢占点只能一个抢夺成功的,抢夺成功的,继续抢夺其他的,不成功将延时; 至少获取二个或以上的为获胜者,并且是唯一。
10.一种基于磁盘服务锁的裂脑预防的装置,其特征在于,包括: 节点状态检测判别模块,用于更新本节点的磁盘信息的同时,读取其他节点的信息并记录下来,作为判别节点状态的依据; 磁盘服务锁检测模块,用于检测服务是否已经加锁或释放,同时检测服务锁是否有效的; 抢夺服务锁模块,采用了多次抢夺,延时的优胜劣汰的机制,用于加锁和解锁,解决多个节点同时抢夺的问题。
磁盘服务锁查询模块,用于提供查询的内容包括节点的当前状态和服务锁的当前占用者等信息的接口。
11.根据权利要求10所述的一种基于磁盘服务锁的裂脑预防的装置,其特征在于,节点状态检测判别模块,还包括: 用于更新本节点的磁盘信息的同时,读取其他节点的信息并记录下来,作为判别节点状态的依据; 各个节点根据系统的配置生成一个永不`会回卷的时间戳更新到磁盘,并由其他节点读取,不直接传递集群的信息,但也可以拓展传递集群指令; 节点在一个时间常量t内没有更新对应的时间戳,则认为此节点死机。
12.根据权利要求10所述的一种基于磁盘服务锁的裂脑预防的装置,其特征在于,磁盘服务锁检测模块,还包括: 用于检测服务是否已经加锁或释放,同时检测服务锁是否有效的; 服务启动前必须加锁成功,服务成功停止完成才能解锁; 服务锁是有有效期的,只要占用服务锁的节点死机,则该服务锁失效,不存在死锁的情况。
13.根据权利要求10所述的一种基于磁盘服务锁的裂脑预防的装置,其特征在于,抢夺服务锁模块,还包括: 采用了多次抢夺,延时的优胜劣汰的机制,用于加锁和解锁,解决多个节点同时抢夺的问题; 加锁前,至少抢夺两个或以上的抢占点,才能加锁。
14.根据权利要求10所述的一种基于磁盘服务锁的裂脑预防的装置,其特征在于,还包括: 在心跳全部断开时,通过检测所述工作节点在一个时间常量t内无时间戳更新则判别死机,则调用抢夺服务锁模块,加锁成功后启动服务。
15.根据权利要求10所述的一种基于磁盘服务锁的裂脑预防的装置,其特征在于,还包括: 在心跳全部断开时,通过检测所述工作节点在一个时间常量t内时间戳更新正常,而磁盘服务锁检测模块在一个时间常量S内检测服务锁已释放,则调用抢夺服务锁模块,力口锁成功后启动服务。
16.根据权利要求10所述的一种基于磁盘服务锁的裂脑预防的装置,其特征在于,还包括: 在心跳全部断开时,通过检测工作节点在一个时间常量t内时间戳更新正常,而磁盘服务锁检测模块在一个时间常量S内检测服务锁尚且没有释放,则放弃启动服务。
17.根据权利要求10所述的一种基于磁盘服务锁的裂脑预防的装置,其特征在于,还包括: 在心跳全部断开一个时间常量S后,通过磁盘服务锁查询模块提供的查询功能,可以持续监控各个节点和服务锁的状态,在节点死机或因故障而成功停止解锁的,所述的其他备份节点可以调用抢夺磁盘服务锁模块进行加锁,并接管服务,直到最后一个备份节点故障而 服务停止。
全文摘要
本发明公开一种基于磁盘服务锁的裂脑预防的方法和装置,属于计算机集群技术领域,适用于高可用性集群。为解决在集群心跳网络中断时,无法准确判别其他节点及其运行服务的状态,而出现无法接管服务或难以避免裂脑的问题,尤其是不使用将系统重启或存储隔离的技术的情况下。本发明实施例提供的技术方案包括在心跳网络中断时,有效判别是心跳网络故障还是节点死机的情况;通过查询磁盘服务锁能够正确获取服务是否已停止成功,从而避免了存在的短暂裂脑问题;在多个节点同时抢夺服务锁,只有唯一抢夺成功的节点才可以启动服务,防止裂脑发生。
文档编号H04L12/24GK103209095SQ201310081528
公开日2013年7月17日 申请日期2013年3月13日 优先权日2013年3月13日
发明者莫庆良, 蔡强, 董春青, 袁泉 申请人:广东新支点技术服务有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1