【etcd】Lease 与 KeepAlive:TTL、checkpoint 与 Leader 切换

💡 原文中文,约5900字,阅读约需14分钟。
📝

内容提要

本文介绍etcd v3.5.33中Lease与KeepAlive机制:Lease由Leader管理,Renew不经Raft,Follower转发至Leader;Grant/Revoke/Checkpoint经Raft共识。Leader切换时Demote冻结expiry,Promote展期防风暴。Checkpoint周期写入剩余TTL,确保TTL可恢复。KeepAlive失败需区分本地或转发路径,避免误判Raft或磁盘问题。

🔎

延伸解读

KeepAlive 失败排查:先分清路径再归因

KeepAlive 失败时,不要直接归因于 Raft 或磁盘问题。文章指出,Renew 请求在 Leader 上本地处理,在 Follower 上则通过 HTTP 转发至 Leader。因此,排查时应先确认请求是否到达 primary lessor,以及是本地处理还是转发路径。若 Leader 切换,Demote 会冻结 expiry,可能导致 ErrNotPrimary,客户端需重连。区分这些场景,能避免误判故障根因。

Checkpoint 机制:Leader 切换后 TTL 可恢复的关键

etcd 的 Lease checkpoint 周期性将剩余 TTL 写入 Raft 日志,默认间隔 5 分钟,需通过 --enable-lease-checkpoint 启用。该机制解决了 Leader 切换后新 Leader 的时钟与旧 primary 的 expiry 不对齐的问题,确保 TTL 可恢复。但文章也指出,Promote 展期与 checkpoint 间隔下,最大 TTL 漂移上界依赖 ElectionTimeout 与 lease 数量,官方未给出形式化边界,运维时需注意。

Leader 切换时的展期与防风暴设计

Leader 切换时,旧 Leader 的 Demote 会将所有 lease 的 expiry 设为 forever,停止本地过期扫描,避免脑裂下双主各自续租。新 Leader 在 apply 完 noop entry 后执行 Promote,默认给所有 lease 展期 ElectionTimeout,并在 lease 数量较多时错开 expiry,防止切换后 revoke 风暴。这种设计在保证可用性的同时,也引入了 TTL 跳变的窗口,客户端需容忍短暂的多活现象。

Q&A

etcd中Lease的Grant、Revoke和Checkpoint操作是否经过Raft共识?

是的,Lease的Grant、Revoke和Checkpoint操作都经过Raft共识。其中Grant通过Raft propose后应用,Revoke通过Raft复制保证删除一致性,Checkpoint将剩余TTL写入共识日志。

etcd中KeepAlive(续租)请求是如何处理的?是否经过Raft?

KeepAlive(Renew)请求默认不经过Raft。在Leader节点上,Renew直接在本地lessor中执行;在Follower节点上,Renew会通过HTTP转发到Leader处理。

etcd中Lease checkpoint的作用是什么?如何启用?

Lease checkpoint的作用是周期性将剩余TTL写入Raft日志,以便在Leader切换后新Leader能够恢复Lease的剩余时间,避免因时钟不一致导致TTL漂移。启用方法:在etcd启动时添加--enable-lease-checkpoint参数,并可配置--lease-checkpoint-interval(默认5分钟)。

etcd Leader切换时,Lease的expiry是如何处理的?

Leader切换时,旧Leader会执行Demote(),将所有Lease的expiry设为forever(冻结),停止本地过期扫描;新Leader在应用完noop entry后调用Promote(ElectionTimeout),给所有Lease展期(refresh),并可能错开expiry以防止revoke风暴。

etcd中KeepAlive失败时,如何排查问题?

排查KeepAlive失败时,应先区分请求是否到达primary lessor,以及Renew是走本地还是HTTP转发。如果返回ErrNotPrimary,说明请求到达了Follower,需要转发到Leader;如果返回ErrGRPCNoLeader,常见于stream context取消映射,与Raft或磁盘问题无关。

etcd中Lease过期删除的流程是怎样的?

Lease过期删除由lessor的runLoop每500ms扫描一次,发现过期Lease后通过revokeExpiredLeases将其送入expiredC,然后由etcdserver通过Raft发起LeaseRevoke操作,确保删除操作经过共识复制,并触发Watch DELETE事件。

etcd中Lease的TTL范围是多少?

Lease的TTL以秒为单位,最小值为minLeaseTTL,最大值为MaxLeaseTTL(9e9秒)。

🏷️

标签

➡️

继续阅读