Set Up Active-Active Replication
Active-Active mode is alpha and is available on Redis 7.2 only. It is not supported on Redis 6.0 — admission rejects it.
Setting up Active-Active replication has two parts: enabling Active-Active mode on each Redis instance, and creating one ActiveRedisMesh per member so that the members can find each other. For how the mode works — discovered membership, the two ports, conflict resolution, and the clock requirement — read Architecture first. For how it compares with Disaster Recovery, see Choosing a mode.
TOC
PrerequisitesStep 1: Create the peer-auth credential in each datacenterStep 2: Enable Active-Active mode on each instanceStep 3: Create an ActiveRedisMesh in each clusterSeed syntaxOptional fieldsStep 4: Verify convergenceMesh phasesMember statesVersion fieldsNext stepsPrerequisites
- Every member runs Redis
7.2. - Each member has a distinct
serviceIDin the range[0-15]. - Each member's proxy is reachable from every other member on both port
6379(RESP, used by seeds) and port7379(peer port, which carries both gossip and replication). - The system clocks of all members are synchronized, through a time-synchronization daemon (
ntpd,chronyd, or the platform equivalent) on every node of every cluster in the group. This is a hard prerequisite, not a recommendation — see Clock synchronization.
Step 1: Create the peer-auth credential in each datacenter
Every peer link in an Active-Active group authenticates, and every member must present the same username and the same password value. Create the credential in each datacenter before enabling the mode. This is the same credential Disaster Recovery uses; if these instances already carry one, skip to Step 2.
spec.archmust match the architecture of the referenced instance (sentinel,cluster, orstandalone).
Wait for the user to be applied:
The module accepts an inbound peer only when the username it presents equals the local peer-auth username. Every member of the group must therefore bind a RedisUser with the same spec.username and the same password value. The RedisUser resource names may differ, but the credential values may not.
Step 2: Enable Active-Active mode on each instance
These steps assume instances that are being placed into an Active-Active group from the start. Admission does not block changing spec.activeRedis.mode from peerof to mesh on an instance that is already replicating, but converting an established Disaster Recovery group to Active-Active is not a covered procedure and has not been validated. Build an Active-Active group from instances that are not already wired into a Disaster Recovery group.
Members must advertise an externally-routable address, because a peer re-resolves it on every dial. This is the announceAddress, set on the proxy Service configuration.
- A DNS name is recommended: the module re-resolves it on every dial, so it survives IP changes, and a multi-A record can cover several NodePort addresses. When the announce address is a DNS name, the operator binds it to the proxy Service through ExternalDNS.
- A bare IP is accepted with a warning — it will not re-resolve after an IP change, so it is only appropriate for a stable VIP.
- Leaving it empty produces a warning and the module advertises the pod IP, which is not routable across datacenters.
- An address containing a scheme (
tcp://…), a port (host:7379), or a path is rejected. The port belongs inannouncePort.
announcePort applies to the gossip control plane only. The module always advertises its own local peer port (7379) for replication, so any external endpoint must expose 7379 as 7379.
Step 3: Create an ActiveRedisMesh in each cluster
Each Kubernetes cluster owns one ActiveRedisMesh for its local instance. spec.seeds names the externally-routable proxy RESP addresses of members in other datacenters.
Seed syntax
A seed is host:port, where the port is the remote proxy's RESP endpoint — normally 6379. An optional @peer-port suffix overrides the peer port when an external load balancer remaps it; when the suffix is omitted the operator appends the conventional 7379. The operator normalizes the list before injecting it, so redis-dc2.example.com:6379 becomes redis-dc2.example.com:6379@7379.
One reachable seed per remote datacenter is enough — gossip discovers everything else. The local member's own entry may be included, so every datacenter can carry the same uniform seed list; the module skips its own record.
The operator injects the normalized set on every node, replicas included, so the mesh auto-starts on every pod. Restart and failover re-entry are therefore zero-touch.
Optional fields
Step 4: Verify convergence
Mesh phases
Member states
A member is alive, suspect, or dead — see Membership lifecycle.
clockOffsetMs is each member's clock offset relative to this instance, in milliseconds. See Clock synchronization.
Version fields
status.fleetFloorVersion reports the lowest Redis version across non-dead members that report a known version — the feature ceiling for the whole mesh. status.versionConverged is true once every non-dead member runs the same Redis and module version.
This is expected and handled by the module; it does not fail the mesh phase. It becomes true again once the fleet converges.
Next steps
Day-2 work — monitoring clock skew, adjusting the gossip timers, and adding or removing members — is covered in Operations.