写文章前,先备注学习资料,尊重别人的劳动成果!!!
学习资料:https://blog.csdn.net/microGP/article/details/114261089
nacos是基于raft算法是实现的,raft算法是分布式系统一致性算法, Raft算法的头号目标就是容易理解(UnderStandable),这从论文中就可以看出来。当然,Raft增强了可理解性,在性能、可靠性、可用性方面是不输于Paxos的。建议大家拜读下作者的论文Raft论文。
一.选取主节点
raft协议中,一个节点任一时刻处于以下三个状态之一:
leader:主节点
follower:从节点
candidate:候选节点
可以看出所有节点启动时都是follower状态;在一段时间内如果没有收到来自leader的心跳,从follower切换到candidate,发起选举;如果收到N/2+1的赞成票(含自己的一票)则切换到leader状态;如果发现其他节点已经是leader,则主动切换到follower。
term:
关于term,网上没有什么特别好的解释,这里暂且认为是一个逻辑计数,用来证明谁是最新的,越大就说明节点数据越新,越应该成为leader。
以nacos选举为例,具体讲下选举过程:
1.三个节点刚启动的时候,此时都是follower,nacos先从缓存中加载数据,默认term是0
masterTask 是follower长时间没收到心跳就选举的定时任务,设置的是500ms一次
heartbeatTask 是心跳定时任务 500ms秒一次
MasterElection实现了Runnable方法,满足条件下,进行sendVote
sendVote
超过半数,设置成leader
2.与其他节点比较的代码
判断本地的term值和远程的term值,谁大则选谁
3.如果第一次没有N/2+1个以上的ip选举成功,0.5s后发起另外一次请求,前面说过,每个节点发起投票的时候是不一样的,所以term增加的值是不一样的,所以总是会出现某个term较大,选举成功。一直不成功的概念极小。
二.数据同步 日志同步
当系统有了leader后,系统就进入对外工作期了。客户端的一切请求来发送到leader,leader来调度这些并发请求的顺序,并且保证leader与followers状态的一致性。在 raft 集群中,所有日志都必须首先提交至 leader 节点。leader 在每个 heartbeat 向 follower 同步日志。
在nacos中的实现:
raft算法首先要把信息同步给leader,由leader分发给所有follower
具体流程可见 https://www.processon.com/view/5e25b762e4b04579e409e81f
https://blog.csdn.net/liyanan21/article/details/89320872
三.safety:安全实现的保障机制
上面讲的都是正常情况下,对于异常情况,也需要有对应的处理策略。
好像并没有,通过客户端的心跳检测机制,自动恢复数据