扩容与缩容
显式加入和分配数据节点,并在完整安全证据下排空和移除节点。
扩缩容由“节点生命周期”和“资源迁移”两个独立过程组成。加入节点不会自动承载 Slot;把节点标记为离开也不会自动关闭已有连接或删除基础设施。
固定的物理哈希槽
集群始终使用 256 个物理哈希槽。扩容是把现有 Slot 的副本或 Leader 分配到新节点,不是增加物理哈希槽;缩容也不删除物理哈希槽。
扩容前检查
- 新节点使用唯一、正整数
node.id和独立持久化node.data_dir; - Transport 地址可被所有集群节点双向访问,目标集群 ID 和配置世代一致;
- 新旧节点运行兼容制品,副本数、故障域和磁盘/网络余量满足目标;
- Manager 可以观察新节点健康、运行时和控制状态;
- 同一批次没有冲突的 Slot 迁移、缩容或 Controller 任务。
扩容流程
- 按多节点集群准备节点,并通过种子节点与 Join Token 启动加入流程。
- 在 Manager 确认节点处于
joining,且 Transport、控制镜像、运行时、集群 ID 和控制版本全部满足就绪门槛。 - 激活节点。激活只改变节点生命周期,不会自动重平衡 Slot。
- 为已激活的数据节点生成 onboarding 计划;一次只选择
1..5个 Slot 迁移。 - 启动或推进任务,等待 Controller 任务、Slot Raft 学习者/成员变更和最终分配提交完成。
- 每批后检查
/readyz、副本/ISR、Leader、任务、队列、延迟和业务消息,再继续下一批。
动态加入只添加普通数据节点。Controller voter 提升是需要 cluster.controller:w 的独立高风险操作,不是扩容的默认步骤,也不会自动发生。
缩容流程
scale-in 状态与诊断读取需要 cluster.node:r,计划、启动、排空、推进和移除需要 cluster.node:w。独立查看 Slot 清单/日志或执行 Leader 迁移等 Slot 操作时,才另外需要 cluster.slot:r / cluster.slot:w。目标必须是非 Controller 的数据节点。
- 计划:读取 diagnostics 与 scale-in status,确认替代节点健康、可调度且有容量。
- 标记离开:启动 scale-in,把目标持久化为
leaving,阻止规划器分配新工作。 - 排空新连接:开启 Gateway drain。它只拒绝新会话,不会关闭已有会话;等待在线、关闭中和待激活计数归零。
- 迁移 Slot:预览并按稳定 Slot 顺序推进有界
slot_replica_move任务。每批完成后重新规划。 - 清理 Channel 阻塞:确认目标不再是 Channel Leader、配置副本或 ISR 成员,且没有引用目标的活动迁移任务。
- 等待安全门槛:只有健康、运行时版本、Controller、Slot、Channel 清单和任务证据都新鲜且一致时,状态才会给出
safe_to_remove=true。动态节点诊断随后会把recommended_next_action显示为ready_to_remove;它是从该布尔门槛派生的操作提示,不是第二个生命周期状态。 - 移除成员:使用状态中的控制版本作为 fence 提交 remove;冲突时重新读取,不绕过检查。
- 最后缩减基础设施:Manager 到此只写入 removed tombstone。之后才由独立的基础设施流程停止进程或缩减实例。
失败关闭
缺失或过期的健康、运行时、控制版本、Slot 状态、任务或 Channel 清单都会保持不安全。缩容逻辑不会猜测未知数据,也不会关闭已有连接、迁移 Channel 元数据、取消任务或调用 Kubernetes 缩容。
如果任务失败或长时间无进展,停止 advance,保留节点运行,检查任务审计、Slot 实时状态和阻塞原因。不要直接停止进程或删除数据目录。