2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
k8s 클러스터에서 상태 저장 서비스를 구축하는 것은 상대적으로 까다롭습니다. Redis 구축에 대한 현재 주류 접근 방식은 공유 스토리지 ceph 및 nas를 사용하여 데이터의 영구 저장을 달성하는 것입니다. 현재 운영자는 기본적으로 공유를 사용합니다. 저장. 이 문서에서는 Redis 서비스의 데이터 지속성과 고가용성을 달성하기 위해 기존 환경과 다양한 요구 사항을 기반으로 Redis 클러스터를 구축하기 위해 가중치가 적용된 여러 호스트 경로 선호도 복사본을 사용합니다.
K8s 버전 k8s-1.29.4 환경은 6개의 작업자 노드가 있는 통신 컴퓨터실에 구축되었습니다. 각 노드에는 ceph 또는 nas와 같은 공유 저장소가 장착되지 않은 /data/ 경로에 마운트된 비시스템 디스크 SSD 디스크가 있습니다. 현재 redis-operator는 기본적으로 공유 저장소를 사용합니다.
참고: 이 솔루션으로 구축된 Redis는 k8s 클러스터 내에서만 사용할 수 있으며 LoadBlancer 또는 NodePort를 통해 클러스터 외부에서 사용하도록 제공할 수 없습니다. 왜냐하면 Sentinel에서 선택한 기본 Redis의 IP는 스위치일 때 포드의 IP이기 때문입니다. 이것이 주요 Redis인지 확인할 수 없습니다.
노드 이름 | 역할 | 상표 |
---|---|---|
k8s-워커-120-81 | 주인 | 저장소 선택기=노드-a-마스터 |
k8s-워커-120-82 | 주인 | 저장소 선택기=노드-b-마스터 |
k8s-워커-120-83 | 주인 | 저장소 선택기=노드-c-마스터 |
k8s-워커-120-84 | 준비하다 | 저장소 선택기=노드-a-슬레이브 |
k8s-워커-120-85 | 준비하다 | 저장소 선택기=노드-a-슬레이브 |
k8s-워커-120-86 | 준비하다 | 저장소 선택기=노드-a-슬레이브 |
참고: 여기서 역할 분할은 다음을 의미합니다. Redis에는 마스터 1개와 슬레이브 2개가 있으므로 각 Redis 포드는 마스터 노드 3개에 속하며, 마스터 노드가 실패하면 백업 노드로 전환됩니다. 예: 이름은 defaultapp입니다. redis-a-0의 포드는 기본적으로 Storage-selector=node-a-master라는 레이블이 붙은 노드에 속합니다. 노드가 실패하면 Storage-selector=node-a-slve라는 레이블이 붙은 노드의 가중치를 기준으로 일치됩니다. .
구성에는 4개의 파일이 포함되어 있으며 배포 설명은 다음과 같습니다.
sentinel.conf: Sentinel 구성 파일. 기본적으로 첫 번째 statefulset이 기본 redis로 사용되며 구성:solve-hostnames는 호스트 이름을 지원합니다.
redis-master.conf: 주요 redis 구성 파일, 메모리는 256M으로 구성, 구성 포트는 6379, 구성 비밀번호는 redis#123, 저장 경로는 /data/redis입니다.
redis.conf: redis 구성 파일에서 메모리를 256M으로 구성하고, 포트를 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