본문 바로가기
AMQP/redis

Redis Cluster 설명

by Bill Lab 2025. 4. 21.
728x90

앞써 블로그에서는 docker file 기반의 redis를 어떻게 띄우는지를 설명했었다.

하지만 실무에서는 이렇게 단일 redis 서버하나 띄워놓고 운용하기에는 리스크가 너무 크다.

가장 큰 리스크는 서버 하나가 유일한데 그게 뻗어버리면?

관련된 서비스가 마비될 것이다.

 

따라서, 원활한 서비스를 위해서는 2가지 중 하나를 선택해야 하는데 그중 하나가 Sentinel 이고 다른 하나가 Cluster 구성이다.

 

1. Sentinel

    - HA 지원, Master & Slave 의 Replica 구성 가능

    - 과반수의 투표체계를 사용하기 때문에 홀수개의 redis를 구성해야한다.(그중 하나가 Master 나머지 두개가 Slave)

    - Sentinel 구성을 위해서는 기존 redis 와 별도의 추가 구성이 필요

 

     [예시]

apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
data:
  redis.conf: |
    port 6379
    bind 0.0.0.0
    protected-mode no
    appendonly yes
    dir /data
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-sentinel-config
data:
  sentinel.conf: |
    port 26379
    dir /tmp
    sentinel monitor mymaster redis-0.redis 6379 2
    sentinel down-after-milliseconds mymaster 5000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 10000
apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  ports:
    - port: 6379
      name: redis
    - port: 26379
      name: sentinel
  clusterIP: None
  selector:
    app: redis
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: redis
  replicas: 3
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
        - name: redis
          image: redis:7
          command: ["redis-server", "/etc/redis/redis.conf"]
          volumeMounts:
            - name: redis-config
              mountPath: /etc/redis
            - name: redis-data
              mountPath: /data
        - name: sentinel
          image: redis:7
          command: ["redis-sentinel", "/etc/sentinel/sentinel.conf"]
          volumeMounts:
            - name: sentinel-config
              mountPath: /etc/sentinel
      volumes:
        - name: redis-config
          configMap:
            name: redis-config
        - name: sentinel-config
          configMap:
            name: redis-sentinel-config
  volumeClaimTemplates:
    - metadata:
        name: redis-data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

 

2.  Cluster

     - HA, Sharding 지원, Dataset을 자동으로 여러 노드에 분산해서 저장 및 사용 가능.

     - Redis Cluster 전용 Client 를 사용필요

     - Max Sharding 은 최대 1000개 까지 권장

     - Sentinel과 마찮가지로 Replica가 master를 감지하고 자동으로 승격시키며, Master가 이후 복구되어도 replica로 편입됨(과반수 투표기준).

     - 전체 16384 hash slot, 동일한 slot 범위안에서만 멀티 키 명령어 사용가능( MGET, MULTI), 최소 3개의 master 필요

     - cluster 기본 port 16379, 내부는 cluster bus 사용

     - 이외 master 추가 시 자동분산 안되며, 수동으로 rebalancing 필요

 

     [예시]

apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  clusterIP: None
  selector:
    app: redis
  ports:
    - name: redis
      port: 6379
    - name: cluster
      port: 16379
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
data:
  redis.conf: |
    port 6379
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    dir /data
    protected-mode no
    bind 0.0.0.0
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: redis
  replicas: 30
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
        - name: redis
          image: redis:latest
          command: ["redis-server", "/etc/redis/redis.conf"]
          ports:
            - containerPort: 6379
              name: redis
            - containerPort: 16379
              name: cluster
          volumeMounts:
            - name: redis-config
              mountPath: /etc/redis
            - name: redis-data
              mountPath: /data
      volumes:
        - name: redis-config
          configMap:
            name: redis-config
  volumeClaimTemplates:
    - metadata:
        name: redis-data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

 

728x90

'AMQP > redis' 카테고리의 다른 글

redis dockerfile 로 local에서 띄우기  (3) 2024.11.01
redis 어디까지 써봤나? feat. Goddis  (6) 2024.08.28