KubeBlocks
BlogsKubeBlocks Cloud
⌘K
​
KubeBlocks for Redis

Cluster Management

Create and connect
Scale
Expand volume
Restart
Stop/Start
Delete protection

Configuration

Configure cluster parameters

High Availability

High Availability for Redis
Redis Cluster Mode
  1. What is Redis Cluster Mode
  2. Basic Ops
    1. Before you start
    2. Create clusters
    3. Connect to clusters
    4. Scale shards
    5. Scale replicas
    6. Resource scaling/reconfiguration
    7. Expand volume
    8. Restart
    9. Stop/Start
    10. Back up & Restore

Redis Cluster Mode

While Redis Sentinel clusters provide excellent failover support, they do not inherently provide data sharding. All data remains on a single Redis instance, limited by its memory and performance capacity. Therefore, it may impact horizontal scalability when dealing with large datasets and high read/write operations.

KubeBlocks now supports Redis Cluster Mode, which not only allows for greater memory distribution but also parallel processing, significantly improving performance for data-intensive operations. A brief overview of Redis Cluster Mode and its basic operations will be elaborated in this documentation.

What is Redis Cluster Mode

Redis Cluster Mode is a distributed deployment mode of the Redis database used to horizontally scale data storage and improve system availability across multiple nodes.

In Redis Cluster Mode, the cluster manages data through a sharding mechanism and provides capabilities for data replication, failover, and traffic routing among shards. This sharding mechanism enables distributing a large amount of data across different nodes, achieving horizontal scalability and load balancing.

Redis Cluster Mode ensures high availability through master-slave replication. Each master node can have one or more slave nodes that replicate the data from the master and provide read services. In case of a master node failure, a slave node can automatically take over the master's role and continue serving, ensuring failover and fault tolerance.

Redis Cluster Mode also provides communication and data migration mechanisms among cluster nodes. When there are changes in the cluster, such as adding nodes, node failures, or node removal, Redis Cluster automatically performs data migration and resharding to maintain data balance and availability.

Basic Ops

Below is a brief introduction to the basic operations of Redis Cluster Mode.

Before you start

  • Install KubeBlocks Make sure your KubeBlocks and addon are version 0.9 or above.

  • Make sure the Redis Addon is enabled.

  • View all the database types and versions available for creating a cluster.

    Make sure you can get the redis componentdefinition. It is used to describe and define the components in a database cluster, and usually presents basic information such as the name, type, version, status, etc.

    kubectl get componentdefinition redis-cluster-7.0
    >
    NAME                SERVICE         SERVICE-VERSION   STATUS      AGE
    redis-cluster-7.0   redis-cluster   7.0.6             Available   33m
    
  • To keep things isolated, create a separate namespace called demo throughout this tutorial.

    kubectl create namespace demo
    >
    namespace/demo created
    

Create clusters

Since Redis Cluster Mode is based on the latest ShardingSpec API, currently it can only be created by Helm or YAML files using kubectl.

NOTE

Redis Cluster Mode requires a minimum of three shards, so the number of shards cannot be less than 3.

# Example 1: Creating a Redis Cluster with three shards, each shard having one replica (one master, one replica)
helm install redisc xxxxx(chart remote address) --set mode=cluster --set redisCluster.shardCount=3 --set replicas=2 -n demo

# Example 2: Creating a Redis Cluster with three shards, each shard having one replica (one master, one replica), and enabling NodePort access
helm install redisc xxxxx(chart remote address) --set mode=cluster --set nodePortEnabled=true --set redisCluster.shardCount=3 --set replicas=2 -n demo
kubectl apply -f redis-cluster-example.yaml

Example 1: Redis Cluster without NodePort enabled

apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
  name: redisc
  namespace: demo
spec:
  affinity:
    podAntiAffinity: Preferred
    topologyKeys:
    - kubernetes.io/hostname
  clusterVersionRef: redis-7.0.6
  shardingSpecs:
  - name: shard
    # Specify the number of shards, which cannot be less than 3
    shards: 3
    template:
      componentDef: redis-cluster-7
      name: redis
      replicas: 2
      # Specify resources for a single shard
      resources:
        limits:
          cpu: 500m
          memory: 512Mi
        requests:
          cpu: 500m
          memory: 512Mi
      serviceVersion: 7.0.6
      volumeClaimTemplates:
      - name: data
        spec:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 20Gi
  terminationPolicy: Delete

