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