集群部署
生产集群=控制组(CP·Voter×3/5)+数据池(DP·Learner×N)。raft 是唯一复制通道: CP 组形成多数派承载配置写入与发布编排,DP 池只读复制编译产物并跑全部客户端流量。
标准拓扑(4 台起)
| 节点 | 角色 | 端口 |
|---|---|---|
| cp1/cp2/cp3 | voter(纯控制——零数据口) | 管理口 7901+Tier 口 7910 |
| dp1 | learner(流量) | 数据口 5010+Tier 口 7910 |
每台的 worker.json 见部署形态矩阵的逐形态装配段;
核心是三台 CP 共享同一张 members 表(含全部 Voter),DP 的表也是 Voter 全集。
1. 起控制组
按 CP 装配依次启动 cp1、cp2、cp3(先起第一台,其余自动跟随)。三台形成多数派后:
traffic-worker cluster status --admin http://10.0.0.11:7901
角色表应显示三个 Voter+Leader(先启动且完成选举的那台)+复制水位+各成员最后心跳。
2. 加入数据节点
DP 先以 learner 身份进入成员表,再启动进程——raft 原生把配置与产物快照安装给它, 追平后开始服务流量:
traffic-worker cluster member add dp1 --role learner --endpoint 10.0.0.21:7910 \
--admin http://10.0.0.11:7901
然后在 dp1 机器上启动 worker(learner 装配)。数据体(编译产物段)经指针物料化, 大产物不膨胀 raft 日志。
成员写操作仅 Leader 受理——发到非 Leader 返回 409 信封
KernLab.Traffic.Cluster.NotLeader(附当前 Leader 提示,按提示重发即可)。
3. 角色语义
| 角色 | 投票 | 全量日志 | 用途 |
|---|---|---|---|
voter |
✅ 计入多数派 | ✅ | 配置权威(CP) |
learner |
❌ 只读复制 | ✅ | 流量节点(DP)——零选举影响 |
witness |
✅ 计入多数派 | ❌ 不存 | 第三票防脑裂(轻载机) |
learner 追平后可提升为 voter(--role voter 重加);witness 用于「只有 2 台重机+1 台轻载」
的防脑裂场景。
4. 日常运维
traffic-worker cluster status # 角色/Leader/水位/健康/最后心跳
traffic-worker cluster member remove dp1 --admin http://10.0.0.11:7901
- 写配置:任何节点的管理口都可发——集群态写入经 raft 多数派落 CP;
- 扩容 DP:
member add --role learner→ 启动 → 追平 → 服务流量(可在线滚动); - 缩容:先
member remove再停进程; - 故障容忍:3 Voter 容忍 1 台故障;2 Voter 无法形成多数派——生产至少 3 台 Voter。
预算敏感形态
3 台 Voter 兼跑流量(CP 装配加 listen.port)——省掉 DP 层,代价是流量高峰与共识
心跳同进程共存。Voter 数量规则不变(至少 3)。
观测与排障
/readyz在 DP 上=存储+复制双确认(未追平=503+degradedReason);- 集群面故障(选举/追平/成员心跳)先看
cluster status的水位与最后心跳, 再看故障排查。