Redis Cluster 설정 문제 해결: 슬롯 분배 및 네트워크 구성
Redis Cluster 설정 과정에서 발생하는 슬롯 분배 문제와 네트워크 구성 이슈를 해결하는 방법을 설명합니다.
Redis Cluster 설정 문제 해결
Introduction
Redis Cluster는 수평적 확장성을 제공하는 강력한 분산 데이터베이스 솔루션이지만, 설정 과정에서 여러 가지 문제에 직면할 수 있습니다. 특히 슬롯 분배, 네트워크 구성, 노드 간 통신 등에서 빈번한 문제가 발생합니다. 이 글에서는 실제 프로덕션 환경에서 겪은 문제들과 그 해결 방법을 다루겠습니다.
Environment
# Redis 버전 확인
redis-cli --version
# Redis Cluster 상태 확인
redis-cli -c -h 127.0.0.1 -p 7000 cluster info
redis-cli -c -h 127.0.0.1 -p 7000 cluster nodes# docker-compose.yml
version: '3.8'
services:
redis-node-1:
image: redis:7.2
ports:
- "7000:6379"
command: redis-server /usr/local/etc/redis/redis.conf
volumes:
- ./redis-node-1.conf:/usr/local/etc/redis/redis.conf
redis-node-2:
image: redis:7.2
ports:
- "7001:6379"
command: redis-server /usr/local/etc/redis/redis.conf
volumes:
- ./redis-node-2.conf:/usr/local/etc/redis/redis.conf
redis-node-3:
image: redis:7.2
ports:
- "7002:6379"
command: redis-server /usr/local/etc/redis/redis.conf
volumes:
- ./redis-node-3.conf:/usr/local/etc/redis/redis.confProblem
Redis Cluster 설정 시 다음과 같은 에러들이 발생했습니다:
# 클러스터 생성 시도
redis-cli --cluster create \
127.0.0.1:7000 \
127.0.0.1:7001 \
127.0.0.1:7002 \
--cluster-replicas 0
# 에러 메시지
# [ERR] Node 127.0.0.1:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains key in db 0.# 클러스터 노드 상태 확인
redis-cli -c -h 127.0.0.1 -p 7000 cluster nodes
# 3da65f2f-... 127.0.0.1:7000@17000 myself,master - 0 0 0 connected
# [OK] All 16384 slots covered.
#但这实际上은 슬롯이 분배되지 않은 상태Analysis
문제의 근본 원인을 분석했습니다:
# 기존 노드 데이터 확인
redis-cli -h 127.0.0.1 -p 7000 dbsize
# (integer) 1523
# 클러스터 설정 파일 확인
cat redis-node-1.conf
# cluster-enabled yes
# cluster-config-file nodes-7000.conf
# cluster-node-timeout 5000
# appendonly yes
# 노드 간 연결 테스트
redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7001
# OK
redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7002
# OK
# 슬롯 상태 확인
redis-cli -h 127.0.0.1 -p 7000 cluster slots
# 1) 1) (integer) 0
# 2) (integer) 5460
# 3) 1) "3da65f2f-..."
# 2) "127.0.0.1"
# 3) (integer) 7000Solution
1단계: 클러스터 초기화
# 모든 노드에서 기존 데이터 삭제
redis-cli -h 127.0.0.1 -p 7000 flushall
redis-cli -h 127.0.0.1 -p 7001 flushall
redis-cli -h 127.0.0.1 -p 7002 flushall
# 클러스터 설정 파일 삭제
rm -f /var/lib/redis/nodes-700*.conf
# 노드 재시작
systemctl restart redis-node-1
systemctl restart redis-node-2
systemctl restart redis-node-32단계: 클러스터 생성
# 슬롯 자동 분배로 클러스터 생성
redis-cli --cluster create \
127.0.0.1:7000 \
127.0.0.1:7001 \
127.0.0.1:7002 \
--cluster-replicas 0
# 출력:
# >>> Adding slot 0-5460 to node 127.0.0.1:7000
# >>> Adding slot 5461-10922 to node 127.0.0.1:7001
# >>> Adding slot 10923-16383 to node 127.0.0.1:7002
# >>> Trying to optimize slaves allocation for anti-affinity
# [OK] All 16384 slots covered.3단계: 슬롯 수동 분배 (선택사항)
# 특정 슬롯 이동
redis-cli -h 127.0.0.1 -p 7000 cluster addslots 0 1 2 3 4 5
# 슬롯 마이그레이션
redis-cli --cluster reshard 127.0.0.1:7000 \
--cluster-from 3da65f2f-... \
--cluster-to 7b2e8a1c-... \
--cluster-slots 100 \
--cluster-yes4단계: 클라이언트 연결 테스트
# 클러스터 모드로 연결
redis-cli -c -h 127.0.0.1 -p 7000
# 데이터 저장 테스트
127.0.0.1:7000> SET user:1000 "joel"
-> Redirected to slot [5983] located at 127.0.0.1:7001
OK
# 데이터 조회 테스트
127.0.0.1:7001> GET user:1000
"joel"Lessons Learned
- 빈 노드 필수: 클러스터 생성 전 반드시 모든 노드의 데이터를 비워야 합니다
- 방화벽 설정: 클러스터 버스 포트(기본 포트+10000)가 방화벽에서 열려 있어야 합니다
- IP 설정:
cluster-announce-ip를 명시적으로 설정하는 것이 안정적입니다 - 모니터링:
CLUSTER INFO와CLUSTER NODES를 정기적으로 확인해야 합니다 - 점진적 확장: 대규모 클러스터는 한 번에 추가하지 말고 점진적으로 확장하는 것이 안전합니다
이 블로그는 외부 스폰서십, 제휴 마케팅 또는 광고 수익을 받지 않습니다.