Example 2: Redis Cluster with NodePort enabled

apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
  name: redisc
  namespace: demo
spec:
  affinity:
    podAntiAffinity: Preferred
    topologyKeys:
    - kubernetes.io/hostname
  clusterVersionRef: redis-7.0.6
  shardingSpecs:
  - name: shard
    # Specify the number of shards, which cannot be less than 3
    shards: 3
    template:
      componentDef: redis-cluster-7.0
      name: redis
      replicas: 2
      # Specify resources for a single shard
      resources:
        limits:
          cpu: 500m
          memory: 512Mi
        requests:
          cpu: 500m
          memory: 512Mi
      serviceVersion: 7.0.6
      # Enable NodePort
      services:
      - name: redis-advertised
        podService: true
        serviceType: NodePort
      volumeClaimTemplates:
      - name: data
        spec:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 20Gi
  terminationPolicy: Delete

Once the cluster is created, wait until the cluster status changes to running. Then, run kubectl get component -n demo | grep redisc-shard to view the roles of nodes in the cluster.

kubectl get component -n demo | grep redisc-shard
>
redisc-shard-5hn            redis-cluster          Running   79m
redisc-shard-7zk            redis-cluster          Running   79m
redisc-shard-5tw            redis-cluster          Running   79m

Connect to clusters

Redis Cluster Mode requires using specific client SDKs for connection. Currently, there are Redis Cluster client SDK implementations available in different popular programming languages. You can choose the appropriate SDK based on your requirements. For example, Jedis or Lettuce for Java, go-redis for Golang, etc.

Note that when using an SDK, you need to configure the addresses of each node in the Redis Cluster. According to whether NodePort is enabled or not, there are two different configurations:

Example 1: Redis Cluster without NodePort enabled

Configure each Pod's headless address.

redisc-shard-qst-0.redisc-shard-qst-headless:6379
redisc-shard-qst-1.redisc-shard-qst-headless:6379
redisc-shard-kr2-0.redisc-shard-kr2-headless:6379
redisc-shard-kr2-1.redisc-shard-kr2-headless:6379
redisc-shard-mv6-0.redisc-shard-mv6-headless:6379
redisc-shard-mv6-1.redisc-shard-mv6-headless:6379

Example 2: Redis Cluster with NodePort enabled

Configure each Pod's HostIP and the corresponding NodePort.

# 172.18.0.3 is the host IP of redisc-shard-qst-0 node, and 32269 is the NodePort mapped to the Redis 6379 server port.
172.18.0.3:32269
172.18.0.4:32051
172.18.0.5:32650
172.18.0.6:30151
172.18.0.7:31603
172.18.0.8:31718
NOTE

Direct connection is only for testing.

For simple connectivity verification, you can use kubectl commands to log in to a specific Pod in the cluster and check the cluster's status.

# Log in to a pod
➜  ~ kubectl exec -it redisc-shard-qst-0 -c redis-cluster -- bash
root@redisc-shard-qst-0:/#

