故障切换

当上游 Redis 实例发生故障时,您需要先对复制组执行灾备故障切换,然后将客户端的访问地址切换到提升后的实例。

适用于灾备模式

此操作步骤适用于 Redis 6.0 和 Redis 7.2 上的 Disaster Recovery 模式(spec.activeRedis.mode: peerof),在该模式下复制方向固定,其中一个实例为上游。

Active-Active 模式不包含此类故障切换步骤:每个成员都已处于活动状态并接受写入,因此从数据中心故障中恢复只需将客户端重定向到仍存活的成员即可。从网格中移除故障成员的操作请参阅移除成员。

复制组切换

在灾备组中,上游发生故障时,需要中断与故障上游之间的同步链路,并将下游端提升为上游,以确保客户端能够写入数据,同时避免故障上游中的脏数据污染下游实例。

故障切换时机说明

当复制组的上游发生故障时,下游端的 Alauda Cache Service E1 会检测到与上游之间的链路中断。此时,ActiveRedisConnection 资源的状态将变为异常,下游实例的 Web Console 会提示可以执行灾备切换。

灾备切换风险说明
需要注意的是,此异常提示仅为交互式告警提示,不应作为判断客户端是否可以执行灾备切换的唯一依据。

灾备切换

CLI
Web Console

查看连接状态

# View normal status
$ kubectl -n default get activeredisconnections
NAME           INSTANCE   STATUS    MESSAGE   AGE
c6-dest-conn   c6-dest    Healthy             35s

# View abnormal status
$ kubectl -n default get activeredisconnections
NAME           INSTANCE   STATUS   MESSAGE                                                                                          AGE
c6-dest-conn   c6-dest    Failed   shard 0 status is Disconnected; shard 1 status is Disconnected; shard 2 status is Disconnected   86s

当 STATUS 为 Failed 时,表示实例 c6-dest 与上游之间的连接异常。您可以查看 yaml 详细信息以了解具体情况:

$ kubectl -n default get activeredisconnections c6-dest-conn -o yaml
apiVersion: redis.middleware.alauda.io/v1alpha1
kind: ActiveRedisConnection
metadata:
  annotations:
    cpaas.io/creator: admin
    cpaas.io/updated-at: "2025-08-27T08:42:16Z"
  creationTimestamp: "2025-08-27T08:42:16Z"
  generation: 1
  labels:
    cpaas.io/activeredis: c6-dest-activeredis
    cpaas.io/activeredis-instance: c6-dest
  name: c6-dest-conn
  namespace: default
  ownerReferences:
  - apiVersion: redis.middleware.alauda.io/v1alpha1
    blockOwnerDeletion: true
    controller: true
    kind: ActiveRedis
    name: c6-dest-activeredis
    uid: ed1010f8-a70d-42ef-be19-0450478df137
  resourceVersion: "19592690"
  uid: 301f77be-ff52-4e50-98d0-d85a38e2415a
spec:
  addresses:
  - 192.168.1.11:30011
  instance: c6-dest
  pause: false
  teardownPolicy: Detach
status:
  instance: c6-dest
  message: shard 0 status is Disconnected; shard 1 status is Disconnected; shard 2
    status is Disconnected
  shards:
  - index: 0
    offset: "0"
    opId: "0"
    status: Disconnected
    syncStatus: PartialSync
  - index: 1
    offset: "0"
    opId: "0"
    status: Disconnected
    syncStatus: PartialSync
  - index: 2
    offset: "0"
    opId: "0"
    status: Disconnected
    syncStatus: PartialSync
  status: Failed
  upstreamPeer:
    service_id: 0
    service_metadata:
      instance: default/c6

断开与上游的连接

手动确认上游确实异常后,需要断开下游实例与上游之间的链路,以防止引入脏数据。

$ kubectl -n default delete activeredisconnections c6-dest-conn

删除相应的 ActiveRedisConnection 资源后,Redis 实例已成为独立的上游实例,此时可以安全地将客户端的访问地址切换到该实例进行读写。

故障切换时保留默认的 Detach 清理策略

删除连接时,会根据其 spec.teardownPolicy 拆除链路。请使用默认的 Detach,以便故障数据中心之后可以重新加入。仅当数据中心永久不可恢复时,才使用 Decommission——该操作不可逆,如果对端之后恢复,将强制执行完整重新同步。请参阅移除连接。

将故障上游用作新上游的下游

故障上游恢复正常后,可以将其作为提升后的上游的下游实例重新添加到复制组中。有关操作方法,请参阅设置灾备复制。

客户端灾备切换

在连接到复制组之前,客户端应支持在检测到上游故障后,将 Redis 访问地址切换到提升后的实例。通常有以下几种切换方式:

架构机制优势劣势对 RTO/RPO 的影响实施难度理想使用场景
DNS 切换更新 DNS 记录,使其指向新的 IP概念简单,与平台无关。RTO 较长且不可控(取决于 TTL),对 K8s 内部流量无效。RTO:分钟级
RPO:可能较高。
低RTO 要求较低的应用,或作为手动备用方案。
Proxy客户端连接到 Proxy,Proxy 通过运行状况检查将流量路由到主节点。切换速度快(秒级 RTO),对客户端透明,故障恢复简单。增加网络跳数和运维负担,Proxy 自身需要具备高可用性。RTO:秒级
RPO:低。
中推荐方案:需要快速且透明的切换,并且具备运维高可用 Proxy 集群的能力。
Service Mesh (Istio)Sidecar Proxy 拦截流量,并根据策略执行本地优先和跨集群切换。功能强大,对应用透明,故障恢复简单。运维复杂度极高,技术栈较重。RTO:秒级
RPO:低。
高已全面采用 service mesh 管理微服务的大型复杂系统。
客户端库库内置相关逻辑,自行决定切换到另一个集群。无中间层,延迟可能更低。风险极高:切换决策不可靠,故障恢复复杂(通常需要重启业务),并且生态支持不一致。RTO:不可预测
RPO:高风险。
中不建议用于生产级自动灾备。

客户端是否触发灾备切换不能仅通过二元决策来判断;切换是一个多维度、高可信度的决策过程。需要结合多个维度的故障检测进行处理,包括但不限于:the available status of the instance、whether the instance still has high availability、whether the k8s cluster has the possibility of continuing to serve、data center availability detection。

通常,在客户端安全执行灾备切换之前,需要满足以下表达式:

(Manual trigger switch)
OR
(
  (Upstream instance status check fails, and continues to fail for N times)
  AND
  (
    (The instance no longer has high availability)
    OR
    (The data center availability check fails, and continues to fail for N times)
  )
  AND
  (The downstream instance availability status check passes)
)
支持说明

Alauda Cache Service E1 当前不支持客户端灾备切换。客户需要根据自身基础设施实现合适的客户端切换方法。