레디스 클러스터

랏 뜨·2025년 10월 21일

🔎 Overview

  이전에 레디스 레플리케이션에 관한 실습 내용을 남겼다. 실습을 하고 기록을 남기면서도 느꼈지만, 확장을 위한 과정이기 때문에 반드시 알아야 하는 내용이었다.
  그렇게 레플리케이션 내용을 마무리하고 나니, 연달아 중요한 내용이 나왔다. 레디스 클러스터라는 기능이다.

  레디스 클러스터는 일종의 샤딩으로, 노드별 슬롯 분배 뿐만 아니라, 내부 채널인 클러스터 포트(기본 포트 + 10,000)를 통해 클러스터 노드간의 메시지 교환, 슬롯 이동 등을 지원한다.
  클러스터 내 각 샤드는 일반 레디스 노드와 마찬가지로 1개 이상의 마스터0개 이상의 레플리카를 가지고 있으며, 클러스터 노드 또한 마스터-레플리카 구조로 구성된다.

  실습을 위한 레디스 클러스터 관련 내용은 이 정도만 알고 있어도 큰 어려움이 없을 것이다. 이제 실습을 진행해보자.

📌 본 실습은 Windows 환경에서 WSL 을 통해 경량 가상 머신을 이용한 Linux 환경에서 진행



⌨️ 실습 진행


1. 레디스 클러스터 실습용 conf 파일 생성


  • 클러스터용 디렉토리 cluster 로 이동
  • 기존에 받아놨던 redis.conf 를 복사하여 redis-cluster.conf 생성

2. redis-cluster.conf 파일 수정


  • cluster-enabled yes 를 통해 클러스터 모드 사용 허용

  • requirepass {passwd}비밀번호 설정

  • enable-debug-command yes 를 통해 디버그 허용

  • bind 0.0.0.0 을 통해 외부 컨테이너(서비스) 접근 허용

3. docker-compose.yml 작성


  • docker-compose.yml 생성 및 작성
  • 네트워크는 redis_network 로 지정
    • 부모 디렉토리가 cluster이므로, cluster_redis_network 라는 네트워크 생성 및 공유

4. docker-compose 이용해 6개의 node 서비스 시작


  • 6개의 컨테이너 생성 확인

  • docker-compose ps 명령어로 docker-compose로 실행중인 서비스 확인

  • 컨테이너 실행 즉시 상태는 슬롯 미할당 상태

5. 클러스터 생성 및 레플리카 1개씩 지정


  • redis-cli --cluster create [{ip(container_name)/port}..] --cluster-replica 1 -a {passwd} 명령어 사용
    • 클러스터 생성
      • 클러스터로 사용할 노드들 등록
    • 각 클러스터 노드 중 1대씩레플리카로 설정
    • 해당 컨테이너 접속을 위한 비밀번호 제출

  • 총 16384개의 슬롯 생성 확인



🎯 트러블 슈팅 - 인증 실패 발생


TS1-1. 인증을 했음에도 NOAUTH(인증 실패) 발생


  • -a {passwd}비밀번호 입력을 했음에도 불구하고, 인증 실퍠 발생

TS1-2. 해결 - redis-cluster.conf 파일에서 masterauth 지정


  • 클러스터 생성 및 분배는 문제 없지만, 레플리케이션 작업에서 문제 발생
  • 마스터-레플리카 간의 레플리케이션에서는 마스터 데이터 동기화를 위해 레플리카에서 마스터의 비밀번호 인증이 필요하기 때문
  • 따라서, redis-cluster.conf 파일에 masterauth {passwd} 지시자를 지정하여 레플리케이션 인증 문제 해결

TS1-3. 확인 - 각 클러스터 노드 정보 할당 확인


  • 각 클러스터 노드에 epoch 번호, ip 등이 잘 할당됨을 확인

TS1-4. 확인 - 마스터-레플리카 간 데이터 동기화 확인


  • 클러스터 마스터-레플리카 노드 간의 레플리케이션 동기화 완료 확인



6. 마스터 노드 레플리케이션 정보 확인


  • cluster-node-1 마스터 노드로 클라이언트 접속
  • info replication 으로 레플리케이션 정보 확인
  • 레플리카 1대 존재 확인 및 레플리카 노드 관련 정보 확인 가능

7. 레플리카 노드 레플리케이션 정보 확인


  • cluster-node-6 레플리카 노드로 클라이언트 접속
  • info replication 으로 레플리케이션 정보 확인
  • 레플리카 노드라는 것과 마스터 노드 관련 정보 확인 가능

