Redis 클러스터(Cluster)
Redis 클러스터(Redis Cluster)는 분산 환경에서 데이터의 가용성과 확장성을 제공하기 위해 설계된 Redis의 네이티브 분산 시스템이다. Redis 클러스터는 데이터가 자동으로 여러 노드에 분산되며, 고가용성과 샤딩을 지원한다.
Redis 클러스터를 더 쉽게 설명하면, 큰 데이터를 여러 Redis 서버에 나누어서 저장하고, 서버가 고장 나도 자동으로 복구할 수 있도록 도와주는 시스템이다.
주요 특징
- 데이터 샤딩(Sharding)
데이터를 16,384개의 해시 슬롯(Hash Slot)으로 나누고 이를 여러 노드(Master)에 분산하여 저장하는 구조이다.
각 마스터 노드는 일부 해시 슬롯을 담당하며, 이를 통해 데이터가 고르게 분배된다. - 고가용성(High Availability)
각 마스터 노드에는 최소 한 개 이상의 슬레이브 노드가 존재한다.
마스터 노드가 장애를 겪을 경우, 슬레이브 노드가 자동으로 승격(Failover)되어 데이터를 보호하고 서비스 연속성을 보장한다. - 확장성(Scalability)
Redis 클러스터는 새로운 노드를 추가하거나 제거하면서 데이터를 동적으로 리샤딩(Re-sharding)할 수 있는 구조이다.
이를 통해 클러스터는 손쉽게 확장할 수 있다.
** 리샤딩이란 Redis 클러스터에서 데이터 분포를 조정하는 작업을 의미한다.
Redis 클러스터는 데이터를 16,384개의 해시 슬롯(Hash Slot)으로 나누어 저장하며, 각 노드(Master)가 이 해시 슬롯 중 일부를 담당한다. 리샤딩은 노드의 추가 또는 제거 시 해시 슬롯과 데이터를 다시 분배하여 데이터가 고르게 분산되도록 조정하는 과정이다. - 자동 복구
노드 간 통신을 통해 클러스터의 상태를 지속적으로 모니터링하며, 장애 발생 시 자동으로 복구를 진행하는 기능을 갖추고 있다.
클러스터 구성이 필요한 이유
- 단일 서버의 한계 극복
단일 Redis 서버는 메모리 크기와 CPU 성능에 제한이 있다.
Redis 클러스터는 데이터를 여러 노드로 분산하여 더 많은 데이터를 저장하고, 더 높은 처리량을 제공한다. - 고가용성 보장
마스터 노드 장애 시 슬레이브 노드로 자동 승격을 진행함으로써 데이터 손실과 서비스 중단을 방지한다.
이를 통해 클러스터는 높은 가용성을 제공한다. - 수평적 확장성(Scalability)
데이터 크기가 증가하거나 트래픽이 많아질 경우, 노드를 추가하여 성능을 확장할 수 있다.
이를 통해 동적으로 데이터를 재분배하며 성능을 유지할 수 있다. - 성능 최적화
여러 노드가 병렬로 데이터를 처리하므로, 대규모 요청을 더욱 빠르게 처리할 수 있는 구조이다.
특정 노드가 과부하되지 않도록 데이터를 균등하게 분산한다.
구성해보기 (Docker 이용)
Redis 클러스터 구성
Redis 클러스터는 최소 3개의 마스터 노드가 필요하며, 고가용성을 위해 각 마스터에 슬레이브 노드를 추가하는 것이 일반적이다. (예: 총 6개의 노드로 구성)
1. Docker 네트워크 생성
Redis 노드 간 통신을 위해 Docker 네트워크를 생성한다.
docker network create redis-cluster
2. Redis 클러스터 구성용 컨테이너 실행
Redis 클러스터는 6개의 노드가 필요하기 때문에, Redis 7.0 버전을 기준으로 총 6개의 Redis 컨테이너를 띄운다.
아래는 컨테이너 실행 스크립트이며 별도의 쉘파일로 만들거나 직접 실행 시킬 수 있다.
for port in {7001..7006}; do \
docker run -d --name redis-$port \
--net redis-cluster \
-v $PWD/redis-$port:/data \
redis:7.0-alpine \
redis-server --port $port --cluster-enabled yes --cluster-config-file nodes.conf \
--cluster-node-timeout 5000 --appendonly yes; \
done
3. Redis 클러스터 초기화
클러스터를 초기화 하여 노드 간 연결을 설정한다.
우선 각 Redis 컨테이너의 IP 주소를 확인하고, 각 노드의 IP를 기반으로 클러스터를 구성한다.
# 각 Redis 컨테이너 노드의 IP를 확인하여 아래 클러스트 생성 명령에 적용한다.
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-7001
docker exec -it redis-7001 redis-cli --cluster create \
<IP01>:7001 <IP02>:7002 <IP03>:7003 <IP04>:7004 <IP05>:7005 <IP06>:7006 \
--cluster-replicas 1
클러스터 구성이 정상적으로 완료되었으면 아래와 같은 화면을 확인할 수 있다.
4. 클러스터 상태 확인
docker exec -it redis-7001 redis-cli -p 7001 cluster info
구성해보기 (Docker-Compose 이용)
1. Docker-Compose 파일 작성
version: '3.8'
services:
redis-node-1:
image: redis:7.0-alpine
container_name: redis-node-1
command: ["redis-server", "/usr/local/etc/redis/redis.conf", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
ports:
- "6379:6379"
volumes:
- ./redis-node/redis-node-1:/data
redis-node-2:
image: redis:7.0-alpine
container_name: redis-node-2
command: ["redis-server", "/usr/local/etc/redis/redis.conf", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
ports:
- "6380:6379"
volumes:
- ./redis-node/redis-node-2:/data
redis-node-3:
image: redis:7.0-alpine
container_name: redis-node-3
command: ["redis-server", "/usr/local/etc/redis/redis.conf", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
ports:
- "6381:6379"
volumes:
- ./redis-node/redis-node-3:/data
redis-node-4:
image: redis:7.0-alpine
container_name: redis-node-4
command: ["redis-server", "/usr/local/etc/redis/redis.conf", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
ports:
- "6382:6379"
volumes:
- ./redis-node/redis-node-4:/data
redis-node-5:
image: redis:7.0-alpine
container_name: redis-node-5
command: ["redis-server", "/usr/local/etc/redis/redis.conf", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
ports:
- "6383:6379"
volumes:
- ./redis-node/redis-node-5:/data
redis-node-6:
image: redis:7.0-alpine
container_name: redis-node-6
command: ["redis-server", "/usr/local/etc/redis/redis.conf", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
ports:
- "6384:6379"
volumes:
- ./redis-node/redis-node-6:/data
2. 구성된 노드를 기반으로 Cluster 구성
docker-compose 명령으로 생성된 6개 노드를 이용하여 클러스터를 구성하는 redis-cli 명령을 실행한다.
#!/bin/bash
# Redis 노드 검색 (Docker 컨테이너 이름 패턴 기준)
NODE_PATTERN="redis-node"
NODES=()
# Docker 컨테이너 목록에서 Redis 노드의 IP와 포트를 동적으로 가져오기
for container in $(docker ps --filter "name=${NODE_PATTERN}" --format "{{.Names}}"); do
NODE_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container")
NODE_PORT=6379 # Redis 기본 포트
NODES+=("${NODE_IP}:${NODE_PORT}")
done
# 노드 정보를 확인
if [ ${#NODES[@]} -eq 0 ]; then
echo "No Redis nodes found matching the pattern '${NODE_PATTERN}'."
exit 1
fi
# 노드 정보를 출력 (디버깅용)
echo "Detected Redis nodes: ${NODES[*]}"
# 클러스터 생성 명령
CLUSTER_CREATE_CMD="docker exec -it redis-node-1 redis-cli --cluster create ${NODES[@]} --cluster-replicas 1"
# 클러스터 생성 명령 실행
$CLUSTER_CREATE_CMD
# 클러스터 상태 확인
docker exec -it redis-node-1 redis-cli -c cluster info
터미널 창을 통해 Redis 클러스터가 정상적으로 생성된 것을 확인할 수 있다.
'Redis' 카테고리의 다른 글
[Redis] Redis 분산락(Distributed Lock)을 이용한 재고관리 구현 - 2 (0) | 2025.01.17 |
---|---|
[Redis] Redis 분산락(Distributed Lock)을 이용한 재고관리 구현 - 1 (0) | 2025.01.15 |