而对于持久节点,有一个Raft协议的实现
我们知道Raft算法作为一个CP协议,它通过的是Leader节点来向各个节点进行数据的同步。
所以会先判断当前节点是否是Leader节点,如果不是则将请求转发到Leader节点进行处理。
而如果就是Leader节点,那么我们会先将数据写入到内存中,然后再写入到磁盘中。
可以看到这里又调用了notifier的addTask方法
那么之后的流程还是一样的,会根据放入的key去更新内存中的数据,并且最后这里的持久化策略会选择
这里会选择else里面的逻辑。
在这里需要考虑的一个问题是,我们使用的是Raft协议,Raft协议是基于选择Leader节点来进行数据同步的,那么也就是需要保证集群中是存在一个Leader节点的。而选举规则为 总节点数/2+1。
所以如果集群中只有三个节点,其中一个节点挂了,那么就只有两个节点是没办法选择出一个Leader的,这样子就会出问题。
也就是Nacos还得设计一个策略,来解决只有两个节点的时候也可以进行数据同步,而更少的时候则需要进行阻塞。
Nacos采用的是CountDownLaunch这种计数器的方式。
上面的逻辑很明确了,主节点会直接把数据落盘,而从节点,则会向他们发送一个请求让他们去写盘,并且写盘成功之后会回调方法,那么计数器就会-1,只要最后计数器为0,那么就不会报错并且释放锁,否则就报错然后释放锁。