Nacos注册中心-基于raft 协议的数据一致性

本文介绍了Nacos服务注册流程,重点解析了基于Raft协议的写操作同步过程,包括领导者选举、数据同步与一致性保证。在数据不一致场景下,Nacos实现实际为最终一致性,通过心跳机制确保follower节点与leader保持数据同步。
摘要由CSDN通过智能技术生成

1. 回顾一下服务注册流程

当一个服务注册请求打到nacos服务器的时候,它会根据根据你这个实例的namespace, serviceName,group信息获取到对应的service,如果不存在就创建,然后就是进行根据你这个service里面原来的实例列表信息在加上这个新的实例信息,整合出来一个新的实例列表信息,接着就是找到一致性服务(consistencyService)进行put操作,这个consistencyService 会根据实例是临时节点(默认就是这个临时节点)还是永久节点选择对应的consistencyService ,其实对于临时节点对应的就是DistroConsistencyServiceImpl,它节点之间数据同步是peer to peer 的,跟那个eureka 差不多,对于永久节点对应的是PersistentConsistencyServiceDelegateImpl,这个里面有2个实现一个是RaftConsistencyServiceImpl的,一个是PersistentServiceProcessorRaftConsistencyServiceImpl 是1.4之前版本使用的,也是我们今天要介绍的,后面这个PersistentServiceProcessor 是1.4包括以上的版本使用的(这里我们先不介绍)。 大概就是下图这个样子:

本文主要就是介绍下红框中的基于raft 协议数据同步的部分。

2. 基于raft的写操作同步

我们可以对照着上图红框部分来看看RaftConsistencyServiceImpl# put:

@Override
public void put(String key, Record value) throws NacosException {
    // 检查有没有停止
    checkIsStopWork();
    try {
        // todo 找到这个
        raftCore.signalPublish(key, value);
    } catch (Exception e) {
        Loggers.RAFT.error("Raft put failed.", e);
        throw new NacosException(NacosException.SERVER_ERROR, "Raft put failed, key:" + key + ", value:" + value,
                e);
    }
}

这里没什么好说的,就是检查下状态,然后找到这个raftCoresignalPublish 来进行存储,同步。接下来看看signalPublish 这个方法:

public void signalPublish(String key, Record value) throws Exception {
    if (stopWork) {
        throw new IllegalStateException("old raft protocol already stop work");
    }
    // 不是leader的话
    if (!isLeader()) {
        ObjectNode params = JacksonUtils.createEmptyJsonNode();
        params.put("key", key);
        params.replace("value", JacksonUtils.transferToJsonNode(value));
        Map<String, String> parameters = new HashMap<>(1);
        parame
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值