Nacos集群Raft协议选举策略源码解析

1、Nacos集群选举策略

在Raft协议中,节点有三种角色:

  • Leader:负责接收客户端的请求
  • Candidate:用于选举Leader的一种角色
  • Follower:负责响应来自Leader或者Candidate的请求

选举分为两个阶段:

  • 服务启动的时候
  • leader挂了的时候

所有节点启动的时候,都是follower状态。 如果在一段时间内如果没有收到leader的心跳(可能是没有leader,也可能是leader挂了),那么follower会变成Candidate。然后发起选举,选举之前,会增加term,这个term和zookeeper中的epoch的道理是一样的。
follower会投自己一票,并且给其他节点发送票据vote,等到其他节点回复。


在这个过程中,可能出现几种情况

  • 收到过半的票数通过,则成为leader
  • 被告知其他节点已经成为leader,则自己切换为follower
  • 一段时间内没有收到过半的投票,则重新发起选举

约束条件:

  • 在任一term中,单个节点最多只能投一票

2、Nacos Raft源码分析

2.1、RaftCore.init()

Nacos Server在启动的时候会调用RaftCore.init()方法进行集群选举操作和节点之间的心跳机制

/**
 * @author nacos
 */
@Component
public class RaftCore {
   @PostConstruct
    public void init() throws Exception {

        Loggers.RAFT.info("initializing Raft sub-system");

        executor.submit(notifier);

        long start = System.currentTimeMillis();

        raftStore.loadDatums(notifier, datums);

        setTerm(NumberUtils.toLong(raftStore.loadMeta().getProperty("term"), 0L));

        Loggers.RAFT.info("cache loaded, datum count: {}, current term: {}", datums.size(), peers.getTerm());

        while (true) {
            if (notifier.tasks.size() <= 0) {
                break;
            }
            Thread.sleep(1000L);
        }

        initialized = true;

        Loggers.RAFT.info("finish to load data from disk, cost: {} ms.", (System.currentTimeMillis() - start));

        //节点选举
        GlobalExecutor.registerMasterElection(new MasterElection());
     
        //集群节点的心跳机制
        GlobalExecutor.registerHeartbeat(new HeartBeat());

        Loggers.RAFT.info("timer started: leader timeout ms: {}, heart-beat timeout ms: {}",
            GlobalExecutor.LEADER_TIMEOUT_MS, GlobalExecutor.HEARTBEAT_INTERVAL_MS);
    }

}

在init()方法中,使用GlobalExecutor.registerMasterElection(new MasterElection());方法来进行选举操作;

registerMasterElection()方法中,启动了一个定时任务去执行MasterElection里面的操作;接下来看MasterElection里面的逻辑:

2.2、new MasterElection()

public class MasterElection implements Runnable {
        @Override
        public void run() {
            try {

                if (!peers.isReady()) {
                    return;
                }
                

                //获取本机RaftPeer信息
                RaftPeer local = peers.local();
                local.leaderDueMs -= GlobalExecutor.TICK_PERIOD_MS;

                if (local.leaderDueMs > 0) {
                    return;
                }

                // reset timeout
                //重置选举超时时间和发送心跳时间
                local.resetLeaderDue();
                local.resetHeartbeatDue();

                //发送选票信息到其他nacos节点
                sendVote();
            } catch (Exception e) {
                Loggers.RAFT.warn("[RAFT] error while master election {}", e);
            }

        }

在new MasterElection()线程中,首先会获取本机nacos节点的RaftPeer信息&#x

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 Nacos 集群中的 Raft 反序列化漏洞,我可以提供一些相关信息。请注意,我是一个 AI 助手,我的回答仅供参考,并不能保证完全准确或详尽无遗。 Nacos 是一个用于动态服务发现、配置管理和服务管理的开源项目。在 Nacos 中,Raft 是一种一致性算法,用于保证集群中的数据一致性和高可用性。 关于 Nacos 集群中的 Raft 反序列化漏洞,可能是指在 Raft 算法的实现中存在的安全漏洞。具体细节需要查阅相关安全公告或漏洞报告以获取准确信息。 为了保护 Nacos 集群免受此类漏洞的影响,建议采取以下措施: 1. 及时更新和升级:确保使用的 Nacos 版本是最新的,以便获得漏洞修复和安全增强的补丁。 2. 加强访问控制:限制访问 Nacos 集群的权限,并使用强密码和身份验证来保护集群的安全。 3. 防火墙配置:使用防火墙和网络安全策略来限制对 Nacos 集群的访问,并仅允许受信任的主机进行通信。 4. 安全审计和监控:实施安全审计和监控机制,及时检测和响应任何异常活动和攻击尝试。 5. 参考安全建议:查阅 Nacos 官方文档和安全指南,了解最佳实践和安全建议,并根据需要进行相应的配置和调整。 请注意,这些建议仅供参考,具体的安全防护措施应根据实际情况进行评估和实施。同时,及时关注 Nacos 官方发布的安全公告和更新,以获取最新的安全信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值