feat(M6): token ring data plane + engine — pending adds disappear on claim, topology written back for full cluster view (per authoritative design)

This commit is contained in:
2026-08-18 08:24:37 +08:00
parent 5bd70b90c0
commit f6c4b91a96
9 changed files with 1166 additions and 202 deletions

49
plan.md
View File

@ -78,17 +78,48 @@
> 注:发布类条目已并入 **M7 运维与发布(原 M5)**,本节 M5 保留初始清单。
>
### M6 集群内 frpc 二进制分发(节点间优先,外部 URL 兜底)
### M6 集群(令牌环网拓扑)
> 诉求:集群内 frpc 二进制**优先通过集群节点间交换**获得,无法交换时才走外部 URL 下载;新节点加入集群时,**自动由邻居节点向其传输二进制**。
> **权威设计(用户约定,必须固化)**:集群节点间通过**令牌环网(token ring)**通信,两轮为一个周期。
- [x] 二进制来源优先级:本地已有缓存 > 集群节点间交换(HTTP/Chunked 拉取) > 外部 URL(GitHub Releases)
- [x] 节点注册表:Registry(peers/nodeInf 内存态)+ EnsureVersion 优先级分发
- [x] 传输通道:节点间 HTTP GET /frpc/{version}(Basic Auth + 256MiB 上限 + SHA-256 校验),回退 GitHub URL
- [x] 入网引导:new node joins with -peer and auto-pulls binary from neighbors (verified e2e)
- [x] 失败回退:EnsureVersion 内建回退外部 URL(单测覆盖 peer 优先 + 回退)
- [ ] Cache 管理:版本保留策略(LRU / 仅保留常用)、可用性标记(黑名单失效节点)
- [ ] UI:设置页展示二进制来源与缓存状态,集群页展示节点间传输进度
#### 拓扑与角色
- 集群 = 若干 webui4frpc 节点组成的内网协作网络;逻辑上各节点**平等**,均持有**完整集群信息**(节点表、转发链、各自配置)与完整 webui。
- **leader**:唯一特殊角色,负责启动时发送第一个令牌;默认**创建集群的节点**为初始 leader。
- **转发链(ring)**:令牌按固定顺序传递;每个节点记录前驱/后继。
#### 令牌环协议(两轮一周期)
- **第一轮**:令牌在环上传递,各节点收到后**把自己的信息追加到令牌**(地址、负载指标、frpc 缓存、转发能力等)。
- **第二轮**:令牌再次环行,各节点**按令牌内容同步集群信息**(更新自己的完整集群视图)。
- 新转发任务:需要建立转发时,**把任务附加在令牌中**(而非直接指派);因每节点都持完整集群信息,由**负载最低的节点**(**内存使用率 + 网络使用率共同判断**)自行摘取并创建转发。
- **负载摘取**:令牌传递到某节点时,若该节点在上一轮被判定为负载最低,则**先主动摘取任务**,随后在令牌中更新自身信息。
#### 容错与邻居离线
- 令牌传递超时(未收到回执)→ 判定邻居离线。因每节点持完整集群信息,当前节点可**自动修改集群状态**,并把邻居负责的转发**作为新任务追加到令牌**,再传给下一节点。
- leader 检测令牌丢失:发出令牌后超过 **(轮次延迟 / 2 + 20ms)** 未回传 → 判定令牌丢失(可能某节点接令后崩溃),**重发令牌**。
- leader 每轮探测后更新一次轮次延迟。
#### leader 补充/监控
- leader 受其上家邻居监控:二者**交换心跳包**(因节点都持完整信息,容易做到)。
- 上家邻居探测到 leader 崩溃 → **自身成为新 leader**。
#### 新节点加入
- 每个节点都有 webui;用户登录到哪个节点的 webui,就由**该节点**执行新节点加入:令牌发到自己时,**先转发给新节点**,并把新节点加入令牌中的集群信息,**更新转发链**:新节点放在自己后面,自己原本的后继放在新节点之后。
#### 实现里程碑(待按上述设计重建)
- [ ] 数据面:TypeSet 集群状态(节点表/转发链/leader/轮次延迟/负载指标/待办任务),每节点一份完整副本
- [ ] 令牌环传输:HTTP 轮转传递 + 回执;两轮一周期(信息追加 → 同步)
- [ ] leader:初始 leader 选择(创建集群者)、首令牌发送、轮次延迟测量、令牌丢失重发
- [ ] 新转发任务:挂到令牌 → 各节点负载评估(内存+网络)→ 负载最低节点摘取并创建
- [ ] 离线处理:令牌超时 → 改集群状态 → 邻居转发转任务重挂
- [ ] leader 监控:上家邻居心跳探测 → 崩溃提升为新 leader
- [ ] 新节点加入:入口节点 webui → 令牌插入新节点 + 更新转发链
- [ ] 前端:集群页展示环拓扑/令牌轮次/负载/任务摘取;设置页二进制缓存状态
### M7 运维与发布(原 M5)