全部产品
Search
文档中心

Elastic Container Instance:Membangun kluster Redis pada instance kontainer elastis

更新时间:Jun 29, 2025

Kluster Redis berbasis kontainer mudah diimplementasikan dan diskalakan serta menyimpan sumber daya dalam ruang yang terisolasi. Pendekatan ini meningkatkan efisiensi dalam penerapan, pengelolaan, peningkatan skala, dan pemeliharaan kluster Redis, sekaligus mengurangi biaya operasional. Topik ini menjelaskan cara membangun kluster Redis pada instance kontainer elastis di Serverless Container Service for Kubernetes (ACK).

Informasi latar belakang

Instans Redis dapat beroperasi dalam Mode kluster. Dalam mode ini, Redis membagi ruang penyimpanan menjadi 16.384 slot hash. Setiap Node master dalam kluster bertanggung jawab atas sharding database, yang mencakup sejumlah slot hash tertentu. Saat Anda menulis entri data, Redis menghitung slot hash untuk entri tersebut dan kemudian menulis data ke node yang bertanggung jawab atas slot hash tersebut. Anda dapat menambahkan satu atau lebih node slave ke setiap node master. Jika sebuah node master tidak tersedia, salah satu node slave secara otomatis mengambil alih peran node master untuk memberikan layanan.

Redis memberikan throughput tinggi dan ketersediaan dalam mode kluster. Namun, Redis tidak sepenuhnya mencegah kehilangan data dalam mode ini. Untuk informasi lebih lanjut, lihat Dokumentasi Resmi Redis.

Prasyarat

Sebuah kluster ACK Serverless telah dibuat dengan kondisi berikut:

  • Akses internet telah diaktifkan untuk kluster, dan kluster dapat menarik gambar publik.

  • Plugin penyimpanan telah diterapkan di kluster.

    Disarankan untuk menggunakan plugin Container Storage Interface (CSI). Pastikan komponen Alibaba Cloud CSI-Provisioner diterapkan di plugin CSI.

  • CoreDNS telah diterapkan di kluster.

Membangun kluster Redis

Dalam topik ini, gambar resmi Redis v6.0.8 digunakan sebagai contoh untuk membuat kluster Redis yang terdiri dari enam node, termasuk tiga node master dan tiga node slave. Setiap node memiliki status dan pengenal unik. Anda dapat menggunakan StatefulSet untuk membuat pod. Lampirkan disk ke setiap node untuk menyimpan data secara persisten.

Catatan

