|
本文参考孙卫琴,杜聚宾所创作的<<Spring Cloud Alibaba微服务开发宝典>>一书,即将出版问题:在Nacos集群中,每个节点都持有微服务列表以及微服务的配置单元信息,如何保证各个节点的数据的一致性呢?
答案:Nacos集群采用Raft算法来保证各个节点的数据的一致性。由于Raft算法规定了节点之间的通信过程,因此也把它称为Raft协议。
Raft算法要求集群中节点的数目为奇数,并且至少有三个节点。每个节点处于以下三种角色之一:
(1)Leader(领导):协调各个节点的数据同步,定时向Follower发送心跳,表明自己活着。任何时候,集群中只有一个Leader。
(2)Follower(随从):负责响应Leader和Candidate的请求。
(3)Candidate(竞选人):这是过渡角色。当集群中Leader宕机后,Follower就有可能变成Candidate,发起新一届的选举。1. 节点之间数据的同步假定有三个Nacos节点:节点A、节点B和节点C。节点A为Leader,节点B和节点C为Follower。节点之间数据的同步分两种情况:
(1)如果节点A上的配置单元发生了更新,节点A作为Leader,会直接通知节点B和节点C同步更新配置单元,参见图1。
图1 当节点A的配置单元发生更新后各个节点的同步过程
(2)如果节点B上的配置单元发生更新,节点B作为Follower,先向节点A汇报配置单元发生更新,节点A再通知所有的Follower同步更新配置单元。参见图2。
图2 当节点B的配置单元发生更新后各个节点的同步过程2. 节点的选举机制在民主社会中,每一届的领导通过选举产生。同样,Raft算法也通过选举产生领导。
变量term表示当前是第几届选举。假定在节点A、节点B、节点C、节点D和节点E构成的集群中,一开始变量term为1,表示当前为第一届选举,产生的Leader为节点A,其余节点都是Follower。
如图3所示,集群发生Leader换届的过程如下。
(1)一开始,节点A定时向其他节点发送心跳,表明自己一直活着。其他节点收到节点A的心跳后,知道现在群龙有主,就老老实实地做Follower。
(2)节点A宕机。节点B等待接收节点A的心跳,最后超时。
(3)节点B认为节点A已经下线,群龙无主,就跃跃欲试,想自己当领导。节点B由Follower变为Candidate,把变量term改为2,发起新一届选举。
(4)节点B首先给自己投一票,又向节点C、D和E发送票据,希望它们也给自己投票。于是其余节点都给节点B投了一票,节点B就成了新的Leader。
图3 节点B竞选成为Leader的过程
问题:假如节点A宕机后,节点B和节点C都变成Candidate,想当Leader,都向节点D和节点E发送票据拉选票,会怎么样呢?
答案:Raft算法规定,在每一届选举中,每个节点只能投1票。这意味着节点D和节点E只能在节点B和节点C中选择一个投票。对于节点B和节点C,收到过半投票数的节点成为Leader。
为了保证选举顺利举行,Raft算法做了以下限定:
(1)收到过半票数的Candidate成为Leader。
(2)当一个Candidate被告知其他节点已经成为Leader,则自己切换为Follower。
(3)一个Candidate在一段时间内没有收到过半的投票数,并且集群内尚未出现Leader,那么该Candidate会重新发起新一届的选举。
程序猿的技术大观园:www.javathinker.net
|
|