一种主节点的选举方法及节点的制作方法

文档序号:7550806阅读:184来源:国知局
专利名称:一种主节点的选举方法及节点的制作方法
技术领域
本发明涉及集群(Cluster)系统领域,尤其涉及一种主节点的选举方法及节点。
背景技术
网络技术的快速发展,促进了集群系统的发展和广泛应用。一个集群由全部互相连接的服务器组成,这些服务器被作为一个统一的计算资源,对外表现为单一的系统,并以单一系统的模式加以管理。随着集群结构的逐步成熟,集群目前在金融、电信和政府网络等领域已成为一个热门技术,它可以保证系统的高可用性、可扩充性和抗灾难性。对于一个理想的集群,用户无需关注集群系统的组成节点,一个集群就是一个系统,而不是若干独立的计算节点,集群管理员可以根据需要增加或者删除集群系统的节点。集群系统具有如下优点:高扩展性、高可用性、高性能和高性价比。根据集群系统的不同特征,可以将集群系统分为三类:高可用集群、负载均衡集群与高性能计算集群。高可用集群又叫HA集群,是集群的一种,是基于为终端用户提供持续性的服务而产生的,用于对外提供高度可靠的服务,在这类集群系统里,所有节点采用Master(S)/Slave (从)或者Mult1-Active (多激活)方式对外提供同样的服务,考虑到一致性的问题,Mult1-Active方式处理起来非常复杂,往往导致处理效率的降低,因此较多采用Master/Slave方式,由Master接受请求进行统一分配,Master/Slave与Mult1-Active的主要区别是存在一个特殊节点,功能角色与其他节点不同。Master的选择往往是动态的,避免单点故障(SPOF, Single Point of Failure)的发生。Master的选择是一个典型的Leader (主节点)选举过程,在高可用集群里的应用非常普遍。—个合格的Leader选举方法需要解决以下几个问题:避免出现多个Leader( >I);处理网络分裂;避免选举过程节点崩溃;容忍低速网络等。目前传统的Leader选举方法包括以下几种:(I)为集群系统中的每个节点分别配置编号,选择编号最大或最小的节点作为主节点;(2)集群系统中的节点随机生成编号,选择编号最大的节点作为主节点;(3)集群系统中的节点均使用相同的主键写数据库,成功写入数据库的节点作为主节点。上述传统的Leader选举方法可以实现固定节点数目的集群系统的Master选举,但是无法满足集群动态性的要求,在集群系统中的节点数量动态变化时,无法实现主节点的选择。

