Table of Contents

集群部署

生产集群=控制组(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 的水位与最后心跳, 再看故障排查。