Ticketing
文档

RPC 类型

中的 tag 决定了 RPC 类型。每个 payload 都是以 postcard 序列化的 openraft 类型。

tag名称请求 payload响应 payload作用
1VoteVoteRequestVoteResponseLeader 选举 —— 候选者向其他节点请求投票
2AppendEntriesAppendEntriesRequestAppendEntriesResponse日志复制 + 心跳 —— leader 向 follower 传播已复制命令
3FullSnapshot(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 已挂掉,并发起选举。