发明内容
本发明要解决的技术问题是提供一种主节点的选举方法及节点,能够在节点数量动态变化的集群系统中,实现主节点的选举。为解决上述技术问题,本发明的一种主节点的选举方法,包括:
集群中的各节点向集群中除自身外的节点请求发起提案,判断允许自身发起提案的节点的数量是否达到允许发起提案的最小要求值,如果达到,则向集群中除自身外的节点广播提案,并判断接受提案的节点的数量是否达到提案被接受的最小要求值,如果达到,贝_定提案的节点为主节点,向集群中除自身外的节点广播被接受的提案。进一步地,判断允许自身发起提案的节点的数量是否达到允许发起提案的最小要求值,包括:在向集群中除自身外的节点请求发起提案后,接收响应消息,根据响应消息中携带的提案响应信息判断发送响应消息的节点是否允许发起提案,如果允许,则对允许发起提案的节点的数量进行累计,并根据集群的总节点数量判断允许发起提案的节点的数量是否达到允许发起提案的最小要求值。进一步地,判断接受提案的节点的数量是否达到提案被接受的最小要求值,包括:在向集群中除自身外的节点广播提案后,接收响应消息,根据响应消息中是否携带接受信息判断发送响应消息的节点是否接受提案,如果接受,则对接受提案的节点的数量进行累计,并根据集群的总节点数量判断接受提案的节点的数量是否达到提案被接受的最小要求值。进一步地,所述允许发起提案的最小要求值和提案被接受的最小要求值是总节点数量加I的二分之一的向上取整值。进一步地,所述集群的总节点数量由集群中的各节点保存,集群中的各节点监控集群中节点的加入和离开,在有节点加入时,在总节点数量中加上增加的节点的数量,在有节点离开时,在总节点数量上减去离开的节点的数量。进一步地,一种主节点的选举方法,包括:集群中的各节点在接收到请求发起提案的消息后,根据在接收到所述消息前是否已接受提案,向发送所述消息的节点返回响应消息,指示是否允许发送所述消息的节点发起提案,并且,在接收到提案后,判断是否已允许发送提案的节点发起提案,如果是,则向发送提案的节点返回响应消息,指示接受提案。进一步地,还包括:集群中的各节点在接收到请求发起提案的消息后,还判断所述请求发起提案的消息的请求标识(request ID)是否大于已接收到的最大的request ID,如果是,则执行所述根据在接收到所述消息前是否已接受提案,向发送所述消息的节点返回响应消息,并记录当前的请求发起提案的消息的request ID为已接收到的最大的request ID。进一步地,还包括:在向发送提案的节点返回响应消息,指示接受提案后,等待发送提案的节点广播的被接受的提案,如果在等待时间内未接收到发送提案的节点广播的被接受的提案,则标记当如未接受:提案,允许请求提案的节点发起提案。进一步地,一种节点,包括:提案发起单元、提案单元和主节点确定单元,其中:所述提案发起单元,用于向集群中除自身外的节点请求发起提案,判断允许自身发起提案的节点的数量是否达到允许发起提案的最小要求值,如果达到,则通知所述提案单元;
所述提案单元,用于向集群中除自身外的节点广播提案,并判断接受提案的节点的数量是否达到提案被接受的最小要求值,如果达到,则通知所述主节点确定单元;所述主节点确定单元,用于确定提案的节点为主节点,向集群中除自身外的节点广播被接受的提案。进一步地,一种节点,包括:发起判断单元和提案判断单元,其中:所述发起判断单元,用于在接收到请求发起提案的消息后,根据在接收到所述消息前是否已接受提案,向发送所述消息的节点返回响应消息,指示是否允许发送所述消息的节点发起提案;所述提案判断单元,用于在接收到提案后,判断是否已允许发送提案的节点发起提案,如果是,则向发送提案的节点返回响应消息,指示接受提案。综上所述,本发明从集群系统的节点中动态协商选举出主节点,达到在集群中的节点数量弹性伸缩的情况下确定主节点的目的。