8. 클러스터 노드 정보 확인


  • cluster nodes 로 클러스터 노드 정보 확인
  • 현재 총 3대의 마스터, 3대의 레플리카가 존재함을 확인
    • 슬롯 또한 다 분배되어있음을 확인

9. 클러스터 샤드 정보 확인


  • 현재 클러스터 샤드 정보 확인
  • 사진에는 나오지 않았지만, 총 3개의 샤드 존재

10. 클러스터 노드 8개로 확장


  • docker-compose downdocer-compose up --scale node=8 로 노드를 8개로 확장

  • 기존 노드들은 정상 상태이지만 node-7node-8슬롯 미할당 상태임을 확인

11. 새로 생성된 노드7의 현재 노드 정보 확인


  • cluster-node-7 컨테이너 접속 후 cluster nodes노드 정보 확인
  • 현재 노드는 마스터이지만 슬롯 미할당 상태임을 확인
    • 원래대로면 connected 옆에 할당된 슬롯 번호들이 있어야 함
    • 8번 항목 참고

12. 노드7을 기존 노드1의 클러스터에 추가


  • --cluster add-node {addedNode} {orgNode} 명령어로 기존 클러스터레디스 노드 추가
    • 새로운 노드클러스터에 추가

  • 7번 노드가 정상적으로 클러스터에 등록됨을 확인 가능
  • 하지만 여전히 8번 노드는 클러스터에 등록되지 않음
    • <search> Got no slots in CLUSTER SLOTS -> 아직 클러스터에 속하지 않았다는 의미
    • 해당 노드는 현재 자신 외 다른 노드나 슬롯 정보를 알 수 없음
    • 따라서 CLUSTER SLOTS 명령 시 빈 배열 반환
    • 그래서 슬롯 정보가 없다는 메시지를 출력하는 것

  • 7번 마스터 노드가 클러스터에 추가
    • 하지만 여전히 슬롯은 미할당 상태

13. 노드8을 노드7의 클러스터에 추가


  • 8번 노드7번 노드에 추가
  • --cluster-slave 지시자를 추가하여 8번 노드7번 노드의 레플리카임을 지시

  • 8번 레플리카 노드가 클러스터에 추가
  • 7번-8번노드 간의 레플리케이션 정상 동작
    • 데이터 동기화 완료 확인

  • 7번 노드에서 info replication 으로 레플리케이션 정보 확인 가능

  • 7번 노드에서 cluster info 로 클러스터 정보 확인
  • cluster_known_nodes:8 을 보아, 노드는 8개로 확장됨이 확인
  • 하지만 cluster_size:3 을 보면, 현재 클러스터의 샤드4개로 확장되지 않고 여전히 기존의 3개임을 확인 가능

  • 7번 노드에서 cluster nodes클러스터 내 노드 정보 확인
  • 클러스터에 총 8개의 노드가 존재
    • 하지만 여전히 7번 마스터 노드에는 슬롯 미할당

14. 노드7에 슬롯을 할당하고 샤드 슬롯 재분배


  • reshard {desIP/desPort} 를 통해 샤드 슬롯 재분배 진행
  • 3가지 질문에 대답
    • How many slots do you want to move (from 1 to 16384)? :
      • 대상 노드에 분배할 슬롯의 양
      • 존재하는 슬롯 개수 16384를 분배될 샤드 4개로 나눈 4096으로 지정
    • What is the receiving node ID? :
      • 분배받을 노드 ID
      • cluster nodes 에서 확인한 7번 노드의 ID 입력
    • Please enter all the source node IDs :
      - 노드에 슬롯을 분배하기 위해 슬롯을 일부 가져올 노드의 ID
      - all 을 입력하여 나머지 모든 노드 슬롯 재분배

  • cluster nodes 를 통해 클러스터 내 노드 정보 확인
  • 기존 노드들에서 4096 / 3 만큼의 슬롯이 차감됨을 확인
  • 7번 노드는 나머지 3개의 노드들로부터 가져온 슬롯들을 분배 받음을 확인 가능
    • 0-1364 5461-6826 10923-12287


Reference :

  • 실전 레디스 : 기초, 실전, 고급 단계별로 배우는 레디스 핵심 가이드
  • ChatGPT ( https://chatgpt.com/ )
profile
기록

0개의 댓글