Redis - Cluster 적용하기

0

TIL

목록 보기
171/183
post-thumbnail

Redis Cluster

원래 목적은 master 노드 1개, slave 노드 3개를 생성하려고 했지만, cluster를 생성하다보니

*** ERROR: Invalid configuration for cluster creation.
*** Redis Cluster requires at least 3 master nodes.
*** This is not possible with 4 nodes and 1 replicas per node.
*** At least 6 nodes are required.

이런 에러를 확인하였다.

  • 최소 3개 이상의 master가 있어야 장애 조치가 가능한데, 만약 마스터가 1개뿐이라면 해당 마스터가 다운되었을 경우 클러스터는 데이터를 잃게 되며 슬레이브가 마스터로 승격될 수 없다.
  • 3개 이상의 마스터가 있어야 슬롯을 고르게 분산할 수 있다.
    만약 마스터가 2개만 있다면 슬롯이 불균형하게 할당될 수 있으며, 이는 성능 저하 및 데이터 분산의 문제를 초래할 수 있다.
  • 3개 이상의 마스터가 있을 때 한,두 개의 마스터가 장애가 나더라도 클러스터는 계속 작동할 수 있다.
    하지만 마스터가 1개 또는 2개일 경우 일부 마스터가 장애가 나면 클러스터 전체가 영향을 받을 수 있다.

알고보니 master 1개, slave 3개 이런식의 구성은 Sentinel 방식이었다.

Redis 운영 방식 : Cluster vs Sentinel 어떤 것을 선택해야 할까 ? 🤔
https://velog.io/@always/Redis-%EC%9A%B4%EC%98%81-%EB%B0%A9%EC%8B%9D-Cluster-vs-Sentinel-%EC%96%B4%EB%96%A4-%EA%B2%83%EC%9D%84-%EC%84%A0%ED%83%9D%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C

master 노드 3개, slave 노드 3개를 생성하기로 수정하였고, 그 방법에 대해 설명하겠다.

주인 3명에 노예 3마리 컨테이너 docker-compose.yml

services:
  # Redis 마스터 노드 1
  redis-master1:
    image: redis:7
    container_name: redis-master1
    command: ["redis-server", "--cluster-enabled", "yes", "--appendonly", "yes", "--requirepass", "systempass"]
    ports:
      - "6379:6379"
    volumes:
      - ./redis_data_master1:/data
    networks:
      - redis-cluster

  # Redis 마스터 노드 2
  redis-master2:
    image: redis:7
    container_name: redis-master2
    command: ["redis-server", "--cluster-enabled", "yes", "--appendonly", "yes", "--requirepass", "systempass"]
    ports:
      - "6380:6379"
    volumes:
      - ./redis_data_master2:/data
    networks:
      - redis-cluster

  # Redis 마스터 노드 3
  redis-master3:
    image: redis:7
    container_name: redis-master3
    command: ["redis-server", "--cluster-enabled", "yes", "--appendonly", "yes", "--requirepass", "systempass"]
    ports:
      - "6381:6379"
    volumes:
      - ./redis_data_master3:/data
    networks:
      - redis-cluster

  # Redis 슬레이브 노드 1
  redis-slave1:
    image: redis:7
    container_name: redis-slave1
    command: ["redis-server", "--cluster-enabled", "yes", "--appendonly", "yes", "--requirepass", "systempass", "--masterauth", "systempass"]
    ports:
      - "6382:6379"
    volumes:
      - ./redis_data_slave1:/data
    networks:
      - redis-cluster

  # Redis 슬레이브 노드 2
  redis-slave2:
    image: redis:7
    container_name: redis-slave2
    command: ["redis-server", "--cluster-enabled", "yes", "--appendonly", "yes", "--requirepass", "systempass", "--masterauth", "systempass"]
    ports:
      - "6383:6379"
    volumes:
      - ./redis_data_slave2:/data
    networks:
      - redis-cluster

  # Redis 슬레이브 노드 3
  redis-slave3:
    image: redis:7
    container_name: redis-slave3
    command: ["redis-server", "--cluster-enabled", "yes", "--appendonly", "yes", "--requirepass", "systempass", "--masterauth", "systempass"]
    ports:
      - "6384:6379"
    volumes:
      - ./redis_data_slave3:/data
    networks:
      - redis-cluster

networks:
  redis-cluster:
    driver: bridge

이 상태에서 docker compose up을 하면 총 6개의 노드가 컨테이너에서 실행이 된다.

# 생성된 네트워크의 목록을 확인
docker network ls

# 해당 네트워크를 조회(컨테이너가 포함되어있는지 확인)
docker network inspect redis-cluster

Redis가 --requirepass 옵션으로 설정되어 있기 때문에, 클러스터 생성 명령을 실행할 때 인증을 같이 해준다.

docker exec -it redis-master1 redis-cli --cluster create \
redis-master1:6379 \
redis-master2:6379 \
redis-master3:6379 \
redis-slave1:6379 \
redis-slave2:6379 \
redis-slave3:6379 \
--cluster-replicas 1 \
--cluster-yes -a systempass

이 때 내부포트번호인 6379로 일치시켜야 cluster가 생성이 된다.


네트워크에서 6개의 노드가 확인이 가능하다


master1 노드의 인증이 필요할 경우

# master1의 CLI에 접속하는 명령어
docker exec -it redis-master1 redis-cli

# 인증
auth systempass

0개의 댓글

관련 채용 정보