U60 租约/fencing 真实服务验证
授权权威为本机 Redis 8.6.4 standalone(Lua 原子授予:generation 独立持久键 INCR、租约键 PEXPIRE、owner 校验续租),资源为本机 MySQL 8.4.7((max_fence,last_seq) 字典序条件更新、业务写与幂等判定同事务)。两个独立服务、两个独立持久状态,不共享事务——正是租约协议的前提。
实验代码bash
python3 labs/correctness-u60/run.py观察行以 U60 前缀逐字回收(11 组);独立 study_u60_* schema 与 u60:* Redis 键定向清理;失败不覆盖成功证据。
| 场景 | 观察 |
|---|---|
| 租约获取 | generation 原子递增、request_id 幂等记录在权威集合 |
| owner 校验续租 | 非持有者拒绝、持有者成功 |
| 过期接管 | 真实等待 PX 过期后 B 获 fence=2(41/42/41 时间线) |
| fencing | B(fence=2) 提交成功、A(过期 fence=1) 被资源条件更新拒绝 |
| op_seq 顺序 | (fence,seq) 字典序拒绝迟到 seq1 |
| 业务幂等 | 同键同摘要返回原结果、异参报冲突 |
| 清理 | 独立 schema DROP、Redis u60:* 键删除 |
实现级反例(已写进[租约和 fencing 令牌](../../分布式系统与中间件/正确性与租约/租约和 fencing 令牌.md)):generation 曾存于会过期的租约键,过期后归零导致 B 拿到与 A 相同的 fence——持久高水位必须与租期状态分开。
边界:单机 Redis 为唯一权威(其故障即活性边界);未运行跨主机网络故障、多权威共识、时钟注入与生产容量。