【源码分析】Nacos如何是现在CP模式下基于Raft协议的节点注册逻辑

264 阅读2分钟

而对于持久节点,有一个Raft协议的实现 在这里插入图片描述

我们知道Raft算法作为一个CP协议,它通过的是Leader节点来向各个节点进行数据的同步。 所以会先判断当前节点是否是Leader节点,如果不是则将请求转发到Leader节点进行处理。 在这里插入图片描述

而如果就是Leader节点,那么我们会先将数据写入到内存中,然后再写入到磁盘中。 在这里插入图片描述 在这里插入图片描述

可以看到这里又调用了notifier的addTask方法 在这里插入图片描述

那么之后的流程还是一样的,会根据放入的key去更新内存中的数据,并且最后这里的持久化策略会选择 在这里插入图片描述 在这里插入图片描述

这里会选择else里面的逻辑。 在这里需要考虑的一个问题是,我们使用的是Raft协议,Raft协议是基于选择Leader节点来进行数据同步的,那么也就是需要保证集群中是存在一个Leader节点的。而选举规则为 总节点数/2+1。 所以如果集群中只有三个节点,其中一个节点挂了,那么就只有两个节点是没办法选择出一个Leader的,这样子就会出问题。 也就是Nacos还得设计一个策略,来解决只有两个节点的时候也可以进行数据同步,而更少的时候则需要进行阻塞。 Nacos采用的是CountDownLaunch这种计数器的方式。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

上面的逻辑很明确了,主节点会直接把数据落盘,而从节点,则会向他们发送一个请求让他们去写盘,并且写盘成功之后会回调方法,那么计数器就会-1,只要最后计数器为0,那么就不会报错并且释放锁,否则就报错然后释放锁。