기술나눔

[k8s 설치 redis] k8s 설치 redis의 독립형 버전으로 고성능 및 고가용성을 달성합니다.

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

소개

이 기사는 k8s 환경에서 [의사] 독립형 모드 Redis 인스턴스 구축을 기반으로 합니다. 공유 스토리지의 IO 성능이 상대적으로 낮기 때문에 공유 스토리지는 데이터 백업에 사용되며, Redis 데이터는 호스트 경로 형태로 저장됩니다. 이는 Redis의 IO 성능을 향상시키는 데 도움이 됩니다. 독립형 및 고가용성 Redis를 구현하기 위한 마스터-슬레이브 형태의 Redis입니다.

1. 조건 및 환경 설명:

K8s 버전 k8s-1.29.4 환경은 총 6개의 노드로 구성된 통신 컴퓨터실에 구축됩니다. 각 노드에는 /data/ 경로에 마운트된 비시스템 디스크 SSD 디스크가 있습니다. Alibaba Cloud NAS를 사용하고 전용선 대역폭이 500Mb인 전용선을 사용하는 NAS 공유 스토리지가 있습니다.

2. 요구사항 설명:

  • Redis 인스턴스를 구축합니다: 독립형 또는 마스터-슬레이브.
  • 고가용성: k8s 노드가 종료되더라도 오랫동안 사용에는 영향을 미치지 않습니다.
  • 고성능: 높은 iO가 필요하며 공유 스토리지 또는 ceph 분산 스토리지가 사용되며 iO 읽기 및 쓰기가 크게 할인됩니다.
  • 데이터 보안: 전환이 발생한 후 데이터는 최대한 완전해야 합니다.
  • 간단한 설치, 손쉬운 관리 및 유지보수

3. 구현 원칙 및 지침

1. 마스터-슬레이브 모드에서 Redis를 설정합니다. 마스터 Redis의 데이터 읽기 및 쓰기는 로컬 SSD 디스크에 속하고 슬레이브 Redis의 데이터는 외부 공유 NAS 스토리지에 속합니다.
2. 그런 다음 Statefulset 구성을 생성하고 두 개의 컨테이너(한 개의 컨테이너는 기본 Redis로 배치)를 배치하고 이를 호스트 경로에 마운트한 다음 호스트 이름으로 디렉터리를 생성하고 rdb 파일을 저장합니다. 또 다른 컨테이너는 슬레이브 redis 역할을 하며 nas 경로를 마운트하여 호스트 이름으로 디렉터리를 생성하고 rdb 파일을 저장합니다.
3. Redis에서 저장되는 데이터 지속성 매개변수를 조정하고 데이터 다운로드 시간을 더 작은 매개변수로 조정하여 업데이트된 데이터가 가능한 한 빨리 rdb 파일에 저장되도록 합니다.
4. Pod가 예약되거나 다시 시작될 때마다 nas에 저장된 rdb 파일을 호스트 경로에 복사하고 redis를 시작합니다.

참고: 이는 마스터 Redis가 비즈니스 데이터의 고성능 처리를 달성할 수 있도록 수행되며 슬레이브 Redis는 데이터 지속성을 담당할 수 있습니다. 1. 마스터의 읽기 및 쓰기 데이터 IO가 너무 높은 경우. , 슬레이브 redis가 nas를 마운트하면 데이터 다운로드 시간이 길어집니다.

4. 세부 단계

4.1. configmap 구성 파일 생성

구성에는 마스터 Redis 구성 파일, 슬레이브 Redis 구성 파일, 실행 역할에 따라 다양한 작업을 수행하는 간단한 스크립트 등 세 가지 파일이 포함되어 있습니다.
redis-master:conf는 주요 Redis 구성 파일입니다. 메모리는 256M으로 구성되어 있으며 구성 포트는 6379, 구성 비밀번호는 redis#123, 저장 경로는 /data/redis입니다.
redis.conf: redis 구성 파일에서 메모리를 256M으로 구성하고, 포트를 6380으로 구성하고, 비밀번호를 redis#123으로 구성하고, 저장 경로는 /data/redis-2이며, 다음에서 동기화할 데이터를 구성합니다. 포트 6379로 설정하고 저장 시간을 60초 이내에 10개의 데이터 변경이 있을 경우 저장을 수행합니다.
run.sh: 주요 기능은 역할을 결정하고 호스트 이름을 기반으로 디렉터리를 생성한 다음 스토리지 디렉터리에 소프트 연결하는 것입니다. 이 단계는 주로 각 서비스의 Redis 데이터를 자체 디렉터리에 저장하는 것입니다. 새 Redis를 생성할 때 노드에서 디렉터리 충돌이 발생하지 않습니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: defaultapp-redis-standalone-config
  namespace: default
  labels:
    appname: default-app
    app: defaultapp-redis-standalone-config
data:
  redis-master.conf: |
    port 6379
    maxmemory 256mb
    requirepass redis#123
    dir /data/redis
  redis.conf: |
    port 6380
    maxmemory 256mb
    requirepass redis#123
    save 3600 1 300 5 60 10
    dir /data/redis-2
    replicaof 127.0.0.1 6379
    masterauth redis#123
  run.sh: |
    #!/bin/sh
    role=$1
    hname=$(hostname)
    if [ $role == "master" ];then
        echo "run redis master"
        ls /etc/redis/ -l
        [ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname
        [ -d /data ] || mkdir /data
        ln -s /home/redis/$hname /data/redis
        if [ -f /home/redis-2/$hname/dump.rdb ];then
                cp -vf /home/redis-2/$hname/dump.rdb /data/redis/
        else
                echo "[info] no bak dump.rdb"
        fi
        redis-server /etc/redis/redis-master.conf
    else
        echo "run redis slave"
        ls /etc/redis/ -l
        [ -d /home/redis-2/$hname ] || mkdir -p /home/redis-2/$hname
        [ -d /data ] || mkdir /data
        ln -s /home/redis-2/$hname /data/redis-2
        redis-server /etc/redis/redis.conf
    fi