Disarankan untuk menggunakan Redis v5.0 atau yang lebih baru. Jika Anda menggunakan versi Redis sebelum 5.0, Anda mungkin perlu menggunakan perintah yang berbeda dari yang disediakan dalam topik ini untuk menginisialisasi kluster.

  1. Buat ConfigMap untuk menyimpan dan mengelola konfigurasi kluster Redis.

    kubectl create -f redis-config.yaml

    Contoh isi file redis-config.yaml:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: redis-cluster
    data:
      redis.conf: |
        bind 0.0.0.0
        port 6379
        cluster-announce-bus-port 16379
        cluster-enabled yes
        appendonly yes
        cluster-node-timeout 5000
        dir /data
        cluster-config-file /data/nodes.conf
        requirepass pass123
        masterauth pass123
    • Bidang dir menentukan direktori penyimpanan persisten data node dalam kluster Redis. Direktori /data pod harus merupakan direktori penyimpanan persisten.

    • Bidang cluster-config-file menentukan informasi node kluster Redis. Informasi node dihasilkan dan dimodifikasi secara otomatis oleh node Redis. Nilai bidang ini juga merupakan direktori penyimpanan persisten. Jika sebuah node gagal, node lain dalam kluster dapat mengambil alih node tersebut untuk memberikan layanan.

  2. Buat Service tanpa kepala.

    kubectl create -f redis-service.yaml

    Contoh isi file redis-service.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: redis-cluster-svc
    spec:
      clusterIP: None
      selector:
        app: redis-cluster
  3. Buat StatefulSet untuk menerapkan Redis.

    Saat membuat StatefulSet, referensikan Service yang telah dibuat, pasang ConfigMap ke direktori /config setiap pod, buat klaim volume persisten (PVC) untuk setiap pod, dan pasang PVC ke direktori /data.

    kubectl create -f redis.yaml

    Contoh isi file redis.yaml:

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: redis-cluster
    spec:
      selector:
        matchLabels:
          app: redis-cluster
      serviceName: redis-cluster-svc
      replicas: 6
      template:
        metadata:
          labels:
            app: redis-cluster
            alibabacloud.com/eci: "true"
        spec:
          terminationGracePeriodSeconds: 10
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - podAffinityTerm:
                  labelSelector:
                    matchExpressions:
                    - key: app
                      operator: In
                      values:
                      - redis-cluster
                  topologyKey: kubernetes.io/hostname
                weight: 100
          containers:
          - name: redis
            image: redis:6.0.8
            command: ["redis-server", "/config/redis.conf"]
            ports:
            - name: redis
              containerPort: 6379
              protocol: TCP
            - name: election
              containerPort: 16379
              protocol: TCP
            volumeMounts:
            - name: redis-conf
              mountPath: /config
            - name: pvc-essd-redis-data
              mountPath: /data
          volumes:
          - name: redis-conf
            configMap:
              name: redis-cluster
              items:
              - key: redis.conf
                path: redis.conf
      volumeClaimTemplates:
      - metadata:
          name: pvc-essd-redis-data
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: alicloud-disk-essd
          resources:
            requests:
              storage: 20Gi

    Setelah membuat StatefulSet, tunggu hingga semua pod dalam StatefulSet berada dalam status Ready.

    kubectl get statefulset redis-cluster -o wide

    Output perintah berikut dikembalikan:

    NAME            READY   AGE     CONTAINERS   IMAGES
    redis-cluster   6/6     8m52s   redis        redis:6.0.8
  4. Inisialisasi kluster.

    1. Peroleh alamat IP setiap node.

      Redis tidak mengizinkan inisialisasi kluster menggunakan nama host. Anda harus memperoleh alamat IP setiap node saat menginisialisasi kluster Redis.

      kubectl get pods -l app=redis-cluster -o wide

      Output perintah berikut dikembalikan:

      NAME              READY   STATUS    RESTARTS   AGE     IP             NODE                           NOMINATED NODE   READINESS GATES
      redis-cluster-0   1/1     Running   0          9m37s   172.16.55.6    virtual-kubelet-cn-beijing-k   <none>           <none>
      redis-cluster-1   1/1     Running   0          9m5s    172.16.55.7    virtual-kubelet-cn-beijing-k   <none>           <none>
      redis-cluster-2   1/1     Running   0          8m30s   172.16.55.8    virtual-kubelet-cn-beijing-k   <none>           <none>
      redis-cluster-3   1/1     Running   0          7m46s   172.16.55.9    virtual-kubelet-cn-beijing-k   <none>           <none>
      redis-cluster-4   1/1     Running   0          7m7s    172.16.55.10   virtual-kubelet-cn-beijing-k   <none>           <none>
      redis-cluster-5   1/1     Running   0          6m30s   172.16.55.11   virtual-kubelet-cn-beijing-k   <none>           <none>
    2. Masuk ke salah satu node Redis.

      kubectl exec -ti redis-cluster-0 bash

      Jalankan perintah inisialisasi untuk enam node. Atur opsi --cluster-replicas ke 1 untuk menentukan bahwa setiap node master ditugaskan sebuah node slave. Dengan cara ini, kluster berisi tiga node master dan tiga node slave.

      redis-cli -a pass123 --cluster create 172.16.55.6:6379 172.16.55.7:6379 172.16.55.8:6379 172.16.55.9:6379 172.16.55.10:6379 172.16.55.11:6379 --cluster-replicas 1

      Jika output perintah berikut dikembalikan, kluster telah diinisialisasi.

      [OK] All nodes agree about slots configuration.
      >>> Check for open slots...
      >>> Check slots coverage...
      [OK] All 16384 slots covered.
  5. Gunakan kluster Redis.

    Setelah membuat Service tanpa kepala, kluster Kubernetes menetapkan Rekaman A Sistem Nama Domain (DNS) ke Service dalam format {service name}.{service namespace}.svc.{domain}. Rekaman DNS dipetakan ke alamat IP pod backend. Setiap kali Anda mengakses nama Service, nama tersebut diselesaikan ke node Redis acak.

    Ini memungkinkan Anda mengakses kluster Redis dengan mengakses pod di dalam kluster.

    redis-cli -a pass123 -c -h redis-cluster-svc.default.svc.cluster.local -p 6379

    Contoh tes:

    172.16.55.8> set k1 v1
    OK
    172.16.55.8> get k1
    "v1"

