Cluster 分片扩缩容

在所属的 Valkey 资源上修改 spec.replicas.shards,以添加或移除 Cluster 分片。支持范围为 3–128。Operator 会创建或删除分片工作负载, 并重新平衡 16,384 个哈希槽。

此操作步骤仅适用于 spec.arch: cluster。对于 Failover 或 Replica 成员变更,请使用 更新和扩缩容

准备开始

  • 确认高层资源处于 Ready 状态,并且 Cluster 报告所有槽位均已分配。
  • 不要将分片扩缩容与服务器升级、滚动重启、存储、访问、调度、TLS 或配置变更同时进行。
  • 确认支持 Cluster 的客户端会遵循 MOVEDASK 重定向。
  • 请在流量较低时安排此操作。重新平衡会消耗 CPU、内存和网络带宽,并可能增加请求延迟。
  • 扩容时,确保每个新增分片成员及其持久卷声明(PVC)都有足够容量。
  • 缩容时,确保剩余分片能够容纳迁移后的数据集以及正常运行开销。Operator 不会执行外部容量规划,也不会创建备份。

记录基线:

kubectl -n default get valkey valkey-cluster -o yaml > valkey-before-scaling.yaml
kubectl -n default get pods,pvc,service -l buf.red/name=valkey-cluster -o wide
kubectl -n default exec <ready-cluster-pod> -c valkey -- \
  valkey-cli CLUSTER INFO
kubectl -n default exec <ready-cluster-pod> -c valkey -- \
  valkey-cli CLUSTER NODES

如果需要访问控制列表(ACL)身份验证,请添加 --user <username> --askpass,并使用 kubectl exec -it 分配一个终端。

扩容

此示例将 Cluster 从三个分片增加到四个分片,并将每个分片保留两个成员:

kubectl -n default patch valkey valkey-cluster --type=merge \
  -p '{"spec":{"replicas":{"shards":4,"replicasOfShard":2}}}'

replicasOfShard 的值表示一个分片中的成员总数,包括主节点。除非同一次维护操作有意同时更改冗余和容量,否则请保留现有值。

缩容

在移除分片之前,请对所有主节点比较数据集大小和可用内存。不要直接从其他产品复制固定的内存系数;所需余量取决于工作负载、持久化、碎片化、客户端缓冲区、模块以及目标 Valkey 版本。

此示例将一个四分片 Cluster 缩减为三个分片:

kubectl -n default patch valkey valkey-cluster --type=merge \
  -p '{"spec":{"replicas":{"shards":3,"replicasOfShard":2}}}'

Operator 必须先将槽位迁移离开要删除的分片,然后才能删除其工作负载。不要手动删除 StatefulSets、Pods 或 PVCs 来加快该操作。

监控进度

查看高层阶段、消息、节点、子 Cluster 状态、Pods 和 Events:

kubectl -n default get valkey valkey-cluster -w
kubectl -n default get valkey valkey-cluster \
  -o jsonpath='{.status.phase}{"\n"}{.status.message}{"\n"}{range .status.nodes[*]}{.podName}{"\t"}{.role}{"\t"}{.slots}{"\n"}{end}'
kubectl -n default get cluster valkey-cluster -o yaml
kubectl -n default get pods -l buf.red/name=valkey-cluster -w
kubectl -n default get events --sort-by=.lastTimestamp

Rebalancing 表示正在移动槽位。创建或删除工作负载时可能会出现 Initializing。在阶段为 Ready.status.message 清空之前,不要提交另一项拓扑变更。

验证完成

在一个就绪的数据 Pod 中运行健康检查命令:

kubectl -n default exec <ready-cluster-pod> -c valkey -- \
  valkey-cli CLUSTER INFO
kubectl -n default exec <ready-cluster-pod> -c valkey -- \
  valkey-cli CLUSTER NODES

验证以下所有项:

  • 报告 cluster_state:ok
  • 所有 16,384 个槽位均已分配,且没有失败槽位;
  • 存在所需数量的分片和成员;
  • 每个预期的 Pod 都已就绪,且每个必需的 PVC 都已绑定;
  • 应用的读写可通过支持 Cluster 的客户端成功执行;
  • 延迟、内存、网络和 exporter 指标已恢复到可接受范围。

故障边界

在迁移进行期间,不要立即修补旧的分片数量。第二次拓扑变更会让恢复更困难。请保留 Valkey 和子 Cluster 的 YAML、Events、Operator 日志、CLUSTER INFOCLUSTER NODES 输出。请先修复调度、存储、网络或容量故障;如果协调无法继续,请遵循产品支持恢复方案。