Leader Lease 如何支持线性一致读?
简化版
Leader Lease 让 Leader 在确认多数派近期仍认可自己后,在一段保守租约内直接服务读,省去每次 ReadIndex 的 quorum 往返。 安全依赖租约不重叠:旧 Leader 停止服务之前,新 Leader 不能开始对外提供冲突读写。 实现必须使用单调时钟、扣除消息往返与最大时钟漂移,并在任期变化、暂停或续约失败时立即停止租约读。
详细版
Leader 向多数派发送心跳,以本地发送时刻为租约起点;获得多数响应后,只在 leaseDuration 减 elapsed 再减 safetyMargin 的剩余时间内认为租约有效。 不能从最后一个响应到达时重新算完整租期,否则慢响应会过度延长旧 Leader 权限。
Follower 的选举超时和 Leader 租期必须由协议证明形成不重叠区间。 墙上时钟会回拨,不能用于租约;长 GC 暂停恢复后要重新核验。 租约只优化读路径,写仍需多数派提交,appliedIndex 也必须追到读所需的提交边界。
完整版教学
一、租约优化了什么
普通线性一致读可通过 ReadIndex 每次确认多数派。 网络往返在跨机房场景代价明显。 若 Leader 能证明一段时间内不会出现另一个合法 Leader,就可在窗口内本地读取。
租约是基于时间假设的性能优化;时间假设不成立时必须回退,而不能牺牲安全。
二、安全核心是不重叠
若旧 Leader L1 与新 Leader L2 同时认为租约有效,两边可能返回不同状态。 协议要保证 Follower 在旧租约可能有效期间不会选出并授权新 Leader。
L1 lease: [t0, t_expire)
L2 serving: [t_new, ...)
require: t_new >= t_expire under bounded-clock assumptions
这通常需要把 Leader 租期与 Follower 选举超时、漂移上界一起设计。
三、租约如何续期
Leader 在单调时钟 s 时发送带轮次的心跳。 收到多数派对当前 term 的响应后,可证明在从 s 开始的一段保守区间内仍获支持。 有效剩余时间按本地 elapsed 扣减,并预留网络与漂移裕量。 不得以最晚响应的接收时刻作为新租期完整起点,因为确认可能在网络中延迟很久。
四、为什么不能用墙上时钟
NTP 校时、人工改时或虚拟机迁移可能让 wall clock 回拨。 单调时钟只用于测量经过时长,不受日期调整影响。 即便用单调时钟,不同节点速率仍可能有漂移,因此协议要假定并配置最大 drift。 无法可靠界定漂移的环境不应把租约作为唯一安全依据。
五、GC 暂停与进程冻结
| 风险 | 错误做法 | 安全做法 |
|---|---|---|
| 续租 RPC 很慢 | 按最后一个 ACK 时刻重新起算 | 从本轮续租请求发出时刻保守起算 |
| 墙钟回拨 | 继续相信绝对时间 | 使用单调时钟并让租约失效 |
| 进程长时间暂停 | 恢复后沿用旧租约 | 检测超期,重新确认领导权 |
| 状态机应用落后 | 有租约就直接返回本地值 | 先等 appliedIndex 追到读屏障 |
Leader 暂停 10 秒,集群可能已经选出新 Leader。 旧进程恢复后若只看暂停前缓存的布尔标记,就会错误服务读取。 恢复时单调时钟应显示租约已过期;实现还要在任期变化和 RPC 错误时清除状态。 超出租期的请求不能继续执行,应转 ReadIndex 或返回重试。
六、状态机应用边界
租约证明当前仍是 Leader,不代表状态机已经应用全部已提交日志。 执行读前仍需确保 appliedIndex 达到该读的安全 commit 边界。 例如 commitIndex=500、appliedIndex=490,直接读会缺少 10 条已提交更新。 Leader Lease 不能掩盖 apply backlog。
七、降级和观测
租约续约失败时可回退 ReadIndex,而不是退化为未声明的陈旧读。 监控 lease remaining、续约延迟、失败率、时钟异常、GC pause、term change 和 apply wait。 混沌测试覆盖暂停、时钟速率偏差、单向网络和旧 Leader 恢复。 若平台无法保证时间边界,选择 ReadIndex 的额外 RTT 通常更稳妥。
八、常见误区与追问
- 误区:只要是 Leader 就可本地线性一致读。 它可能已经与多数派隔离。
- 误区:租约靠 NTP 时间相同即可。 需要单调时钟与有界漂移假设。
- 误区:收到最后一个 ACK 后重新计满租期。 网络延迟会不安全地延长权限。
- 误区:租约有效就无需等 appliedIndex。 状态机仍可能落后提交日志。
- 追问:租约过期怎么办? 停止快速读,重新续约、走 ReadIndex 或返回重试。
- 追问:GC 暂停为何危险? 暂停期间可能已选出新 Leader,恢复后旧权限必须失效。
- 追问:租约和 ReadIndex 如何选? 时间假设可信且延迟敏感可用租约,否则优先 quorum 确认。
九、加强记忆
- Lease 用时间窗口换掉逐次 quorum RTT。
- 安全来自旧新 Leader 租约绝不重叠。
- 从发送时刻保守计时,使用单调时钟并扣除漂移裕量。
- 暂停、任期变化或续约失败立即失效。
- Lease 证明领导权,不替代日志提交与状态机应用检查。