分布式系统中主节点的选取方法、装置、系统及存储介质
技术领域
本发明涉及计算机通信领域,尤其涉及一种分布式系统中主节点的选取方法、装置、系统及存储介质。
背景技术
随着技术的发展以及业务用户量的剧增,在互联网应用的服务端往往会部署分布式集群系统。在分布式集群(或分布式集群中的部分节点群)中创建有节点,通常有一个或多个节点作为指挥中心执行任务或者响应客户端的请求(该类节点可称为主节点),而其他节点(该类节点可以称为从结点)用作缓存及容灾等。这种主从节点模式,在分布式集群系统中得到非常广泛的应用。要采取主从节点模式,需要从众多节点中选择(选举)出主节点,在主节点选定后,其它节点即为从节点。
而在分布式集群中进行主节点的选取,一般是在构建节点后第一次选取主节点、当前主节点出现故障或者网络出现异常问题时进行的,主要过程为:
1)主结点检测和识别出自身网络异常,然后切换身份为从节点,停止主节点的功能。
2)分布式集群需要根据主结点的故障重新进行仲裁和主节点的选取,并在从节点集群中选择出一个新的主节点。
在现有技术方案中,大部分分布式集群中的部分节点群在出现上述情况后,主节点的创建和选取是在GOLAND编程语言环境下,通过远程过程调用协议(grpc)与分布式一致性K-V存储系统(etcd)服务器集群之间的交互进行的,而节点通过这种技术与etcd服务器集群交互往往是通过同步并发的模式实现的,在GOLAND编程语言环境中多线程的运行可以得到很好的应用。
但是,还有很多分布式集群的主节点的创建和选取是通过异步并发框架的模式实现的,包括C++编程语言的环境下。在这种模式下,进行远程过程调用协议(grpc)交互选取主节点时,由于通过远程过程调用协议(grpc)交互是通过同步并发的模式实现的。因此,在执行其他任务时,想要执行主节点的选取任务时就需要专门创建线程处理任务队列,这样会造成线程资源及线程交互的消耗,进而存在一定程度的性能损耗。
发明内容
为了解决以上技术问题,本发明的主要目的在于提供一种分布式系统中主节点的选取方法、装置、系统及存储介质,以解决现有技术中在异步并发框架的线程中进行远程过程调用协议(grpc)交互,需要专门创建线程处理任务队列,从而造成线程资源及线程交互的消耗,以及性能损耗的问题。
本发明的技术方案是通过以下方式实现的:
一种分布式系统中主节点的选取方法,包括:
在异步并发框架的线程中,节点通过传输协议的异步实现方式与存储服务器集群建立通信连接;
所述节点在当所述异步并发框架的线程监听到所述通信连接正常时,向所述存储服务器集群发起竞选主节点的请求;
所述节点接收所述存储服务器集群在获取所述请求后向所述节点返回的响应报文,以便完成主节点的选取。
优选地,在所述节点向所述存储服务器集群发起竞选主节点的请求步骤之后,进一步包括:
所述存储服务器集群对所述节点向所述存储服务器集群发起竞选主节点的请求进行解析,以便完成主节点的选取。
优选地,所述节点接收所述存储服务器集群在获取所述请求后向所述节点返回的响应报文步骤之后,进一步包括:
所述节点对接收的响应报文进行解析,以便得知主节点的选取结果。
优选地,所述主节点的选取的步骤具体为:每个所述节点执行选主定时任务,以实现主节点的选取。
优选地,所述选主定时任务具体包括:
选主定时任务一:建立所述节点与所述存储服务器集群之间的第一通信连接,定时检测所述节点与所述存储服务器集群之间的第一通信连接是否异常;当连接异常时,重新连接;当连接正常时,向所述存储服务器集群定时发起节点保活契约,使所述节点为保活状态;
选主定时任务二:在所述节点为存活状态时,建立所述节点与所述存储服务器集群之间的第二通信连接,定时检测所述节点与所述存储服务器集群之间的第二通信连接是否异常;当连接异常时,重新连接;当连接正常时,向所述存储服务器集群发起参加竞选主节点。
优选地,所述选主定时任务一中向所述存储服务器集群定时发起节点保活契约,以使所述节点为保活状态的步骤具体为:
判断是否为首次发起节点保活契约或者所述节点当前保活契约中的时效值是否超时,若是,则重新发起契约,得到新的契约ID,定时发起节点保活契约,使所述节点处于保活状态;否则所述节点一直处于保活状态。
优选地,所述选主定时任务还包括:
选主定时任务三,建立节点与存储服务器集群之间的第三通信连接,定时检测所述节点与所述存储服务器集群之间的第三通信连接是否异常;当连接异常时,重新连接;当连接正常时,向所述存储服务器集群发起观察竞选,观察竞选结果的变化,
当竞选结果无变化时,返回竞选值至所述节点;
当竞选结果发生变化时,获取变化后的竞选值并与所述节点自身的竞选值相比较,若相同,则所述节点即为新的主节点,若不同,则为从节点。
优选地,所述传输协议为TCP传输协议。
优选地,所述通信连接具体为超文本传输协议通信连接。
一种分布式系统中主节点的选取装置,包括主节点选取模块,用于完成主节点的选取,所述主节点选取模块具体包括:
通信子模块,用于在异步并发框架的线程中,节点通过传输协议的异步实现方式与存储服务器集群建立通信连接;
监听子模块,用于监听所述通信连接是否为正常连接状态;
发起请求子模块,用于当所述异步并发框架的线程监听所述通信连接为正常状态时,所述节点向所述存储服务器集群发起竞选主节点的请求;
响应报文接收子模块,用于所述节点接收所述存储服务器集群在获取所述请求后向所述节点返回的响应报文,以便完成主节点的选取。
一种分布式系统中主节点的选取系统,包括:
存储器,用于存储程序指令;
处理器,用于执行所述程序指令,以实现上述主节点的选取方法。
一种存储介质,所述存储介质存储有可读指令,所述可读指令可被处理器执行时实现上述主节点的选取方法。
相比于现有技术,本发明分布式系统中主节点的选取方法、装置、系统及存储介质至少具有以下有益效果:
1)基于TCP传输协议实现了在异步并发框架的线程中进行选主逻辑交互,异步并发框架的线程监听节点与存储服务器集群之间的通信连接所通过的TCP传输协议是否有数据传输。当有数据传输时,在所述异步并发框架的线程的线程中进行主节点的选取。在异步并发框架中,节点通过TCP传输协议的异步实现方式与存储服务器etcd通信时,节点可以进行异步处理工作,在一个任务没有完成时,还可以执行其他任务,无需等待当前任务完成,所以不需要增加新的线程的情况,不会造成线程资源的浪费以及性能的损耗。
2)通过存储服务器集群及节点进行多机房分布式的部署,可以在部分网络异常的情况下,保证集群网络依旧能正常运行,具有较强的可靠性。
附图说明
为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种分布式系统中主节点的选取方法的流程示意图;
图2为本发明实施例提供的一种分布式系统的网络框架示意图;
图3为本发明实施例提供的一种主节点选取过程中,节点保持竞选状态和参加竞选的流程示意图;
图4为本发明实施例提供的一种节点观察竞选的流程示意图;
图5为本发明实施例提供的一种分布式集群系统中主节点的选取装置的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本说明书实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
结合附图对本发明进行进一步说明。
在进行分布式系统中主节点的选取之前,需要部署存储服务器集群系统。该存储服务器集群系统可以是多机房分布式部署形式,当在一个或者几个存储服务器出现问题后,其他没有出现问题的存储服务器可以继续工作,不影响整个系统的正常运行,具有较强的可靠性。
进一步地,该存储服务器集群系统可以为分布式一致性K-V存储系统(etcd服务器集群系统),即键值储仓库,用于配置共享和服务发现。
在将分布式存储服务器集群系统部署完之后,还可以包括:配置分布式存储服务器集群系统中各存储服务器之间数据同步的方式,当启动etcd服务器集群系统中的一个etcd服务器之后,其他etcd服务器与其进行数据的同步,etcd服务器集群系统中的每个etcd服务器本身具有存储功能。
在将存储服务器集群系统部署完成之后,还包括:通过异步并发框架的线程创建节点。该步骤可以通过编程语言在异步并发框架的线程中创建若干个节点,创建的若干节点组成分布式集群或者分布式集群中的部分节点群。该步骤中所用到的编程语言可以是C++语言,也可以是其他能够实现同样功能的编程语言。
如图1所示,该图说明节点的创建已经完成、etcd服务器集群系统的部署已经完成,两者可以建立通信连接然后可以进行主节点的选取。节点在选取主节点的过程中存在一个节点竞选值,通过该节点竞选值进行主节点的竞选,具体的通信和竞选过程请参考后续步骤。例如,节点1存在一个节点竞选值,在竞选过程中通过该节点竞选值进行竞选,同理节点2、节点3亦是如此。
如图2所示,为发明实施例提供的一种分布式系统中主节点的选取方法的流程示意图,该方法主要包括以下步骤:
步骤S10:在异步并发框架的线程的主线程中,节点通过传输协议与存储服务器集群进行通信连接。其中,传输协议优选为TCP传输协议,当然还可以是其他传输协议。
在本实施例中,实现后的各节点在异步并发框架的线程下通过TCP传输协议的异步实现方式与etcd服务器集群系统进行通信,该通信具体为超文本传输协议HTTP通信,当然该通信还可以是其他能够实现同样功能的TCP传输协议通信中的一种。
步骤S20:节点在异步并发框架的线程监听到通信连接正常时,向存储服务器集群发起竞选主节点的请求。异步并发框架的线程监听所述TCP传输协议通信是否有数据传输,etcd服务器集群系统与各节点之间的传输数据至少包括竞选请求、节点的竞选值等。
在异步并发框架的线程中,节点通过TCP传输协议的异步实现方式与存储服务器集群etcd建立的连接之间会有一个套间字Socket,同时也有对应的文件描述符fd,异步并发框架的线程可以监听这个文件描述符fd(当然也可以同时监听多个文件描述符)。
节点通过TCP传输协议的异步实现方式与etcd服务器集群系统进行超文本传输协议通信的通信过程就是节点和etcd服务器集群系统之间所建立起来的一种连接。查看连接过程是否实现,节点可以找到和打开Socket这个虚拟文件,这个文件的建立意味着通信连接过程这一步骤已经成功建立。发送请求过程就是节点运用Socket这个文件向etcd服务器集群系统提出各种请求。请求的具体过程就是运用HTTP协议把在请求过程中所提出来的请求传输到etcd服务器集群系统,进而实施任务处理(选取主节点的步骤)。
具体地,各节点在C++编程语言环境的异步并发框架的线程中,通过TCP传输协议的异步实现方式与etcd服务器集群系统进行超文本传输协议通信,通信内容主要包括超文本传输协议HTTP报文,当然还可以包括其他信息。当通信连接正常时,节点向存储服务器集群发起竞选主节点的请求,生成对应的超文本传输协议HTTP报文,然后发送至etcd服务器集群系统。etcd服务器集群系统接收到节点发送的超文本传输协议HTTP报文后,对接收的超文本传输协议HTTP报文进行解析,然后再对解析后的内容进行处理,选出主节点。
步骤S30:在选出主节点之后,etcd服务器集群系统将带有新的主节点的信息,重新生成新的HTTP响应报文,通过TCP传输协议的异步实现方式发送至节点。节点接收etcd服务器集群系统返回的响应报文,以便完成主节点的选取。
节点对存储服务器集群返回的超文本传输协议HTTP报文内容进行解析,解析出新的主节点的竞选值,从而得知主节点的选取结果。上述通信在异步并发框架的线程中进行的。
在节点向存储服务器集群发起竞选主节点的请求所对应的超文本传输协议过程中有传输数据的时候,异步并发框架的线程就会进行数据的发送和接收处理,存储服务器集群接收请求后向节点返回所述请求对应的响应,即主节点的选取过程,同时还可以处理其他任务。
在本申请的技术方案中,上述步骤在异步并发框架的线程的线程中进行,节点可以进行异步处理工作,在一个任务没有完成时,还可以执行其他任务,无需等待当前任务完成,所以不需要增加新的线程的情况,不会造成线程资源的浪费以及性能的损耗。
进一步地,在处理其他任务时,想要再处理选取主节点的任务就不需要建立线程,可以在其他任务没有完成时,处理主节点的选取的任务。当然,也可以在当主节点的选取的任务完成后,再处理之前没有完成的任务。
异步并发框架的线程在各节点实现了与存储服务器的超文本传输协议的连接后,异步并发框架的线程监听到节点与存储服务器集群之间的TCP传输协议通信连接有数据传输时(竞选主节点的请求),即在进行主节点的选取过程。主节点选取的步骤具体为:每个所述节点执行三个选主定时任务,向存储服务器集群发送主节点的竞选请求,以实现主节点的选取;然后,存储服务器集群向节点返回主节点的选取的结果,节点得知哪个节点竞选为新的主节点。
图3为本发明实施例提供的一种主节点选取过程中执行的三个选主定时任务中的两个,即节点的保活和参加竞选的流程示意图,其中:
通过异步并发框架构建节点后,第一次选取主节点是通过下述方法竞选主节点的,同样,在第一次选取主节点之后,第一次选取的主节点发生变化后,再次选取主节点(包括以后每次主节点发送变化后进行主节点的选取)的过程也是通过以下方法进行的。
每个节点中包括至少一个进程,一个进程中至少包括是三个定时器,进程能够监听三个定时器,该实施例中包括第一定时器、第二定时器和第三定时器。下面依次介绍:
(1)选主定时任务一:
建立所述节点与存储服务器集群之间的第一通信连接,第一定时器在到达定时时间时,先定时检测节点与存储服务器集群之间的超文本传输协议通信连接是否异常。当连接异常时,重新连接,一直到连接正常为止。当连接正常后,节点通过第一定时器再定时向所述存储服务器集群发起节点保活契约的动作,以便保持节点处于保活状态。
其中,发起契约还用于生成契约ID,在获取契约ID之后,便可以参加主节点的竞选,契约ID跟节点参与竞选的竞选值关联;发起契约中含有契约的时效值TTL,赋予该节点当前契约ID竞选的时效性。保活契约中的参数含有契约ID,在契约时效之内完成保活契约,如果发起保活契约的时间超过保活契约的时效值时,保活契约的返回值将为空。参加竞选的参数中包括节点自身的竞选值和契约ID。第一定时器的定时执行时间间隔与检测通信连接是否正常的时间之和小于契约的时效值,否则不能一直对节点进行保活;定时器的定时执行时间间隔和契约的时效值为预设好的值,在一个程序执行过程中,一般不会发生变化。
参考图3的a部分,节点保活状态的流程示意图,节点与存储服务器集群之间的超文本传输协议通信连接正常时,即节点通过传输协议的异步实现方式建立与etcd服务器集群系统之间的第一TCP传输协议通信连接(具体可以是第一超文本传输协议HTTP连接)后,该连接正常通信。连接成功后,节点根据发起契约的契约ID和保活契约的时效值向所述存储服务器集群发起保活契约,证明节点当前的契约ID为存活状态,保证节点处于保活状态。
在节点与etcd服务器集群系统之间的第一TCP传输协议通信连接(具体可以是第一超文本传输协议HTTP连接)正常的情况下,节点向etcd服务器集群系统发起保活契约请求,etcd服务器集群系统接收该请求之后进行解析,根据解析内容发出保活契约响应,契约响应判断发起保活契约的动作的时间间隔是否在契约的时效值之内进行。若是,则契约响应输出的结果为契约的时效值为有效值,说明该节点当前契约ID处于保活状态,将契约响应输出的结果发送给节点,节点接收该结果然后进行解析,得知节点当前契约ID为保活状态,该节点当前的契约ID可以随时被获取。该节点下次发起保活,仍然会根据此契约响应输出结果输出的契约时效值并携带发起契约产生的契约ID进行发起保活该节点的保活契约。只要在契约的时效值之内再次发起保活契约就可以在上次契约时效值之内再次增加一次节点当前契约ID的时效值,以保活该节点的当前契约ID。节点契约ID与节点自身的竞选值是关联的。该过程是一个无限循环的过程,直至程序停止,节点通过第一定时器定时不停的在执行上述保活契约的步骤,以保障节点的契约ID为存活的,可以随时参加竞选。同时,也证明节点与etcd服务器集群系统之间通过TCP传输协议的异步实现方式建立的连接(具体可以是超文本传输协议HTTP连接)为正常连接,以便进发起参加竞选的动作。
进一步地,当首次发起节点保活契约时,因为首次发送保活契约时没有之前发起契约的契约ID,这种情况下认为发起保活契约没有在契约的时效值之内进行,契约响应的输出结果为契约的时效值为空。所以需要重新发起契约生成新的契约ID,得到新的契约ID后根据新的契约ID向所述存储服务器集群发起节点的保活契约,使节点保持竞选状态。
若契约响应判断发起保活契约的动作没有在契约的时效值之内进行,则契约响应输出的结果为契约时效值为空,需要重新发起契约的动作,以生成新的契约ID,根据生成的新的契约ID重新发起保活契约的动作。这种情况是节点与存储服务器集群之间的第一超文本传输协议通信连接异常时发生的,第一定时器在规定的执行时间间隔内无法向所述存储服务器集群发起保活契约的动作。等节点与存储服务器集群之间的第一超文本传输协议通信连接正常后,前一次向所述存储服务器集群发起的保活契约的动作的时间已经超过契约的时效值,契约响应判断契约时效值超时,输出结果为契约时效值为空,该契约ID无效。因为节点的当前契约ID与节点的自身竞选值是关联的,所以该节点的自身竞选值被etcd服务器集群系统删除,该节点当前的契约ID从此不再参与主节点的选取。等节点与存储服务器集群之间的超文本传输协议通信连接正常后,再次发起契约,节点生成新的契约ID,重新执行节点与存储服务器集群之间的第一超文本传输协议通信连接正常后所执行的步骤。
(2)选主定时任务二:
参考图3的b部分,当节点处于保活状态时,即节点当前的契约ID的保活契约在契约时效值之内发起时,节点就一直处于保活状态,节点当前的契约ID一直为有效契约ID,随时可以被获取。节点通过第二定时器先定时检测是否成功获取节点当前处于保活状态下的契约ID,以便得知获取的契约ID是否发生变化。当成功获取节点当前处于保活状态下的契约ID后,节点通过传输协议的异步实现方式建立与etcd服务器集群系统之间的第二TCP传输协议通信连接(具体可以是第二超文本传输协议HTTP连接),第二定时器再定时检测节点与存储服务器集群之间的第二通信连接是否异常。连接正常的情况下,向所述存储服务器集群发起参加竞选的动作后,该节点参加主节点的竞选。具体地,节点向所述存储服务器集群发送超文本传输协议报文,告知etcd服务器集群系统该节点要参加竞选。这样该节点自身参加竞选的竞选值会被存储至etcd服务器集群系统中,在当前主节点有变换时,etcd服务器集群系统按照一定的规定和方法选择所有参加竞选的节点中的一个节点所对应的自身竞选值,作为新的主节点的竞选值,供参加竞选的节点竞选。该规定和方法可以是提前预设的。
当不能成功获取节点处于保活状态下的契约ID时,继续获取,直到成功获取节点处于保活状态下的契约ID为止。
同样,当节点与etcd服务器集群系统之间的第二TCP传输协议连接(具体可以是第二超文本传输协议HTTP连接)不成功时,继续连接,直到连接成功为止,该连接需要第二定时器定时检测。此时,节点不能参加竞选,但是可以观察其他节点竞选并通过观察竞选得值竞选结果。
另外,当重新发起契约生成新的契约ID后,成功获取节点新的契约ID后,需要强行断开上一次建立的节点与etcd服务器集群系统之间的第二TCP传输协议(具体可以是第二超文本传输协议HTTP连接),节点重新通过传输协议的异步实现方式建立与etcd服务器集群系统之间的第二TCP传输协议通信连接(具体可以是第二超文本传输协议HTTP连接),然后再向所述存储服务器集群发起参加竞选的动作。每次获取节点新的契约ID后均执行该步骤。
(3)选主定时任务三:
图4为本发明实施例提供的一种节点观察竞选的流程示意图,即为选主定时任务三的流程示意图,节点通过第三定时器以传输协议的异步实现方式定时建立与etcd服务器集群系统之间的第三TCP传输协议通信连接(具体可以是第三超文本传输协议HTTP连接)。定时检测所述节点与所述存储服务器集群之间的第三通信连接是否异常;当连接异常时,重新连接,直到连接成功为止。连接成功后,节点向所述存储服务器集群发起观察竞选请求,存储服务器集群接收改请求后进行解析,该步骤主要观察主节点的变化情况。当主节点的竞选值有变化时,观察新的主节点的竞选值,然后将新的主节点的竞选值生成报文通过第三超文本传输协议HTTP连接返回至各节点,节点对接收的报文进行解析,从而得知新的主节点。观察竞选的动作一直在进行,不管是不是所有的节点参加竞选,只要有节点参加竞选即可。当节点不参加竞选时,待竞选完成后,即新的主节点选取完成后,将新的主节点的自身竞选值返回至节点,节点得知新的主节点的竞选值,从而得知新的主节点。当节点参加竞选时,观察竞选的动作同样在进行,不管参加竞选的节点是否竞选为新的主节点,都将新的主节点的竞选值返回至参加竞选的节点,各节点得知新的主节点的竞选值从而得知新的主节点。
主节点的变化情况进一步为:原主节点不再作为主节点,etcd服务器集群系统从参加竞选的从节点中选择一个节点所对应的竞选值,各个从节点的竞选值与etcd服务器集群系统从参加竞选的从节点中选择的一个节点所对应的竞选值相比较。自身竞选值与etcd服务器集群系统从参加竞选的从节点中选择的一个节点所对应的竞选值相同的节点即为新的主节点,其他的节点即为从节点。该步骤即为主节点的具体选取过程。
值得说明的是,每个节点都执行上述三个任务,上述三个任务每个节点可以同时执行、嵌套执行的,相互之间可能互为前提或触发条件。三个任务中的节点通过传输协议的异步实现方式与etcd服务器集群系统建立的TCP传输协议通信连接,然后进行超文本传输协议HTTP连接是三种不同的通信连接。
本技术方案能满足分布式集群中部分节点需要进行主从结点的选择,当服务器网络异常时可以进行主从切换的需求。
如图5所示,本发明还提供了一种分布式系统中主节点的选取装置包括:
部署模块1,用于部署分布式存储服务器集群系统。该分布式存储服务器集群为多机房分布式部署形式,当在一个或者几个存储服务器出现问题后,其他没有出现问题的存储服务器还可以继续工作,不影响整个系统的正常运行。
进一步地,该存储服务器集群为分布式一致性K-V存储系统(etcd服务器),即键值存储仓库,用于配置共享和服务发现。
在将分布式存储服务器集群系统部署完之后,还包括:配置分布式存储服务器集群系统中各存储服务器之间数据同步的方式,当启动其中一个etcd服务器之后,其他服务器与其进行数据的同步,etcd服务器本身具有存储功能。该步骤可以是部署模块1实现的。
节点创建模块2,用于在异步并发框架的线程中创建节点。通过编程语言在异步并发框架的线程中实现若干个节点。该步骤中所用到的编程语言可以是C++语言,也可以是其他能够实现同样功能的编程语言。
主节点选取模块3,用于完成主节点的选取。主节点选取模块3具体包括:
通信子模块301、监听子模块302、发起请求子模块303和响应报文接收子模块304。
其中,通信子模块301,用于在异步并发框架的线程中,节点通过TCP传输协议的异步实现方式与etcd存储服务器集群建立通信连接。
所述在异步并发框架的线程中实现各节点与存储服务器集群的通信具体为:
在异步并发框架的线程中,各节点通过TCP传输协议的异步实现方式与etcd服务器集群系统进行通信,该通信具体为超文本传输协议HTTP通信,当然该通信还可以是其他能够实现同样功能的传输协议通信。
监听子模块302,用于监听通信连接是否为正常连接状态。所述异步并发框架的线程通过所述监听子模块302监听各节点通过TCP传输协议的异步实现方式与存储服务器集群进行的通信连接的连接状况。
发起请求子模块303,用于当所述异步并发框架的线程监听所述通信连接为正常状态时,所述节点向所述存储服务器集群发起竞选主节点的请求。
etcd服务器集群系统中设置有第一解析单元(图中未示),用于对节点向存储服务器集群发起竞选主节点的请求进行解析,以便完成主节点的选取。
具体地,各节点在C++编程语言环境的异步并发框架的线程中,通过TCP传输协议的异步实现方式与etcd服务器集群系统进行超文本传输协议通信,通信内容主要包括超文本传输协议HTTP报文,当然还可以包括其他信息。当通信连接正常时,节点向存储服务器集群发起竞选主节点的请求,生成对应的超文本传输协议HTTP报文,然后发送至etcd服务器集群系统。etcd服务器集群系统接收到节点发送的超文本传输协议HTTP报文后,对接收的超文本传输协议HTTP报文进行解析,然后再对解析后的内容进行处理,选出主节点。etcd服务器集群系统将带有新的主节点的信息,重新生成新的HTTP报文,通过TCP传输协议发送至节点,节点对存储服务器集群返回的超文本传输协议HTTP报文内容进行解析,解析出新的主节点的竞选值,从而得知主节点的选取结果。上述通信在异步并发框架的线程的异步并发框架的线程中进行的。
进一步地,在异步并发框架的线程中,节点通过TCP传输协议的异步实现方式与存储服务器集群etcd建立的连接之间会有一个套间字Socket,同时也有对应的文件描述符fd,异步并发框架的线程可以监听这个文件描述符fd(当然也可以同时监听多个文件描述符)。在节点向存储服务器集群发起竞选主节点的请求所对应的超文本传输协议过程中有传输数据的时候,异步并发框架的线程就会在异步并发框架的线程的主线程中进行数据的发送和接收处理,存储服务器集群接收请求后向节点返回所述请求对应的响应报文,也就是主节点的选取,同时还可以处理其他任务。
在本申请的技术方案中,所有的步骤都是在异步并发框架的线程的线程中进行的,在主节点的选取过程中不需要建立专门的线程处理任务,更不会造成线程资源的浪费以及性能的损耗。
所述发起请求子模块303包括第一选主定时任务单元3031、第二选主定时任务单元3032和第三选主定时任务单元3033。
其中:
第一选主定时任务单元3031,用于建立节点与存储服务器集群之间的第一通信连接,定时检测节点与存储服务器集群之间的超文本传输协议通信连接是否异常。当连接异常时,重新连接,一直到连接正常为止。当连接正常后,节点通过第一定时器(图中未示)定时向所述存储服务器集群发起节点保活契约的动作,以便保持节点处于保活状态。
其中,发起契约还用于生成契约ID,只有在获取契约ID之后才能参加主节点的竞选,契约ID跟节点参与竞选的竞选值关联;发起契约中含有契约的时效值TTL,赋予该节点当前契约ID竞选的时效性。保活契约中的参数含有契约ID,在契约时效之内完成保活契约,如果发起保活契约的时间超过保活契约的时效值时,保活契约的返回值将为空。参加竞选的参数中包括节点自身的竞选值和契约ID。第一定时器的定时执行时间间隔小于契约的时效值,否则不能一直对节点进行保活;定时器的定时执行时间间隔和契约的时效值为预设好的值,在一个程序执行过程中不会变化。
参考图3的a部分,节点保活状态的流程示意图,节点与存储服务器集群之间的超文本传输协议通信连接正常时,即节点通过传输协议的异步实现方式建立与etcd服务器集群系统之间的第一TCP传输协议(具体可以是第一超文本传输协议HTTP连接),该连接正常通信。连接成功后节点根据发起契约的契约ID和保活契约的时效值向所述存储服务器集群发起保活契约,证明节点当前的契约ID为存活状态,保证节点处于保活状态。
发起保活契约之后会有保活契约响应,在节点与etcd服务器集群系统之间的第一TCP传输协议(具体可以是第一超文本传输协议HTTP连接)正常的情况下,契约响应判断发起保活契约的动作的时间间隔是否在契约的时效值之内进行,若是,则契约响应输出的结果为契约的时效值为有效值,说明该节点当前契约ID处于保活状态,随时可以获取该节点当前的契约ID。该节点下次发起保活仍然会根据此契约响应输出结果输出的契约时效值并携带发起契约产生的契约ID进行发起保活该节点的保活契约。只要在契约的时效值之内再次发起保活契约就可以在上次契约时效值之内再次增加一次节点当前契约ID的时效值,以保活该节点的当前契约ID。节点契约ID与节点自身的竞选值是关联的。该过程是一个死循环过程,节点通过第一定时器定时不停的在执行上述保活契约的步骤,以保障节点的契约ID为存活的,可以随时参加竞选,同时也证明的节点与etcd服务器集群系统之间通过TCP传输协议的异步实现方式建立的连接(可以是进行超文本传输协议HTTP连接)为正常连接,以便进发起参加竞选的动作。
进一步地,当首次发起节点保活契约时,因为首次发送保活契约时没有之前发起契约的契约ID,这种情况下认为发起保活契约没有在契约的时效值之内进行,契约响应的输出结果为契约的时效值为空。所以需要重新发起契约生成新的契约ID,得到新的契约ID后根据新的契约ID向所述存储服务器集群发起节点的保活契约,使节点保持竞选状态。
若契约响应判断发起保活契约的动作没有在契约的时效值之内进行,则契约响应输出的结果为契约的时效值为空,需要重新发起契约的动作,以生成新的契约ID,根据生成的新的契约ID重新发起保活契约的动作。这种情况是节点与存储服务器集群之间的第一超文本传输协议通信连接异常时发生的,第一定时器在规定的执行时间间隔内无法向所述存储服务器集群发起保活契约的动作。等节点与存储服务器集群之间的第一超文本传输协议通信连接正常后,前一次向所述存储服务器集群发起的保活契约的动作的时间已经超过契约的时效值,契约响应判断契约时效值超时,输出结果为契约时效值为空,该契约ID无效。因为节点的当前契约ID与节点的自身竞选值是关联的,所以该节点的自身竞选值被etcd服务器集群系统删除,该节点当前的契约ID从此不再参与主节点的选取。等节点与存储服务器集群之间的超文本传输协议通信连接正常后,再次发起契约,节点生成新的契约ID,从新执行节点与存储服务器集群之间的第一超文本传输协议通信连接正常后所执行的步骤。
第二选主定时任务单元3032,用于在所述节点处于保活时,建立所述节点与所述存储服务器集群之间的第二超文本传输协议通信连接并竞选主节点。
当节点处于保活状态时,即节点当前的契约ID的保活契约在契约时效值之内发起时,节点就一直处于保活状态,节点当前的契约ID一直为有效契约ID,随时可以被获取。节点通过第二定时器(图中未示)定时检测是否成功获取节点当前处于保活状态下的契约ID,以便得知获取的契约ID是否发生变化。当成功获取节点当前处于保活状态下的契约ID后,节点通过传输协议的异步实现方式与etcd服务器集群系统建立的第二TCP传输协议(具体可以是第二超文本传输协议HTTP连接),并定时检测节点与存储服务器集群之间的第二通信连接是否异常。连接正常的情况下,向所述存储服务器集群发起参加竞选的动作后,该节点参加主接点的竞选。具体地,节点通过与etcd服务器集群系统之间的第二TCP传输协议并进行第二超文本传输协议HTTP连接进行通信,节点向所述存储服务器集群发送超文本传输协议报文,告知etcd服务器集群系统该节点要参加竞选。这样该节点自身参加竞选的竞选值会被存储至etcd服务器集群系统中,在当前主节点有变换时,etcd服务器集群系统按照一定的规定和方法选择所有参加竞选的节点中的一个节点所对应的自身竞选值作为新的主节点的竞选值供参加竞选的节点竞选。该规定和方法可以是提前预设的。
当不能成功获取节点处于保活状态下的契约ID时,继续获取,直到成功获取节点处于保活状态下的契约ID为止。
同样,当节点与etcd服务器集群系统之间的第二TCP传输协议(具体可以是第二超文本传输协议HTTP连接)不成功时,继续连接,直到连接成功为止,该连接需要第二定时器定时检测。此时,节点不能参加竞选,但是可以观察其他节点竞选并通过观察竞选得值竞选结果。
另外,当重新发起契约生成新的契约ID后,成功获取节点新的契约ID后,需要强行断开上一次建立的节点与etcd服务器集群系统之间的第二TCP传输协议(具体可以是第二超文本传输协议HTTP连接),节点重新通过传输协议的异步实现方式建立与etcd服务器集群系统之间的第二TCP传输协议(具体可以是第二超文本传输协议HTTP连接),然后再向所述存储服务器集群发起参加竞选的动作。每次获取节点新的契约ID后均执行该步骤。
第三选主定时任务单元3033,用于建立节点与存储服务器集群之间的第三超文本传输协议通信连接,发起观察竞选,观察竞选结果的变化,
当竞选结果无变化时,返回竞选值至所述节点;
当竞选结果发生变化时,获取变化后的竞选值并与所述节点自身的竞选值相比较,若相同,则所述节点即为先的主节点,若不同,则为从节点。
节点通过第三定时器(图中未示)以传输协议的异步实现方式定时建立与etcd服务器集群系统之间的第三TCP传输协议(具体可以是第三超文本传输协议HTTP连接)。定时检测所述节点与所述存储服务器集群之间的第三通信连接是否异常;当连接异常时,重新连接,直到连接成功为止。连接成功后,向所述存储服务器集群发起观察竞选,该步骤主要观察主节点的变化情况,当主节点的竞选值有变化时,观察新的主节点的竞选值,然后将新的主节点的竞选值返回至各节点。观察竞选的动作一直在进行,不管节点是不是参加竞选,当节点不参加竞选时,待竞选完成后,即新的主节点选取完成后,将新的主节点的自身竞选值返回至节点,节点得知新的主节点的竞选值,从而得知新的主节点。当节点参加竞选时,观察竞选的动作同样在进行,不管参加竞选的节点是否竞选为新的主节点,都将新的主节点的竞选值返回至参加竞选的节点,各节点得知新的主节点的竞选值从而得知新的主节点。
主节点的变化情况进一步为:原主节点不再作为主节点,etcd服务器集群系统从参加竞选的从节点中选择一个节点所对应的竞选值,各个从节点的竞选值与etcd服务器集群系统从参加竞选的从节点中选择的一个节点所对应的竞选值相比较。自身竞选值与etcd服务器集群系统从参加竞选的从节点中选择的一个节点所对应的竞选值相同的节点即为新的主节点,其他的节点即为从节点。该步骤即为主节点的具体选取过程。
响应报文接收子模块304,用于所述节点接收所述存储服务器集群在获取所述请求后向所述节点返回的响应报文,以便完成主节点的选取。
响应报文接收子模块304包括第二解析单元3041,用于对节点对接收的响应报文进行解析,以便得知主节点的选取结果。具体地,节点接收存储服务器集群发送的主节点的响应报文,然后通过第二解析单元3041对其进行解析,得知主节点的选取结果。
值得说明的是,上述三个任务是实现的每个节点同时执行的。三个任务中的节点通过传输协议的异步实现方式与etcd服务器集群系统建立的TCP传输协议,然后进行超文本传输协议HTTP连接是三种不同的通信连接。
本技术方案能满足分布式集群中部分节点需要进行主从结点的选择,当服务器网络异常时可以进行主从切换的需求。
本发明还提供了一种分布式系统中主节点的选取系统,包括:一个以上存储器和一个以上处理器。其中,
存储器(图中未示出),用于存储程序指令,存储器可以是短暂存储或持久存储。
处理器(图中未示出),用于执行所述程序指令,以实现本技术方案中主节点的选取方法。
本发明还提供了一种存储介质,所述存储介质存储有可读指令,所述可读指令可被处理器执行时实现本技术方案中主节点的选取方法。
以上,仅为本发明较佳的具体实施方式,但发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。