架构

用户在 rds.valkey.buf.red/v1alpha1 中声明一个 Valkey 资源。Valkey Operator 会将其转换为更底层的资源,并负责其生命周期。

Valkey.spec.archOperator-managed resource主要工作负载和访问 Service
clusterCluster每个 shard 一个 StatefulSet;在启用外部访问时,还会提供一个 instance Service 以及每个 Pod 一个 Service。
failoverFailover and Sentinel一个数据 StatefulSet、一个 Sentinel StatefulSet、一个读写 Service、一个只读 Service,以及按需提供的每个 Pod Service。
replicaFailover without Sentinel settings一个数据 StatefulSet、一个读写 Service、一个只读 Service,以及按需提供的每个 Pod Service。

不要编辑由 Operator 管理的 ClusterFailoverSentinel 资源。请对其所属的 Valkey 资源应用更改,并让 controller 传播这些更改。

Reconciliation 流程

层级Resource责任
产品 APIValkey, User用户声明的拓扑、版本、资源、访问、配置、调度以及访问控制列表(ACL)意图。
拓扑 APICluster, Failover, SentinelOperator 生成的拓扑状态和操作进度。
Kubernetes workloadStatefulSet, Pod, Service, ConfigMap, Secret, persistent volume claim (PVC), Certificate由拓扑生成的运行时资源。
数据平面Valkey server, Sentinel, exporter命令、复制、槽位、故障检测和指标。

controller 会持续将声明状态与这些资源进行比较。对生成对象的手动更改可能会被覆盖,也可能掩盖失败操作的真实根因。

Cluster 架构

Cluster 有 16,384 个 hash slots。spec.replicas.shards 控制 shard 数量,必须介于 3 到 128 之间。spec.replicas.replicasOfShard 控制每个 shard 中的成员数量,必须介于 1 到 5 之间。

Operator 会为每个 shard 创建一个 StatefulSet,分配槽位,加入新成员,在 shard 扩缩容期间重新平衡槽位,并在 Pod 替换后修复成员关系。replicasOfShard: 1 会创建一个不带从节点的主节点;若要实现主从冗余,请至少使用 2 个。

Cluster 复制是异步的。在拓扑变更或故障期间,客户端必须遵循 MOVEDASK 重定向,并且在 Valkey Cluster protocol 所描述的故障窗口内,已确认的写入仍可能丢失。

Failover 架构

一个 Failover 实例只有一个数据 shard。其数据成员数量为 spec.replicas.replicasOfShard。Operator 还会创建或引用一个 Valkey Sentinel deployment。当 Operator 创建 Sentinel 时,其数量必须为奇数且至少为 3。Sentinel 监控主节点并协调故障切换。

Operator 暴露独立的读写 Service 和只读 Service。必须写入的客户端应使用读写 Service,并在故障切换后重新连接。

Replica 架构

Replica 架构使用与 Failover 相同的主从数据工作负载,但不部署 Sentinel。只有一个成员时,它的行为类似单节点实例。多个成员时,Operator 会维护复制并管理恢复,但应用程序不具备 Sentinel 发现或由 Sentinel 协调的故障切换。恢复依赖于 Operator 成功协调;应用程序继续使用按角色选择的读写 Service,并且在所选主节点发生变化时必须重新连接。

选择架构

RequirementClusterFailoverReplica
数据集大于单个主节点可容纳的容量YesNoNo
水平写入分布YesNoNo
自动槽位重新平衡Yes不适用不适用
由 Sentinel 协调的主节点故障切换NoYesNo
简单的主从拓扑NoYesYes
单节点开发形态NoNo是,且仅有一个成员时
需要支持 Cluster 的客户端YesNoNo

Cluster 的多键命令要求相关键映射到同一个 hash slot。Failover 和 Replica 会将完整数据集保留在每个数据成员上,因此受限于单个成员的可用内存。

存储和故障域

持久化存储可在 Pod 重新创建期间保护数据文件,这取决于 StorageClass、卷健康状况和 PVC 保留行为。它不能防止逻辑删除、数据损坏、namespace 或 cluster 丢失,也不能防止 Operator 错误。请使用经过独立测试的外部数据保护流程。

只有在存在足够的符合条件的 Kubernetes 节点和故障域时,反亲和性才能改善调度位置。部署在单个节点或单个存储故障域上的冗余 Valkey 拓扑无法提供基础设施级高可用性。

Reconciliation 和状态

高级资源报告以下阶段:

Phase含义
Initializing子资源正在创建或协调。
Rebalancing拓扑变更后,Cluster hash slots 正在迁移。
Ready根据 Operator 的判断,已协调的资源可用。
Failed当前协调报告了错误。请查看 .status.message、Events 和 Operator 日志;后续协调可能会更新该阶段。
Paused工作负载副本已通过 pause 注解缩减为 0。

使用以下方式检查完整的观测状态:

kubectl -n <namespace> get valkey <name> -o yaml
kubectl -n <namespace> describe valkey <name>
kubectl -n <namespace> get events --sort-by=.lastTimestamp

此架构引用的上游行为定义于 Valkey Cluster 规范复制文档Sentinel 文档