# Check cluster topology
root@redisc-shard-qst-0:/# redis-cli -a $REDIS_DEFAULT_PASSWORD cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
f2f729eb9074d42dc58ba544f35be0b6652134c2 172.18.0.3:32650@31171,redisc-shard-mv6-1.redisc-shard-mv6-headless.default.svc slave 04e309001ce12857558ab721b47ce802e15b84f4 0 1713927855356 3 connected
04e309001ce12857558ab721b47ce802e15b84f4 172.18.0.3:32051@32632,redisc-shard-mv6-0.redisc-shard-mv6-headless.default.svc master - 0 1713927854000 3 connected 12288-16383
11da6bb8875ed4b3787888fec56bf9212e664246 172.18.0.3:32663@32115,redisc-shard-qst-1.redisc-shard-qst-headless.default.svc slave 7f062b0b5fdd0d09ea70920a5ad3612a9d217c9d 0 1713927853848 2 connected
7f062b0b5fdd0d09ea70920a5ad3612a9d217c9d 172.18.0.3:30649@30003,redisc-shard-qst-0.redisc-shard-qst-headless.default.svc myself,master - 0 1713927853000 2 connected 6827-10922
a04da6edbf99faff53b2b94d0fc64f378d27b4aa 172.18.0.3:30151@31667,redisc-shard-kr2-0.redisc-shard-kr2-headless.default.svc master - 0 1713927853000 1 connected 1365-5460
d392d129e27ced8603681cd666f705bfad7ae91a 172.18.0.3:31718@30646,redisc-shard-fm6-1.redisc-shard-fm6-headless.default.svc slave 568bb6ced7f186caddb2b2b7ab560e61ff95438c 0 1713927853036 4 connected
b695dbac46efd9ec24ea608358f92dfd749e8e71 172.18.0.3:31603@30000,redisc-shard-kr2-1.redisc-shard-kr2-headless.default.svc slave a04da6edbf99faff53b2b94d0fc64f378d27b4aa 0 1713927854350 1 connected
568bb6ced7f186caddb2b2b7ab560e61ff95438c 172.18.0.3:32269@31457,redisc-shard-fm6-0.redisc-shard-fm6-headless.default.svc master - 0 1713927853340 4 connected 0-1364 5461-6826 10923-12287

Scale shards

NOTE
  1. Currently, only scaling up or down one shard node at a time is supported. If you need to scale multiple shards, you need to perform the operations sequentially. This will be optimized in future versions.

  2. Scaling shards using kbcli or ops will be supported in future versions.

You can use kubectl patch to update the shards field and scale the shards.

# Scale up to 4 shards
kubectl patch cluster redisc --type='json' -p='[{"op": "replace", "path": "/spec/shardingSpecs/0/shards", "value":4}]' -n demo

# Scale down to 3 shards
kubectl patch cluster redisc --type='json' -p='[{"op": "replace", "path": "/spec/shardingSpecs/0/shards", "value":3}]' -n demo

You can use kubectl edit to directly edit the cluster YAML and modify the value of spec.shardingSpecs[0].shards.

kubectl edit cluster redisc

Scale replicas

The number of replicas applies to all shards.

You can use kubectl patch to update the replicas field and scale the shard replicas.

# Scale to 3 replicas (1 master and 2 replicas per shard)
kubectl patch cluster redisc --type='json' -p='[{"op": "replace", "path": "/spec/shardingSpecs/0/template/replicas", "value": 3}]' -n default

You can Use kubectl edit to directly edit the cluster YAML and modify the value of spec.shardingSpecs[0].template.replicas.

kubectl edit cluster redisc

You can apply an OpsRequest to scale replicas.

apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: horizontal-scaling-redisc
spec:
  clusterName: redisc
  horizontalScaling:
  - componentName: shard
    replicas: 3
  type: HorizontalScaling

Resource scaling/reconfiguration

apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: vertical-scaling-redisc
spec:
  clusterName: redisc
  verticalScaling:
  - componentName: shard
    limits:
      cpu: 2
      memory: 4Gi
    requests:
      cpu: 2
      memory: 4Gi
  type: VerticalScaling

Expand volume

apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: volume-expand-redisc
spec:
  clusterName: redisc
  volumeExpansion:
  - componentName: shard
    volumeClaimTemplates:
    - name: data
      storage: 200Gi
  type: VolumeExpansion

Restart

Currently, restarting a Redis Cluster is not supported and it will be supported in the future.

Stop/Start

apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: stop-redisc
spec:
  clusterName: redisc
  type: Stop
apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: start-redisc
spec:
  clusterName: redisc
  type: Start

Back up & Restore

To back up a cluster:

apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: backup-redisc-1
spec:
  clusterName: redisc
  type: Backup
  backup:
    backupMethod: datafile
    backupName: backup-redisc-1
    backupPolicyName: redisc-redis-backup-policy
    deletionPolicy: Delete

To restore a cluster:

apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: restore-redisc-backup
spec:
  clusterName: restore-redisc
  type: Backup
  restore:
    backupName: backup-redisc-1

© 2025 ApeCloud PTE. Ltd.