2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Membangun layanan stateful di kluster k8s relatif merepotkan. Pendekatan utama saat ini untuk membangun redis adalah dengan menggunakan ceph dan nas penyimpanan bersama untuk mencapai penyimpanan data yang persisten. Beberapa diimplementasikan dengan menggunakan afinitas node dan jalur host penyimpanan. Artikel ini akan menggunakan beberapa salinan afinitas jalur host yang tertimbang untuk membangun kluster redis berdasarkan lingkungan yang ada dan kebutuhan yang berbeda untuk mencapai persistensi data dan ketersediaan layanan redis yang tinggi.
K8s versi k8s-1.29.4, lingkungan dibangun di ruang komputer telekomunikasi, dengan enam node pekerja. Setiap node memiliki disk SSD non-sistem yang dipasang ke jalur /data/ penyimpanan bersama seperti ceph atau nas digunakan. Tidak ada operator yang digunakan. Saat ini, operator redis pada dasarnya menggunakan penyimpanan bersama.
Catatan: Redis yang dibangun oleh solusi ini hanya dapat digunakan di dalam cluster k8s dan tidak dapat disediakan untuk digunakan di luar cluster melalui LoadBlancer atau NodePort, karena IP redis utama yang dipilih di Sentinel adalah IP pod Saat switch terjadi, tidak dapat ditentukan mana redis utamanya.
Nama simpul | Peran | Label |
---|---|---|
k8s-pekerja-120-81 | tuan rumah | pemilih-penyimpanan=simpul-a-master |
k8s-pekerja-120-82 | tuan rumah | pemilih-penyimpanan=simpul-b-master |
k8s-pekerja-120-83 | tuan rumah | pemilih-penyimpanan=simpul-c-master |
k8s-pekerja-120-84 | Mempersiapkan | pemilih-penyimpanan=simpul-a-slve |
k8s-pekerja-120-85 | Mempersiapkan | pemilih-penyimpanan=simpul-a-slve |
pekerja-k8s-120-86 | Mempersiapkan | pemilih-penyimpanan=simpul-a-slve |
Catatan: Pembagian peran di sini mengacu pada: Karena redis memiliki satu master dan dua budak, setiap pod redis berada pada tiga node master. Ketika node master gagal, maka node tersebut dialihkan ke node cadangan pod redis-a-0 jatuh pada node berlabel storage-selector=node-a-master secara default. Ketika node gagal, maka node tersebut akan dicocokkan berdasarkan bobot pada node berlabel storage-selector=node-a-slve .
Konfigurasi berisi empat file dan deskripsi distribusinya adalah sebagai berikut:
sentinel.conf: File konfigurasi sentinel. Secara default, statefulset pertama digunakan sebagai redis utama, dan konfigurasi: nama host-resolve mendukung nama host.
redis-master.conf: File konfigurasi redis utama, memori dikonfigurasikan ke 256M, port konfigurasi adalah 6379, kata sandi konfigurasi adalah redis#123, dan jalur penyimpanan adalah /data/redis.
redis.conf: Dari file konfigurasi redis, konfigurasikan memori ke 256M, konfigurasikan port ke 6380, konfigurasikan kata sandi: redis#123, jalur penyimpanan adalah /data/redis-2, dan konfigurasikan data yang akan disinkronkan dari redis utama.
run.sh: Fungsi utamanya adalah menentukan peran untuk menjalankan file konfigurasi yang berbeda, membuat direktori berdasarkan nama host, dan kemudian menyambungkan secara lembut ke direktori penyimpanan. Langkah ini terutama untuk menyimpan data redis setiap layanan di direktorinya sendiri. Saat membuat redis baru, tidak akan menyebabkan konflik direktori pada node.
apiVersion: v1
kind: ConfigMap
metadata:
name: defaultapp-redis-config
namespace: default-ns
labels:
appname: default-app
app: defaultapp-redis-config
data:
sentinel.conf: |
sentinel monitor mymaster defaultapp-redis-a-0.defaultapp-redis-a.default-ns.svc.cluster.local 6379 2
sentinel auth-pass mymaster redis#123
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
SENTINEL resolve-hostnames yes
SENTINEL announce-hostnames yes
redis-master.conf: |
maxmemory 256mb
requirepass redis#123
save 3600 1 300 10 60 100
dir /data/redis
masterauth redis#123
redis.conf: |
maxmemory 256mb
requirepass redis#123
save 3600 1 300 10 60 100
dir /data/redis
replicaof defaultapp-redis-a-0.defaultapp-redis-a.default-ns.svc.cluster.local 6379
masterauth redis#123
run.sh: |
#!/bin/sh
role=$1
hname=$(hostname)
if [ $role == "master" ];then
echo "run redis master"
[ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname
[ -d /data ] || mkdir /data
ln -s /home/redis/$hname /data/redis
redis-server /etc/redis/redis-master.conf
elif [ $role == "sentinel" ];then
echo "run redis sentinel"
mkdir -p /etc/redis
cp /home/redis/sentinel.conf /etc/redis/
redis-sentinel /etc/redis/sentinel.conf
else
echo "run redis slave"
[ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname
[ -d /data ] || mkdir /data
ln -s /home/redis/$hname /data/redis
redis-server /etc/redis/redis.conf
fi