图1为本发明的主节点的选举方法的流程图;图2为本发明的一种节点的架构图;图3为本发明的另一种节点的架构图。
具体实施例方式本文提出了一种可以支持节点弹性伸缩的Leader选举方法,用于实现节点动态变化的集群系统的主节点选举,该方法中动态获取节点的信息,根据集群系统中实际的节点数量,调整Leader选举过程,达到在节点弹性伸缩的情况下确定Leader的目的。本实施方式的主节点的选举方法包含两个消息交换通道,选举信息交换通道和成员信息交换通道,具体的通道选择方式可以根据实际应用进行选择(例如心跳线或者仲裁盘)。本实施方式中每个节点兼具三种角色,即Proposer(提案方)、Acceptor(接受方)和 Learner (学习方),Proposer 发送 prepare request (准备请求)和 proposerequest (提案请求)到 Acceptor, Acceptor 反馈prepare response (准备应答)和proposeresponse (提案应答)给Proposer。一旦Proposer获得租约(Lease,有时间期限的锁,获得租约的节点为主节点)之后就通知所有的Learner。这些消息通过选举信息交换通道传输,选举信息交换通道可以是异步的、不稳定的。具体的选举信息交换流程如图1所示,以某节点选举自己成为Leader为例,时长为T,本实施方式的主节点的选举方法,包括:步骤101:集群中每个节点的Proposer生成Prepare Request,包括封装PrepareRequest的request ID (请求ID),设置消息的类型为Prepare Request,向集群中的节点进行广播,请求发起提案;request ID 为单调递增。生成并广播Prepare Request的伪代码如下:PrepareRequestO { state.requestID = nextRequestID(); request.type = PrepareRequest; request.requestID = state.requestID;
Broadcast(reqLiest);
} 步骤102:Acc印tor 收到 Prepare Request 之后,判断Prepare Request 的 requestID是否大于已接收到的最大的request ID,如果是,则记录当前Prepare Request的request ID为已接收到的最大的request ID,生成PrepareResponse,在Prepare Response中携带提案响应信息,发送给Proposer ;在Acceptor允许Proposer发起提案时,提案响应信息包含指示Acceptor允许提案的 目息,例如提案响应彳目息为空(null);在Acceptor已接受:其他节点的提案,不允许Proposer发起提案时,提案响应信息包含Acceptor已接受的提案(已接受的节点的ID)。步骤102的伪代码如下:
OnPrepareRequestO {
if(state.highestF^equestlD > request.requestID) return;
state.highestRequestID = request.requestID; response.type = PrepareResponse; reponse.responselD = request.requestID; response.acceptedProposal = state.accepted Proposal; Send(response);
}步骤103:Proposer 收到 Prepare Response 之后,判断 Prepare Response 是否合法,如果合法,则根据提案响应信息判断Acc印tor是否允许Proposer发起提案,如果允许,则根据总节点数量判断允许发起提案的Acceptor的数量是否达到允许发起提案的最小要求值,如果达到,注册一个定时器,生成Propose Request携带提案的节点的ID,向集群中的节点广播提案进行正式申请;在Propose Request中还携带定时器的定时时间,将Proposer等待ProposeResponse 的时间通知 Acceptor。 Proposer 判断 Prepare Response 是否合法包括:判断 Prepare Response 的response ID 与 Prepare Request 的 request ID 是否相同,如果相同,则判定 PrepareResponse合法;如果不相同,则判定Prepare Response不合法。Proposer根据提案响应信息判断Acceptor是否允许Proposer发起提案包括:判断提案响应信息是否为null,如果为null,则判定Acceptor允许Proposer发起提案;否贝1J,判定Acceptor不允许Proposer发起提案。在Acceptor允许Proposer发起提案时,Proposer还对允许发起提案的Acceptor的数量进行累计。Proposer根据总节点数量判断允许发起提案的Acceptor的数量是否达到允许发起提案的最小要求值,包括:判断允许发起提案的Acceptor的数量是否达到总节点数量加I的二分之一的向上取整值。Proposer在定时器到达定时时间仍未收到Propose Response的情况下,确定提案失败,标记出主节点未确定。步骤103的伪代码如下:
OnPrepareResponseO { if(response.responseID != state.requestID) return;
if(response.acceptedProposal == null)
nurnOpened++;
if(QuorumAccept(numOpened)) {state.timeout = T;
SetTimeout(T);
request.type = ProposeRequest; request.requestID = state.requestID request.proposal.proposal ID = self, proposal ID; request.proposal, timeout = state, timeout;
Broadcast(request);
}
}
OnTimeoutO {state.requestID = null; state.1easeOwner = false
}步骤104:Acceptor收到Propose Request之后,判断是否已允许Proposer发起提案,如果是,生成Propose Response,携带接受信息,将Propose Response发送给Proposer ;Acceptor判断是否已允许Proposer发起申请,包括:判断Propose Request的request ID是否小于已接收的最大的request ID,如果是,贝U判定未允许Proposer发起申请;如果不是,则判断已允许Proposer发起申请。Acceptor还按照Propose Request中携带的定时时间注册一定时器,记录等待租约广播消息的时间,在定时器到达而未收到租约广播消息的情况下,标记当前未接受提案,允许请求提案的Proposer发起提案。步骤104的伪代码如下:
OiiProposeReqiiest()(
if(request.requestlD < state.highestF^equestlD) return;
state.acceptedProposal = request.proposal;
SetTiineout(state,acceptedProposal.timeout); response.type = ProposeResponse; response.responseID = request.requestID;
Send(response);
}
OnTimeoutQ {
state.acceptedProposal = null:
}步骤105:Proposer 收到 Propose Response 消息之后,根据 Propose Response 是否携带接受信息,判断接受提案的Acceptor的数量是否达到提案被接受的最小要求值,如果达到,说明当前节点成为Leader,广播租约广播消息给所有的Learner,广播被接受的提案。Proposer在收到Propose Response后,还判断Propose Response 的response ID与Prepare Request的request ID是否相同,如果相同,则对接受提案的Acceptor的数量进行累计,并判断接受提案的Acceptor的数量是否达到最小要求值。Proposer根据总节点数量判断接受提案的Acceptor的数量是否达到最小要求值,包括:判断接受提案的Acc印tor的数量是否达到总节点数量加I的二分之一的向上取整值。Proposer在判断出接受提案的Acceptor的数量达到最小要求值时,确定提案成功,标记出主节点已确定。步骤105的伪代码如下:
OnProposeResponseO {
if(response.responseID != state.requestID)
return;
iiumAccepted++;
i!'(QuorumAccept(nuinAccepted)) { state.1easeOwner = true;
Broadcast(state)
}
}在步骤105中判断接受提案的Acc印tor的数量是否达到最小要求值的伪代码如下:以MajorityQuorum为例,接受 一个选举结果的函数如下:QuorumAccept(numAccepted){return (numAccepted >= ceil ((double) (numNodes+1)/2));}在步骤103中判断允许发起申请的Acc印tor的数量是否达到最小要求值的伪代码与上述伪代码类似,区别仅在于变量略有不同。本实施方式中成员信息交换通道主要监控节点的加入或者离开,相关的消息包括节点之间的MemberJoin和MemberLeave,集群中的节点均保存集群的总节点数量,在接收到MemberJoin后在总节点数量中加上增加的节点的数量;在接收到MemberLeave后在总节点数量中减去离开的节点的数量。伪代码如下:OnMeinberJoin0.!nuinNodes++;
}
OnMeinberLeaveO { nuinNodes—;
}如图2所示,本实施方式还提供了一种节点,包括:提案发起单元、提案单元和主节点确定单元,其中:提案发起单元,用于向集群中除自身外的节点请求发起提案,判断允许自身发起提案的节点的数量是否达到允许发起提案的最小要求值,如果达到,则通知提案单元;提案单元,用于向集群中除自身外的节点广播提案,并判断接受提案的节点的数量是否达到提案被接受的最小要求值,如果达到,则通知主节点确定单元;

