2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Создание сервисов с сохранением состояния в кластере k8s является относительно затруднительным. Текущий основной подход к построению Redis заключается в использовании общего хранилища ceph и nas для обеспечения постоянного хранения данных. Некоторые из них реализуются с использованием привязки узлов и пути к хосту. В настоящее время операторы в основном используют общий доступ. хранилище. В этой статье мы будем использовать взвешенные несколько копий сходства пути к хосту для создания кластера Redis на основе существующей среды и различных потребностей для достижения постоянства данных и высокой доступности службы Redis.
K8s версии k8s-1.29.4, среда построена в телекоммуникационном компьютерном зале с шестью рабочими узлами. Каждый узел имеет несистемный SSD-диск, подключенный к пути /data/. Общее хранилище, такое как ceph или nas, не является. Используемый оператор не используется. В настоящее время redis-operator в основном использует общее хранилище.
Примечание. Redis, созданный с помощью этого решения, можно использовать только внутри кластера k8s и нельзя предоставить для использования за пределами кластера через LoadBlancer или NodePort, поскольку IP-адрес основного Redis, выбранный в Sentinel, является IP-адресом модуля при переключении. происходит, невозможно определить, какой из них является основным.
Имя узла | Роль | Этикетка |
---|---|---|
k8s-работник-120-81 | хозяин | селектор-хранилища=узел-а-мастер |
k8s-работник-120-82 | хозяин | селектор-хранилища=узел-b-мастер |
k8s-работник-120-83 | хозяин | селектор-хранилища=узел-c-мастер |
k8s-работник-120-84 | Подготовить | селектор-хранилища=узел-а-служебный |
k8s-работник-120-85 | Подготовить | селектор-хранилища=узел-а-служебный |
k8s-работник-120-86 | Подготовить | селектор-хранилища=узел-а-служебный |
Примечание. Разделение ролей здесь относится к следующему: Поскольку у Redis есть один главный и два подчиненных узла, каждый модуль Redis приходится на три главных узла. При сбое главного узла он переключается на резервный узел. Например: имя defaultapp. pod redis-a-0 по умолчанию попадает на узел с меткой Storage-selector=node-a-master. При сбое узла он будет сопоставлен на основе веса узла с меткой Storage-selector=node-a-slve. . на узле.
Конфигурация содержит четыре файла, а описание дистрибутива следующее:
Sentinel.conf: файл конфигурации Sentinel. По умолчанию первый набор состояний используется в качестве основного Redis, а конфигурация:solve-hostnames поддерживает имена хостов.
redis-master.conf: основной файл конфигурации Redis, память настроена на 256 МБ, порт конфигурации — 6379, пароль конфигурации — redis#123, а путь к хранилищу — /data/redis.
redis.conf: в файле конфигурации redis настройте память на 256 МБ, настройте порт на 6380, настройте пароль: redis#123, путь к хранилищу — /data/redis-2 и настройте данные для синхронизации из основной редис.
run.sh: Основная функция — определить роль для запуска различных файлов конфигурации, создать каталог на основе имени хоста, а затем мягко подключиться к каталогу хранилища. Этот шаг в основном предназначен для хранения данных Redis каждой службы в собственном каталоге. При создании нового Redis это не приведет к конфликтам каталогов на узле.
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