Tingkatkan skala kluster Redis

Anda tidak dapat secara dinamis menaikkan skala kluster Redis karena alasan berikut: Pertama, setiap kali sebuah node baru ditambahkan, Redis harus menata ulang slot hash ke semua node dalam kluster. Anda dapat menambahkan skrip ke gambar Redis untuk mengotomatiskan penataan ulang slot hash setiap kali pod dimulai. Namun, ketika sejumlah besar data ditambahkan ke kluster, resharding terus-menerus memperlambat peningkatan skala kluster. Sharding juga dapat menghabiskan bandwidth kluster Redis, yang dapat menyebabkan semua klien yang bergantung pada Redis mengalami waktu habis. Kedua, tidak ada kebijakan yang sesuai yang dapat digunakan untuk menentukan apakah akan menggunakan pod yang dimulai ulang sebagai node master atau node slave.

Untuk mengatasi masalah di atas, contoh berikut menunjukkan cara menaikkan skala kluster Redis dengan melakukan sharding manual.

  1. Ubah jumlah replika dalam StatefulSet dari 6 menjadi 8.

    kubectl scale statefulsets redis-cluster --replicas=8
  2. Peroleh alamat IP node baru.

    Setelah semua pod berada dalam status Ready, jalankan perintah berikut untuk memperoleh alamat IP node baru:

    kubectl get pods -l app=redis-cluster -o wide

    Output perintah berikut dikembalikan. redis-cluster-6 dan redis-cluster-7 adalah node baru.

    NAME              READY   STATUS    RESTARTS   AGE   IP             NODE                           NOMINATED NODE   READINESS GATES
    redis-cluster-0   1/1     Running   0          88m   172.16.55.6    virtual-kubelet-cn-beijing-k   <none>           <none>
    redis-cluster-1   1/1     Running   0          88m   172.16.55.7    virtual-kubelet-cn-beijing-k   <none>           <none>
    redis-cluster-2   1/1     Running   0          87m   172.16.55.8    virtual-kubelet-cn-beijing-k   <none>           <none>
    redis-cluster-3   1/1     Running   0          87m   172.16.55.9    virtual-kubelet-cn-beijing-k   <none>           <none>
    redis-cluster-4   1/1     Running   0          86m   172.16.55.10   virtual-kubelet-cn-beijing-k   <none>           <none>
    redis-cluster-5   1/1     Running   0          85m   172.16.55.11   virtual-kubelet-cn-beijing-k   <none>           <none>
    redis-cluster-6   1/1     Running   0          52s   172.16.55.16   virtual-kubelet-cn-beijing-k   <none>           <none>
    redis-cluster-7   1/1     Running   0          32s   172.16.55.17   virtual-kubelet-cn-beijing-k   <none>           <none>
  3. Tambahkan node master.

    Masuk ke salah satu node. Dalam topik ini, masuk ke redis-cluster-0. Jalankan perintah berikut untuk menambahkan redis-cluster-6 sebagai node master kluster:

    kubectl exec -ti redis-cluster-0 bash
    redis-cli -a pass123 --cluster add-node 172.16.55.16:6379 172.16.55.6:6379
    Catatan

    Dalam perintah di atas, 172.16.55.6:6379 adalah alamat node yang ada. Setelah Anda terhubung ke node tersebut, redis-cli secara otomatis memperoleh alamat node lainnya.

    Periksa ID redis-cluster-6.

    redis-cli -a pass123 -c cluster nodes | grep 172.16.55.16:6379 | awk '{print $1}'

    Output perintah berikut dikembalikan:

    47879390ecc7635f5c57d3e324e2134b24******
  4. Re-alokasi slot hash.

    Setelah menambahkan redis-cluster-6 sebagai node master ke kluster, empat node master ada dalam kluster Redis. Keempat node tersebut berbagi 16.384 slot hash. Setiap node master dialokasikan 16.384/4 = 4.096 slot hash rata-rata. Oleh karena itu, 4.096 slot hash harus dipindahkan dari tiga node master yang ada ke node master baru.

    Jalankan perintah berikut untuk menata ulang slot hash. 172.16.55.6:6379 adalah alamat node yang ada. Setelah Anda terhubung ke node tersebut, redis-cli secara otomatis memperoleh alamat node lainnya.

    redis-cli -a pass123 --cluster reshard 172.16.55.6:6379

    Masukkan informasi yang diperlukan secara berurutan berdasarkan petunjuk perintah interaktif di atas.

    Berapa banyak slot yang ingin Anda pindahkan (dari 1 hingga 16384)? 4096
    Apa ID node penerima? 47879390ecc7635f5c57d3e324e2134b24******
    Node sumber #1: all
    Apakah Anda ingin melanjutkan dengan rencana reshard yang diusulkan (ya/tidak)? ya
    • Jumlah slot hash yang akan dialokasikan ke node baru (redis-cluster-6): 4.096

    • ID node penerima (node baru): 47879390ecc7635f5c57d3e324e2134b24******

    • ID node sumber (semua node yang ada): all

    • Konfirmasi realokasi: ya

    Tunggu hingga slot hash direalokasi. Selama realokasi, kluster Redis dapat terus memberikan layanan.

  5. Tambahkan node slave.

    Jalankan perintah berikut untuk menambahkan redis-cluster-7 sebagai node slave dari redis-cluster-6:

    redis-cli -a pass123 --cluster add-node 172.16.55.17:6379 172.16.55.6:6379 --cluster-slave --cluster-master-id 47879390ecc7635f5c57d3e324e2134b24******
    Catatan
    • Dalam perintah di atas, 172.16.55.6:6379 adalah alamat node yang ada. Setelah Anda terhubung ke node tersebut, redis-cli secara otomatis memperoleh alamat node lainnya.

    • 47879390ecc7635f5c57d3e324e2134b24****** adalah ID node master (redis-cluster-6).

    Setelah menambahkan node slave, Anda dapat melihat empat node master yang sesuai dengan empat node slave dalam kluster Redis.

    redis-cli -a pass123 -c cluster nodes

    Contoh output:

    47879390ecc7635f5c57d3e324e2134b24****** 172.16.55.16:6379@16379 master - 0 1667383406000 7 connected 0-1364 5461-6826 10923-12287
    75a7398a45f9696066eaa6ac7968b13a47****** 172.16.55.11:6379@16379 slave b8f6b826241b47f29a4bdde14104b28fe8****** 0 1667383406514 2 connected
    b7849f8577e43d5a6da51bc78ae809bbb1****** 172.16.55.17:6379@16379 slave 47879390ecc7635f5c57d3e324e2134b24****** 0 1667383406314 7 connected
    b8f6b826241b47f29a4bdde14104b28fe8****** 172.16.55.7:6379@16379 master - 0 1667383406815 2 connected 6827-10922
    ffce547186e0be179830cb0dca47c203f6****** 172.16.55.6:6379@16379 myself,master - 0 1667383406000 1 connected 1365-5460
    833a939cde93991c8a16c41fb2568b8642****** 172.16.55.8:6379@16379 master - 0 1667383406514 3 connected 12288-16383
    a4df1a26394bfcb833914278744219db01****** 172.16.55.9:6379@16379 slave 833a939cde93991c8a16c41fb2568b8642****** 0 1667383407515 3 connected
    c4234d71343ca4dbe07822e17f7572ac30****** 172.16.55.10:6379@16379 slave ffce547186e0be179830cb0dca47c203f6****** 0 1667383405813 1 connected

