cockroachdb 中 range lease 转移由 lease 过期机制和节点健康状态动态驱动,非固定时间;locality 影响初始 holder 选择与转移倾向,但不直接控制频率;默认 9 秒 lease,到期前约 3 秒自动续期;仅当 holder 失联、超时或主动释放时才触发抢占式重新获取;lease acquisition 依赖 raft leader 身份与 locality 优先级排序;locality 标签用于亲和性调度,同 region/zone 优先,跨 region 默认禁止;高频转移通常源于节点震荡、locality 冲突、raft leader 频繁切换或手动干预;调优应优先解决系统稳定性问题。

CockroachDB 中 range lease 的转移频率并不由固定时间决定,而是由 lease 过期机制和节点健康状态动态驱动;locality group 设置本身不直接控制 lease 转移频率,但会显著影响 lease holder 的初始选择与后续转移倾向。
lease 是如何被获取和续期的
CockroachDB 的每个 range 默认持有 9 秒的 lease(可通过 --range-lease-duration 调整),lease 到期前约 3 秒,当前 holder 会尝试自动续期。只要 holder 节点心跳正常、网络可达、Raft leader 稳定,lease 很少主动转移。
- lease 不是“轮转”,而是“抢占式续期”:只有当 holder 失联、响应超时或显式放弃(如节点停机、重启)时,其他副本才发起新一轮 lease acquisition
- lease acquisition 使用 Raft leader 身份 + locality 排序共同决策:leader 必须是 lease 候选者之一,且候选者按 locality 优先级排序(例如
region=us-east,datacenter=dc1,rack=r1比region=us-west更优) - 一次 lease acquisition 成功后,不会因 locality 变更而自动迁移——除非 lease 过期或 holder 主动释放
locality group 如何间接影响 lease 分布
locality 并非配置成“group”,而是为每个节点指定一组键值对(如 --locality=region=us-east,zone=az1)。CockroachDB 在 lease 决策中使用这些标签做亲和性(affinity)与反亲和性(anti-affinity)判断:
- 同 region 下优先选择同 zone 的副本作为 holder,降低跨域延迟
- 若配置了多 region(如
region=us-east和region=eu-west),默认禁止跨 region lease holder(除非所有同 region 副本不可用) - 通过
ALTER RANGE ... CONFIGURE ZONE USING constraints='[+region=us-east]'可强制约束 lease holder 所在 locality,从而限制转移范围
什么情况下 lease 会高频转移
正常运行下 lease 转移极少发生(可能数小时甚至数天一次)。以下情况会触发异常频繁的 lease 变更:
- 节点频繁震荡:网络分区、CPU 过载导致心跳丢失、GC 停顿过长,使 lease holder 被误判为失效
- locality 配置冲突:多个节点使用相同 locality 标签(如都设为
region=global),削弱调度区分度,增加竞争概率 - raft leader 频繁切换:若 Raft leader 不稳定(如磁盘 I/O 高、时钟漂移大),lease holder 可能随 leader 变更而被动更换
- 手动干预:执行
cockroach node decommission或ALTER RANGE ... RELOCATE会强制触发 lease 转移
调优建议
若观察到 lease 频繁变更,应优先排查稳定性问题,而非调整 locality:
- 确认各节点系统时钟同步(NTP 或 chrony),误差建议
- 检查节点资源(CPU、内存、磁盘 I/O),避免 GC 或调度延迟导致 heartbeat timeout
- 确保 locality 标签具备区分性:避免全集群共用同一 region/zone,尤其在多云或混合部署场景
- 必要时可延长 lease duration(如设为 18s),但需权衡故障检测延迟;不建议低于 6s










