对标Eureka的AP一致性1.快速理解Raft算法Raft适用于管理日志一致性的协议。与Paxos协议相比,Raft更容易理解和实现。为了提高理解力,Raft将共识算法分为领导者选择、日志复制、安全性等几个部分,并使用更强的一致性来减少对状态的考虑。与Paxos相比,Raft算法更直观易懂。Raft算法将服务器分为三种状态,也可以称为角色:Leader:负责客户端交互和日志复制,系统中最多同时存在一个。Follower:被动响应请求RPC,从不主动发起请求RPC。Candidate:临时角色,只存在于leader选举阶段。如果一个节点想要成为leader,它会发起投票请求,同时成为candidate。如果选举成功,则成为候选人,否则返回follower状态或角色流程如下:在Raft中,问题被分解为:leader选择、日志复制、安全和成员变更。复制状态机是通过复制日志来实现的:日志:每台机器保存一个日志,日志来自客户端的请求,包含一系列命令。状态机:状态机按顺序执行这些命令。一致性模型:在分布式环境下,保证多台机器的日志是一致的,这样回放到状态机中的状态是一致的1.Raft算法选择的主要过程Raft有Term的概念。术语类似于中国历史上的朝代更替。Raft算法将时间划分为任意长度不等的Term。2.选举过程:follower添加当前任期,将其变成候选人。候选人为自己投票,并向集群中的其他服务器发送RequestVoteRPC。收到RequestVote的服务器将按照先到先得的原则最多只投票给同一任期内的一名候选人。并且只投票给日志至少和它自己一样新的候选人。2、NacosSpringCloud中的CP一致性阿里巴巴Nacos在1.0.0版本正式支持AP和CP两种共识协议。CP共识协议的实现基于Raft的简化CP共识。Raft算法如何实现Nacos服务器启动时,会通过RunningConfig.onApplicationEvent()方法调用RaftCore.init()方法。开始选举publicstaticvoidinit()throwsException{Loggers.RAFT.info("initializingRaftsub-system");//启动Notifier,轮询Datums,通知RaftListenerexecutor.submit(notifier);//获取Raft集群节点,更新PeerSet中的peer。add(NamingProxy.getServers());longstart=System.currentTimeMillis();//从磁盘加载Datum和term数据进行数据恢复RaftStore.load();Loggers.RAFT.info("cacheloaded,peercount:{},datumcount:{},currentterm:{}",peers.size(),datums.size(),peers.getTerm());while(true){if(notifier.tasks.size()<=0){break;}Thread.sleep(1000L);System.out.println(notifier.tasks.size());}Loggers.RAFT.info("finishtoloaddatafromdisk,cost:{}ms.",(System.currentTimeMillis()-start));GlobalExecutor.register(newMasterElection());//Leader选举GlobalExecutor.register1(newHeartBeat());//Raft心跳GlobalExecutor.register(newAddressServerUpdater(),GlobalExecutor.ADDRESS_SERVER_UPDATE_INTERVAL_MS);if(peers0.size()>){if(lock.tryLock(INIT_LOCK_TIME_SECONDS,TimeUnit.SECONDS)){initialized=true;lock.unlock();}}else{thrownewException("peersisempty.");}Loggers.RAFT.info("timerstarted:leadertimeoutms:{},heart-beattimeoutms:{}",GlobalExecutor.LEADER_TIMEOUT_MS,GlobalExecutor.HEARTBEAT_INTERVAL_MS);}主要在init中做method做了以下事情:获取Raft集群节点peers.add(NamingProxy.getServers());Raft集群数据恢复RaftStore.load();筏选举GlobalExecutor.register(newMasterElection());筏心跳GlobalExecutor.register(newHeartBeat());Raft发布内容Raft保证内容一致性选举过程其中,raft集群内部节点通过Restful接口暴露出来,代码在RaftControllerRaftController控制器用于raft集群内节点之间的通信。具体信息如下:POSTHTTP://{ip:port}/v1/ns/raft/vote:请求投票POSTHTTP://{ip:port}/v1/ns/raft/beat:Leader发送心跳信息toFollowerGETHTTP://{ip:port}/v1/ns/raft/peer:获取节点的RaftPeer信息PUTHTTP://{ip:port}/v1/ns/raft/datum/reload:重新加载某个节点日志信息POSTHTTP://{ip:port}/v1/ns/raft/datum:Leader收到传入的数据并保存在DELETEHTTP://{ip:port}/v1/ns/raft/datum:Leader收到数据删除操作GETHTTP://{ip:port}/v1/ns/raft/datum:获取节点存储的数据信息GETHTTP://{ip:port}/v1/ns/raft/state:获取状态节点信息{UPorDOWN}POSTHTTP://{ip:port}/v1/ns/raft/datum/commit:Follower节点收到Leader的数据并保存操作DELETEHTTP://{ip:port}/v1/ns/raft/datum:Follower节点接收到Leader的数据删除操作GETHTTP://{ip:port}/v1/ns/raft/leader:获取当前集群的Leader节点InformationGETHTTP://{ip:port}/v1/ns/raft/listeners:获取当前Raft集群的所有事件监听器RaftPeerSet心跳机制Raft使用心跳机制触发leader选举。心跳定时任务是通过GlobalExecutor.register(newHeartBeat())在GlobalExecutor中注册心跳定时任务。具体操作包括:重置Leader节点的心脏超时时间和选举超时时间;sendBeat()发送心跳包.heartbeatDueMs>0){return;}local.resetHeartbeatDue();sendBeat();}catch(Exceptione){Loggers.RAFT.warn("[RAFT]errorwhilesendingbeat{}",e);}}}简要解释了实现Nacos中的Raft一致性。更详细的流程可以下载源码查看RaftCore了解更多。源码可以通过以下地址查看:gitclonehttps://github.com/alibaba/nacos.git
