节点初始状态为 candidate

// io.openmessaging.storage.dledger.MemberState#role
private volatile Role role = CANDIDATE;

处理选举的逻辑在 DLedgerLeaderElector 类中

io.openmessaging.storage.dledger.DLedgerLeaderElector#startup

leader follower candidate 在选举过程中分别有不同的行为

// io.openmessaging.storage.dledger.DLedgerLeaderElector#maintainState
private void maintainState() throws Exception {
    if (memberState.isLeader()) {
        // leader 定期发送心跳给其他节点
        maintainAsLeader();
    } else if (memberState.isFollower()) {
        // follower 保持检查 leader 发送心跳的时间
        // 如果太久没有收到心跳,则转变为 candidate 开始拉票
        maintainAsFollower();
    } else {
        // candidate 努力向其他节点拉票
        // 收到过半投票,则成为 leader
        maintainAsCandidate();
    }
}

candidate 收到 leader 的心跳后,会转变为 follower

处理心跳

// io.openmessaging.storage.dledger.DLedgerLeaderElector#handleHeartBeat

dledger 节点处理所有的网络请求

// io.openmessaging.storage.dledger.DLedgerRpcNettyService

不同类型的请求

// io.openmessaging.storage.dledger.DLedgerRpcNettyService#processRequest

public enum DLedgerRequestCode {
    UNKNOWN(-1, ""),
    METADATA(50000, ""),
    APPEND(50001, ""),
    GET(50002, ""),
    VOTE(51001, ""),
    HEART_BEAT(51002, ""),
    PULL(51003, ""),
    PUSH(51004, ""),
    LEADERSHIP_TRANSFER(51005, "");
}

 

posted on 2020-03-09 13:32  偶尔发呆  阅读(461)  评论(0)    收藏  举报