快照 (Snapshot)
落后太多、无法通过日志追赶上的节点(例如刚重启后)会通过 FullSnapshot RPC 收到完整的当前状态。 snapshot_bytes 内部是以 postcard 序列化的以下结构。
| 字段 | 内容 |
|---|---|
last_applied | 该快照所反映的最后一个日志位置 |
last_membership | 成员关系(节点组成)信息 |
token_seq | 围栏令牌的签发计数器 —— 已被复制,因此即使发生 leader 变更,令牌单调性依然成立 |
locks | 一份 (key, token, remain_ms) 列表 —— 每一把被持有的锁及其剩余租约时间 |
remain_ms是在拍摄快照那一刻,以毫秒为单位的剩余租约时长。安装该 快照的节点会用自己的时钟把过期时间恢复为now + remain_ms—— 从不发送 任何绝对时间戳,因此节点间的时钟漂移不会造成任何影响。- 毫秒仅在此处使用,是为了精度考虑(面向客户端的单位是秒)。
- Raft 日志存于内存中(易失)。重启的节点以空状态启动,然后通过对端的日志 复制或本快照追赶上进度 —— 只要多数派节点存活,已提交的状态就会被保留。
流程
领导者
落后节点
重启后 —— 以空状态启动
AppendEntries
落后太多,无法通过日志追赶
FullSnapshot —— 整个状态装在一帧中
安装:将每把锁恢复为 now + remain_ms
恢复为普通的 AppendEntries 日志条目
共识 RPC(Raft)
术语
- 快照 (snapshot) —— 特定时间点状态的完整副本。它让落后的节点可以先安装 快照,再只追赶其后的日志条目,而不必从头重放所有内容。
- 成员关系 (membership) —— 构成集群的节点列表及其角色信息。