← 返回题目列表

Leader Lease 如何支持线性一致读?

高频 困难 第 8 / 26 题 更新于 2026/09/30
Leader Lease线性一致读时钟漂移Raft
学习 AI 实战项目

简化版

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 确认。

九、加强记忆

  1. Lease 用时间窗口换掉逐次 quorum RTT。
  2. 安全来自旧新 Leader 租约绝不重叠。
  3. 从发送时刻保守计时,使用单调时钟并扣除漂移裕量。
  4. 暂停、任期变化或续约失败立即失效。
  5. Lease 证明领导权,不替代日志提交与状态机应用检查。