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.
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.
Buat ConfigMap untuk menyimpan dan mengelola konfigurasi kluster Redis.
kubectl create -f redis-config.yamlContoh 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 pass123Bidang
dirmenentukan direktori penyimpanan persisten data node dalam kluster Redis. Direktori/datapod harus merupakan direktori penyimpanan persisten.Bidang
cluster-config-filemenentukan 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.
Buat Service tanpa kepala.
kubectl create -f redis-service.yamlContoh isi file redis-service.yaml:
apiVersion: v1 kind: Service metadata: name: redis-cluster-svc spec: clusterIP: None selector: app: redis-clusterBuat StatefulSet untuk menerapkan Redis.
Saat membuat StatefulSet, referensikan Service yang telah dibuat, pasang ConfigMap ke direktori
/configsetiap pod, buat klaim volume persisten (PVC) untuk setiap pod, dan pasang PVC ke direktori/data.kubectl create -f redis.yamlContoh 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: 20GiSetelah membuat StatefulSet, tunggu hingga semua pod dalam StatefulSet berada dalam status Ready.
kubectl get statefulset redis-cluster -o wideOutput perintah berikut dikembalikan:
NAME READY AGE CONTAINERS IMAGES redis-cluster 6/6 8m52s redis redis:6.0.8Inisialisasi kluster.
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 wideOutput 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>Masuk ke salah satu node Redis.
kubectl exec -ti redis-cluster-0 bashJalankan perintah inisialisasi untuk enam node. Atur opsi
--cluster-replicaske 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 1Jika 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.
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 6379Contoh 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.
Ubah jumlah replika dalam StatefulSet dari 6 menjadi 8.
kubectl scale statefulsets redis-cluster --replicas=8Peroleh 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 wideOutput 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>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 bashredis-cli -a pass123 --cluster add-node 172.16.55.16:6379 172.16.55.6:6379CatatanDalam perintah di atas,
172.16.55.6:6379adalah 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******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.096slot 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:6379adalah 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:6379Masukkan 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)? yaJumlah 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.
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******CatatanDalam perintah di atas,
172.16.55.6:6379adalah 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 nodesContoh 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.
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:6379Masukkan 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)? yaJumlah 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
Ubah jumlah replika dalam StatefulSet dari 8 menjadi 6.
kubectl scale statefulsets redis-cluster --replicas=6Lihat 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-clusterSetelah 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