主节点确定单元,用于确定提案的节点为主节点,向集群中除自身外的节点广播被接受的提案。提案发起单元,具体用于在向集群中除自身外的节点请求发起提案后,接收响应消息,根据响应消息中携带的提案响应信息判断发送响应消息的节点是否允许发起提案,如果允许,则对允许发起提案的节点的数量进行累计,并根据集群的总节点数量判断允许发起提案的节点的数量是否达到允许发起提案的最小要求值。提案单元,具体用于在向集群中除自身外的节点广播提案后,接收响应消息,根据响应消息中是否携带接受信息判断发送响应消息的节点是否接受提案,如果接受,则对接受提案的节点的数量进行累计,并根据集群的总节点数量判断接受提案的节点的数量是否达到提案被接受的最小要求值。允许发起提案的最小要求值和提案被接受的最小要求值是集群的总节点数量加I的二分之一的向上取整值。集群的总节点数量由提案发起单元和提案单元保存,集群中的各节点监控集群中节点的加入和离开,在有节点加入时,在总节点数量中加上增加的节点的数量,在有节点离开时,在总节点数量上减去离开的节点的数量。如图3所示,本实施方式的另一种节点,包括:发起判断单元和提案判断单元,其中:发起判断单元,用于在接收到请求发起提案的消息后,根据在接收到消息前是否已接受提案,向发送消息的节点返回响应消息,指示是否允许发送消息的节点发起提案;提案判断单元,用于在接收到提案后,判断是否已允许发送提案的节点发起提案,如果是,则向发送提案的节点返回响应消息,指示接受提案。发起判断单元,还用于在接收到请求发起提案的消息后,判断请求发起提案的消息的request ID是否大于已接收到的最大的request ID,如果是,则执行根据在接收到消息前是否已接受提案,向发送消息的节点返回响应消息,并记录当前的请求发起提案的消息的request ID为已接收到的最大的request ID。提案判断单元,还用于在向发送提案的节点返回响应消息,指示接受提案后,等待发送提案的节点广播的被接受的提案,如果在等待时间内未接收到发送提案的节点广播的被接受的提案,则标记当如未接受:提案,允许请求提案的节点发起提案。显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。以上该仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种主节点的选举方法,包括: 集群中的各节点向集群中除自身外的节点请求发起提案,判断允许自身发起提案的节点的数量是否达到允许发起提案的最小要求值,如果达到,则向集群中除自身外的节点广播提案,并判断接受提案的节点的数量是否达到提案被接受的最小要求值,如果达到,则确定提案的节点为主节点,向集群中除自身外的节点广播被接受的提案。
2.如权利要求1所述的方法,其特征在于,判断允许自身发起提案的节点的数量是否达到允许发起提案的最小要求值,包括: 在向集群中除自身外的节点请求发起提案后,接收响应消息,根据响应消息中携带的提案响应信息判断发送响应消息的节点是否允许发起提案,如果允许,则对允许发起提案的节点的数量进行累计,并根据集群的总节点数量判断允许发起提案的节点的数量是否达到允许发起提案的最小要求值。
3.如权利要求1所述的方法,其特征在于,判断接受提案的节点的数量是否达到提案被接受的最小要求值,包括: 在向集群中除自身外的节点广播提案后,接收响应消息,根据响应消息中是否携带接受信息判断发送响应消息的节点是否接受提案,如果接受,则对接受提案的节点的数量进行累计,并根据集群的总节点数量判断接受提案的节点的数量是否达到提案被接受的最小要求值。
4.如权利要求2或3所述的方法,其特征在于,所述允许发起提案的最小要求值和提案被接受的最小要求值是集群的总节点数量加I的二分之一的向上取整值。
5.如权利要求2或3所述的方法,其特征在于,所述集群的总节点数量由集群中的各节点保存,集群中的各节点监控集群中节点的加入和离开,在有节点加入时,在总节点数量中加上增加的节点的数量,在有节点离开时,在总节点数量上减去离开的节点的数量。
6.一种主节点的选举方法,包括: 集群中的各节点在接收到请求发起提案的消息后,根据在接收到所述消息前是否已接受提案,向发送所述消息的节点返回响应消息,指示是否允许发送所述消息的节点发起提案,并且,在接收到提案后,判断是否已允许发送提案的节点发起提案,如果是,则向发送提案的节点返回响应消息,指示接受提案。
7.如权利要求6所述的方法,其特征在于,还包括: 集群中的各节点在接收到请求发起提案的消息后,还判断所述请求发起提案的消息的请求标识(request ID)是否大于已接收到的最大的request ID,如果是,则执行所述根据在接收到所述消息前是否已接受提案,向发送所述消息的节点返回响应消息,并记录当前的请求发起提案的消息的request ID为已接收到的最大的request ID。
8.如权利要求6所述的方法,其特征在于,还包括: 在向发送提案的节点返回响应消息,指示接受提案后,等待发送提案的节点广播的被接受的提案,如果在等待时间内未接收到发送提案的节点广播的被接受的提案,则标记当iu未接受提案,允许请求提案的节点发起提案。
9.一种节点,包括:提案发起单元、提案单元和主节点确定单元,其中: 所述提案发起单元,用于向集群中除自身外的节点请求发起提案,判断允许自身发起提案的节点的数量是否达到允许发起提案的最小要求值,如果达到,则通知所述提案单元; 所述提案单元,用于向集群中除自身外的节点广播提案,并判断接受提案的节点的数量是否达到提案被接受的最小要求值,如果达到,则通知所述主节点确定单元; 所述主节点确定单元,用于确定提案的节点为主节点,向集群中除自身外的节点广播被接受的提案。
10.一种节点,包括:发起判断单元和提案判断单元,其中: 所述发起判断单元,用于 在接收到请求发起提案的消息后,根据在接收到所述消息前是否已接受提案,向发送所述消息的节点返回响应消息,指示是否允许发送所述消息的节点发起提案; 所述提案判断单元,用于在接收到提案后,判断是否已允许发送提案的节点发起提案,如果是,则向发送提案的节点返回响应消息,指示接受提案。
全文摘要
本发明公开了一种主节点的选举方法及节点,包括集群中的各节点向集群中除自身外的节点请求发起提案,判断允许自身发起提案的节点的数量是否达到允许发起提案的最小要求值,如果达到,则向集群中除自身外的节点广播提案,并判断接受提案的节点的数量是否达到提案被接受的最小要求值,如果达到,则确定提案的节点为主节点,向集群中除自身外的节点广播被接受的提案。本发明从集群系统的节点中动态协商选举出主节点,达到在集群中的节点数量弹性伸缩的情况下确定主节点的目的。
文档编号H04L29/08GK103118084SQ201310022088
公开日2013年5月22日 申请日期2013年1月21日 优先权日2013年1月21日
发明者颜秉珩, 张俊, 崔赢, 张现忠 申请人:浪潮(北京)电子信息产业有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1