Turunkan skala kluster Redis

Selama penurunan skala kluster Redis, StatefulSet hanya dapat menghapus pod satu per satu dalam urutan terbalik dari pembuatan pod. Jika Anda ingin menghapus node master dan node slave dari kluster Redis, Anda harus menggunakan StatefulSet untuk menghapus redis-cluster-7 dan redis-cluster-6. Redis harus mengalokasikan semua slot hash pada dua node tersebut ke node lain sebelum StatefulSet menghapus node tersebut. Jika tidak, kehilangan data terjadi, dan kluster Redis menolak layanan.

  1. Re-alokasi slot hash.

    Untuk mencegah beban miring pada tiga node master yang tersisa, StatefulSet harus secara merata mengalokasikan slot hash redis-cluster-6 ke node master yang tersisa. Dalam hal ini, Redis harus melakukan tiga operasi resharding. Prosedurnya mirip dengan prosedur peningkatan skala. Namun, dalam setiap operasi resharding, Anda harus menetapkan node penerima ke salah satu node master yang tersisa, dan node sumber ke redis-cluster-6. Contoh perintah:

    redis-cli -a pass123 --cluster reshard 172.16.55.6:6379

    Masukkan informasi yang diperlukan secara berurutan berdasarkan petunjuk perintah interaktif di atas.

    Berapa banyak slot yang ingin Anda pindahkan (dari 1 hingga 16384)? 4096
    Apa ID node penerima? ffce547186e0be179830cb0dca47c203f6******
    Node sumber #1: 47879390ecc7635f5c57d3e324e2134b24******
    Node sumber #2: done
    Apakah Anda ingin melanjutkan dengan rencana reshard yang diusulkan (ya/tidak)? ya
    • Jumlah slot hash yang akan dialokasikan ke node master yang tersisa: 4.096

    • ID node penerima (salah satu node yang tersisa): ffce547186e0be179830cb0dca47c203f6******

    • ID node sumber (redis-cluster-6): 47879390ecc7635f5c57d3e324e2134b24******

    • Konfirmasi realokasi: ya

  2. Ubah jumlah replika dalam StatefulSet dari 8 menjadi 6.

    kubectl scale statefulsets redis-cluster --replicas=6

    Lihat informasi pod kluster Redis. Anda dapat melihat bahwa jumlah node dalam kluster dikurangi menjadi enam.

    kubectl get pods -l app=redis-cluster -o wide

Hapus kluster Redis

Untuk menghapus kluster Redis, Anda harus menghapus StatefulSet, Service, dan ConfigMap.

kubectl delete statefulset redis-cluster
kubectl delete svc redis-cluster-svc
kubectl delete cm redis-cluster

Setelah menghapus StatefulSet, PVC terkait tidak dihapus secara otomatis. Anda harus menghapus PVC secara manual. Setelah menghapus PVC, disk dan data yang sesuai juga dihapus.

kubectl delete pvc -l app=redis-cluster