2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
La creación de servicios con estado en un clúster k8s es relativamente problemática. El método principal actual para crear redis es utilizar ceph y nas de almacenamiento compartido para lograr un almacenamiento persistente de datos. Algunos se implementan mediante el uso de afinidad de nodo y ruta de host. almacenamiento. Este artículo utilizará múltiples copias ponderadas de la afinidad de ruta de host para construir un clúster de Redis basado en el entorno existente y las diferentes necesidades para lograr la persistencia de los datos y la alta disponibilidad del servicio de Redis.
K8s versión k8s-1.29.4, el entorno está construido en una sala de computadoras de telecomunicaciones, con seis nodos trabajadores, cada nodo tiene un disco SSD que no es del sistema montado en la ruta /data/. No hay almacenamiento compartido como ceph o nas. No se utiliza ningún operador. En la actualidad, redis-operator básicamente utiliza almacenamiento compartido.
Nota: El redis creado por esta solución solo se puede usar dentro del clúster k8s y no se puede proporcionar para su uso fuera del clúster a través de LoadBlancer o NodePort, porque la IP del redis principal elegido en Sentinel es la IP del pod. Se produce el cambio, no se puede determinar cuál es el redis principal.
Nombre del nodo | Role | Etiqueta |
---|---|---|
trabajador k8s-120-81 | anfitrión | selector-de-almacenamiento=nodo-a-maestro |
trabajador k8s-120-82 | anfitrión | selector de almacenamiento=nodo-b-master |
trabajador k8s-120-83 | anfitrión | selector de almacenamiento=nodo-c-master |
trabajador k8s-120-84 | Preparar | selector-de-almacenamiento=nodo-a-slve |
trabajador k8s-120-85 | Preparar | selector-de-almacenamiento=nodo-a-slve |
trabajador k8s-120-86 | Preparar | selector-de-almacenamiento=nodo-a-slve |
Nota: La división de roles aquí se refiere a: Dado que Redis tiene un maestro y dos esclavos, cada pod de Redis recae en tres nodos maestros. Cuando el nodo maestro falla, se cambia al nodo de respaldo. Por ejemplo: el nombre es defaultapp- El. El pod de redis-a-0 cae en el nodo etiquetado Storage-selector=node-a-master de forma predeterminada. Cuando el nodo falla, se comparará según el peso del nodo etiquetado Storage-selector=node-a-slve. . en el nodo.
La configuración contiene cuatro archivos y la descripción de la distribución es la siguiente:
sentinel.conf: archivo de configuración de Sentinel De forma predeterminada, el primer conjunto de estado se utiliza como redis principal y la configuración: resolve-hostnames admite nombres de host.
redis-master.conf: archivo de configuración principal de redis, la memoria está configurada en 256 M, el puerto de configuración es 6379, la contraseña de configuración es redis # 123 y la ruta de almacenamiento es /data/redis.
redis.conf: desde el archivo de configuración de redis, configure la memoria a 256 M, configure el puerto a 6380, configure la contraseña: redis#123, la ruta de almacenamiento es /data/redis-2 y configure los datos que se sincronizarán desde el Redis principal.
run.sh: la función principal es determinar la función para ejecutar diferentes archivos de configuración, crear un directorio basado en el nombre del host y luego conectarse suavemente al directorio de almacenamiento. Este paso es principalmente para almacenar los datos de Redis de cada servicio en su propio directorio. Al crear un nuevo Redis, no causará conflictos de directorio en el nodo.
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