etcd-raft leader选举 2.3.7

本文详细解析了etcd-raft中领导者选举的过程,包括节点间通信、心跳超时、角色转换、竞选消息构造及处理。重点讨论了节点如何从follower转变为candidate,发起竞选并发送MsgVote请求,以及follower接收到请求后的判断逻辑和投票响应。
摘要由CSDN通过智能技术生成

如果不了解etcd-raft集群中各个节点间怎样通信的可以参考下etcd-raft 2.3.7 raft peer间的交互通信流程


raft的leader的选举,依赖于心跳包的超时,etcd-raft的周期性心跳信号由定时器产生,该定时器在扩展的raftNode(raft.node实现raft.Node接口)类中启动,由于raftNode节点一般为扩展etcd-raft算法的结合需求的可定制类,之所以把tick的产生信号放在raftNode主要是方便修改心跳超时时间时不用修改raft协议核心代码,可以见EtcdServer的raftNode:

// etcd-2.3.7/etcdserver/raft.go
// start prepares and starts raftNode in a new goroutine. It is no longer safe
// to modify the fields after it has been started.
// TODO: Ideally raftNode should get rid of the passed in server structure.
func (r *raftNode) start(s *EtcdServer) {
    // ...

    heartbeat := 200 * time.Millisecond
    if s.cfg != nil {
        heartbeat = time.Duration(s.cfg.TickMs) * time.Millisecond
    }   
    // set up contention detectors for raft heartbeat message.
    // expect to send a heartbeat within 2 heartbeat intervals.
    r.td = contention.NewTimeoutDetector(2 * heartbeat)

    go func() {
        var syncC <-chan time.Time

        defer r.onStop()
        islead := false

        for {
            select {
            case <-r.ticker:
                r.Tick()
            //....
            } // select
        } // for
    }()
}

etcd-raft算法模块接收这个信号是在,raft.node.run方法中,通过node.ntick channel接收然后调用raft.raft的tick:

// etcd-2.3.7/raft/node.go
// raftNode就是调用node的这个方法往里面写入周期的心跳信号
func (n *node) Tick() {
    select {
    case n.tickc <- struct{}{}:
    case <-n.done:
    }
}

func (n *node) run(r *raft) {
    // ...

    for {
    // ...
       select {
       // ...
       case <-n.tickc:
            r.tick()
        // ...
        } // select
    } // for
}

raft.node在收到tickc的信号之后最终会调用raft.tick,由于raft.tick是一个函数变量,在该raft处于不同的角色时tick指向的函数不一样,由于本节记录的选举,所以当前节点应该处于candidate阶段,这个阶段应该调用的是tickElection,从下面几个函数里面 可得到相关tick的变化信息:

// etcd-2.3.7/raft/raft.go

func (r *raft) becomeFollower(term uint64, lead uint64) {
    r.step = stepFollower
    r.re
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值