RPC 类型
帧中的 tag 决定了 RPC 类型。每个 payload 都是以 postcard 序列化的 openraft 类型。
| tag | 名称 | 请求 payload | 响应 payload | 作用 |
|---|---|---|---|---|
1 | Vote | VoteRequest | VoteResponse | Leader 选举 —— 候选者向其他节点请求投票 |
2 | AppendEntries | AppendEntriesRequest | AppendEntriesResponse | 日志复制 + 心跳 —— leader 向 follower 传播已复制命令 |
3 | FullSnapshot | (Vote, SnapshotMeta, snapshot_bytes) 三元组 | SnapshotResponse | 向落后太多的节点发送完整的快照 |
- Vote —— 当 leader 挂掉时,心跳中断的节点会成为候选者并请求投票; 获得多数票的节点成为新 leader。
- AppendEntries —— leader 携带锁命令,作为日志条目提交。不含任何条目的 AppendEntries 就是心跳 —— 没有单独的心跳消息。
- FullSnapshot —— 向落后太多、无法通过日志追赶上的节点(或刚加入的节点) 发送完整的当前状态。整体一次性发送,在单个帧中完成,不做流式传输。
流程 —— Leader 挂掉时
节点 A
节点 B
节点 C
检测到 leader 心跳消失 → 成为候选者
Vote · 请求投票
Vote · 请求投票
同意
获得包含自身在内的多数派 → 成为新 leader
AppendEntries (无条目 = 心跳)
AppendEntries (无条目 = 心跳)
共识 RPC(Raft)
新选出的 leader 的第一次心跳到达的那一刻,集群就恢复了正常服务 —— 总体间隙通常为 0.5–1 秒。正常运行期间的 AppendEntries(日志复制)流程见 已复制命令。
术语
- 日志复制 (log replication) —— leader 把已决定的命令转换为有序日志, 让 follower 逐字记录。按相同顺序应用同一份日志,能让每个节点达到相同状态。
- 心跳 (heartbeat) —— 周期性发送的"我还活着"信号。一旦停止,follower 就会认定 leader 已挂掉,并发起选举。