节点初始状态为 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, ""); }