Setup

配置容灾集群涉及两部分:为 Redis 实例启用容灾配置,以及建立目标实例与源实例之间的连接。

Cluster Role Description

在容灾集群中,每个 Redis 实例的角色不是固定的;它可以是源端也可以是目标端。目标端不限制数据写入,但写入目标端的数据会被从源端同步过来的数据覆盖,或者因数据类型冲突导致同步失败。

目录

Source side

您需要先创建一个 Redis 实例。

CLI
Web Console

Enable Disaster Recovery

# Enable ActiveRedis
$ kubectl -n default patch redis s6 --type=merge --patch='{"spec": {"activeRedis":{"serviceID":0 }}}'

使用 LoadBalancer 作为源 Proxy 的访问地址

为实例启用容灾支持后,容灾 Proxy 默认提供一个基于 NodePort 的访问地址。单一 NodePort 访问地址的高可用性较低。在生产环境中,可以使用 LoadBalancer 地址为 Proxy 提供访问。

CLI
# Enable ActiveRedis with LoadBalancer as Proxy access type
$ kubectl -n default patch redis s6 --type=merge --patch='{"spec": {"activeRedis":{"proxy": {"service": {"type": "LoadBalancer"}}}}}'

每个容灾实例会创建一个 Proxy Service,名称格式为:activeredis-proxy-<instance-name>

Sentinel 实例的实例名需加前缀 rfr-

Target side

CLI
Web Console

Enable Disaster Recovery

# Enable ActiveRedis
$ kubectl -n default patch redis s6-dest --type=merge --patch='{"spec": {"activeRedis":{"serviceID":0 }}}'
WARNING

serviceID 的范围为 [0-15]。同一容灾集群中,serviceID 不能重复。

创建包含源端 default 用户密码的 secret

$ kubectl -n default create secret generic s6-src-auth-cred --from-literal=password=abc@123

配置容灾连接

# create activeredisconnections
$ cat << EOF | kubectl -n default create -f -
apiVersion: redis.middleware.alauda.io/v1alpha1
kind: ActiveRedisConnection
metadata:
name: conn-s6-dest-to-s6-src
spec:
addresses:
- 192.168.1.10:30010
instance: s6-dest
secretName: s6-src-auth-cred
EOF

注意替换源端地址和 secret。

检查容灾连接状态

$ kubectl -n default get activeredisconnections conn-s6-dest-to-s6-src -o yaml
apiVersion: redis.middleware.alauda.io/v1alpha1
kind: ActiveRedisConnection
metadata:
annotations:
  cpaas.io/creator: admin
  cpaas.io/updated-at: "2025-08-26T10:16:49Z"
creationTimestamp: "2025-08-26T10:16:49Z"
generation: 1
labels:
  cpaas.io/activeredis: s6-dest-activeredis
  cpaas.io/activeredis-instance: s6-dest
name: conn-s6-dest-to-s6-src
namespace: default
resourceVersion: "18872971"
uid: 283ac8fa-d693-46ff-989f-68d018888584
spec:
addresses:
- 192.168.1.10:30010
instance: s6-dest
pause: false
secretName: s6-src-auth-cred
status:
instance: s6-dest
shards:
- index: 0
  offset: "0"
  opId: "0"
  status: Connected
  syncStatus: PartialSync
status: Healthy
upstreamPeer:
  service_id: 0
  service_metadata:
    instance: default/s6-src

其中 status.shards[0].status 表示分片的连接状态,status.shards[0].syncStatus 表示数据同步状态。同步状态可以是 PartialSync(表示增量同步 Oplog)或 FullSync(表示正在同步 RDB)。

原生 Redis 哨兵模式没有分片的概念,这里将 Sentinel 的主从抽象为 shard 0,以兼容与 Redis 集群模式相同的数据结构。