CHAPTER 08 레디스 클러스터
I. 레디스 클러스터 기능 개요
1. 레디스 클러스터 장점
레디스 클러스터는 다음과 같은 기능을 제공함
- 자동 샤딩
- 일부 노드 장애 시에도 작동하는 고가용성
복수의 노드에 데이터를 자동으로 분산하여 저장함
각 노드는 전체 키 중 일부 슬롯을 담당하고, 키의 해시값으로 슬롯을 결정함
각 키는 하나의 슬롯에 대응되며, 그 슬롯을 담당하는 노드에서 데이터를 관리함
클러스터 모드에서는 서버 수를 증가시켜도 자동으로 데이터가 분산되므로, 수평적 확장이 가능함
장애가 발생해도 일부 노드가 작동 중이라면 클러스터 전체가 작동을 멈추지 않음
2. 레디스 클러스터가 사용하는 두 개의 TCP 포트
기본 포트는 6379이며, 클러스터 포트는 기본 포트에 10000을 더한 16379를 사용함
- 일반 명령어용: 6379
- 클러스터 노드 간 통신용: 16379
클러스터 포트를 통해 노드 간 상태 확인 및 슬롯 이동, 장애 감지, 선출 등을 수행함
방화벽 설정 시 두 포트 모두 열려 있어야 함
3. 동작 메커니즘
레디스 클러스터는 전체 키 공간을 0~16383까지의 슬롯으로 나눔
각 노드는 특정 슬롯 범위를 담당하며, 키는 CRC16 해시 함수를 통해 슬롯을 결정함
클러스터는 각 노드 간 메타정보를 공유하며 클러스터 상태를 유지함
노드 간 연결은 클러스터 포트를 통해 이루어지며, 내부적으로 클러스터 버스라 불리는 별도의 통신을 수행함
장애가 발생한 노드를 감지하여 레플리카 중 하나를 마스터로 승격함
II. 레디스 클러스터 장애 탐지
1. 장애 탐지 메커니즘
클러스터 구성 노드는 주기적으로 서로의 상태를 확인함
노드가 일정 시간 동안 응답하지 않으면 PFAIL 상태로 표시됨
다른 복수의 노드에서도 해당 노드를 PFAIL로 판단하면 FAIL 상태로 전환됨
이 과정은 클러스터 프로토콜에서 자동으로 처리되며, 관리자가 별도로 조작할 필요 없음
노드 간 통신은 클러스터 포트를 통해 수행되며, 상태 확인 메시지로 ping/pong 패킷을 주고받음
이 상태 확인은 노드 간 비동기적으로 진행됨
2. 레플리카 선출
마스터 노드가 FAIL 상태가 되면, 해당 마스터의 레플리카 노드 중 하나가 마스터로 승격됨
선출 기준은 다음과 같음
- 마지막으로 마스터와 동기화된 시점
- 레플리카 노드 자신이 FAIL 상태가 아님
- failover-delay-ms 설정값
복수의 레플리카가 후보가 될 수 있으므로 클러스터는 failover 선출 우선순위에 따라 자동 결정함
이 과정은 클러스터 내부에서 자율적으로 수행되며 외부 개입 없이도 동작함
III. 레디스 클러스터 키워드
1. 슬롯
레디스 클러스터는 키 공간을 16384개의 슬롯으로 나눔
각 키는 해시 함수를 통해 슬롯 번호로 변환되며, 그 슬롯을 담당하는 노드가 키를 관리함
클러스터 전체가 슬롯을 분할해서 각 노드가 일부 슬롯을 맡는 구조임
키는 반드시 하나의 슬롯에만 저장되며, 슬롯 단위로 데이터를 이동하거나 복제함
2. 해시태그
해시태그를 이용하면 여러 키를 동일 슬롯에 배치할 수 있음
키 이름 중 중괄호 {} 안에 지정된 문자열을 해시 계산에 사용함
예: user:{1000}:name, user:{1000}:email은 모두 같은 슬롯에 저장됨
이를 통해 복수 키를 대상으로 하는 연산(예: MGET, MULTI)이 가능해짐
3. 클러스터 버스
클러스터 내부 노드 간 통신을 위한 전용 메시지 채널임
클러스터 포트(기본 포트 + 10000)를 통해 수행됨
슬롯 재분배, 장애 감지, 마스터-레플리카 관계 확인 등 모든 클러스터 관리 메시지는 클러스터 버스를 통해 전달됨
텍스트 기반 RESP 프로토콜이 아닌 바이너리 포맷을 사용함
4. 파티셔닝
클러스터는 데이터를 자동으로 파티셔닝함
각 노드가 특정 슬롯 범위를 맡고, 키는 슬롯을 통해 분산됨
파티셔닝은 수평적 확장을 지원하는 핵심 메커니즘으로, 데이터를 균등하게 분산하여 부하를 분산시킴
IV. 레디스 클러스터 지원 클라이언트
1. MOVED 리다이렉트와 ASK 리다이렉트
레디스 클러스터에서 클라이언트가 잘못된 슬롯의 노드에 명령어를 보내면 에러를 반환함
MOVED는 해당 키의 슬롯이 다른 노드로 이동되었을 때 반환됨- 클라이언트는 반환된 주소의 노드로 다시 요청을 보내야 함
ASK는 일시적인 슬롯 이동이 발생했을 때 반환됨- 클라이언트는
ASKING명령어를 먼저 보낸 후 명령어를 재전송해야 함
2. 레디스 클러스터 지원 클라이언트 동작
클러스터를 지원하는 클라이언트는 MOVED와 ASK 응답을 처리할 수 있어야 함
- 대부분의 클러스터 지원 클라이언트는 내부에 슬롯 → 노드 맵을 유지함
- 클러스터의 메타데이터를 갱신하여 다음 요청부터는 올바른 노드로 명령어를 보냄
- 클라이언트가 redis-cli일 경우,
-c옵션을 붙여 클러스터 대응 모드로 실행함
3. 레디스 클러스터 지원 클라이언트 사용 방법
클러스터 대응 클라이언트는 클러스터 모드에 맞게 구현되어야 함
- 클러스터 초기 접속 시 한 노드만 지정하면, 나머지 노드 정보를 자동으로 수집함
- 이후 각 슬롯에 대해 어떤 노드가 담당하는지 알고 있기 때문에, 슬롯 기반으로 요청 라우팅 가능함
- 대부분의 클라이언트 라이브러리는 클러스터 전용 모듈이나 설정을 통해 활성화 가능함
예: JedisCluster (Java), LettuceClusterClient, ioredis (Node.js), redis-py-cluster (Python) 등
V. 레디스 클러스터 관련 명령어
클러스터 운용 시에는 일반적인 Redis 명령어 외에 클러스터 전용 명령어를 사용할 수 있음
이 명령어들은 주로 클러스터 상태 확인, 슬롯 재배치, 노드 정보 확인 등에 사용됨
주요 클러스터 명령어
CLUSTER INFO
클러스터 상태 정보를 출력함
예:cluster_state:ok,cluster_slots_assigned:16384,cluster_known_nodes:6등CLUSTER NODES
클러스터에 참여 중인 모든 노드 정보를 출력함
노드 ID, IP/포트, 마스터/레플리카 정보, 상태 플래그, 슬롯 정보 등을 확인할 수 있음CLUSTER SLOTS
슬롯이 어떤 노드에 할당되어 있는지를 확인할 수 있음
슬롯 범위와 마스터/레플리카 노드의 IP, 포트 정보가 함께 표시됨CLUSTER KEYSLOT <key>
지정한 키가 어떤 슬롯에 매핑되는지 확인할 수 있음
CRC16 해시값으로 계산된 슬롯 번호를 반환함CLUSTER COUNTKEYSINSLOT <slot>
특정 슬롯에 저장된 키의 수를 확인할 수 있음CLUSTER GETKEYSINSLOT <slot> <count>
해당 슬롯에 포함된 키를 최대 지정 수만큼 반환함
슬롯 이동 시 데이터 확인이나 디버깅 용도로 활용할 수 있음CLUSTER SETSLOT <slot> <NODE|MIGRATING|IMPORTING|STABLE> <node_id>
슬롯의 상태를 변경하는 명령어로, 데이터 마이그레이션 및 복구 시 사용됨CLUSTER MEET <ip> <port>
새로운 노드를 클러스터에 참여시키기 위한 명령어
이미 클러스터에 참여 중인 노드가 해당 노드와 정보를 교환함CLUSTER FORGET <node_id>
특정 노드를 클러스터에서 제거함
장애로 인해 더 이상 통신할 수 없는 노드를 수동으로 삭제할 때 사용됨CLUSTER RESET <HARD|SOFT>
노드의 클러스터 관련 설정을 초기화함HARD는 모든 정보 초기화,SOFT는 현재 노드 정보를 유지함CLUSTER FAILOVER [FORCE|TAKEOVER]
레플리카 노드를 수동으로 마스터로 승격함
자동 선출이 아닌 수동 장애 전환이 필요할 때 사용함
VI. 레디스 클러스터 설치 방법
레디스 클러스터는 최소 3개의 마스터 노드로 구성할 수 있음
각 마스터 노드에 대해 1개 이상의 레플리카 노드를 두는 것이 권장됨
예: 3마스터 + 3레플리카 = 총 6노드 구성
1. 모든 마스터 혹은 모든 레플리카에 특정 작업 실행
복수 노드에 같은 명령어를 실행할 경우 다음 방법 사용 가능
- redis-cli를 여러 인스턴스로 접속하여 개별 실행
- 셸 스크립트를 통해 일괄 실행 (예:
for루프 등) - 도커 컨테이너 환경이라면 docker-compose로 클러스터 환경 구성 가능
redis-cli --cluster명령어를 사용하여 클러스터 전체에 일괄 적용 가능
설치 및 초기화 절차 요약
- Redis 설정 파일 준비
cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000- 각 노드는 고유의 포트 사용 (예: 7000~7005)
appendonly yes설정으로 영속성 보장 가능
- Redis 서버 실행
- 각 설정 파일로 개별 인스턴스를 실행
- 같은 호스트에서 여러 포트를 사용할 수도 있음
- 클러스터 생성
redis-cli --cluster create <ip:port> ... --cluster-replicas 1- 마스터 3개, 각 마스터당 레플리카 1개씩 구성
- 슬롯은 자동 분배됨
- 클러스터 정상 작동 여부 확인
redis-cli -p <port> cluster infocluster_state:ok이면 클러스터 정상 동작 중
'서적 > 실전 Redis' 카테고리의 다른 글
| CHAPTER 10 클라우드에서 사용하는 레디스 [PART 02 실전] (1) | 2025.07.29 |
|---|---|
| CHAPTER 09 메모리 관리 [PART 02 실전] (3) | 2025.07.22 |
| CHAPTER 07 레플리케이션 [PART 02 실전] (2) | 2025.07.08 |
| CHAPTER 06 트러블슈팅 [PART 02 실전] (1) | 2025.07.01 |
| CHAPTER 05 레디스 운용 관리 [PART 02 실전] (2) | 2025.06.24 |