Redis 고가용성이 필요한 이유
Redis를 캐시뿐 아니라 세션 스토어, 실시간 랭킹, 메시지 큐 등 핵심 데이터 저장소로 사용할 때, 단일 인스턴스 장애는 서비스 전체에 영향을 줍니다.
Redis Sentinel
Sentinel은 마스터-레플리카 구조에 자동 장애 조치(failover)를 추가한 시스템입니다.
Sentinel 설정
# sentinel.conf
port 26379
sentinel monitor mymaster 10.0.1.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel notification-script mymaster /opt/redis/notify.sh
클라이언트 연결 (Node.js)
const Redis = require('ioredis');
const redis = new Redis({
sentinels: [
{ host: '10.0.1.10', port: 26379 },
{ host: '10.0.1.11', port: 26379 },
{ host: '10.0.1.12', port: 26379 }
],
name: 'mymaster',
sentinelPassword: 'sentinel-pass',
password: 'redis-pass',
db: 0,
retryStrategy(times) {
return Math.min(times * 100, 3000);
}
});
redis.on('connect', () => console.log('Connected to Redis'));
redis.on('+failover', () => console.log('Failover detected'));
Redis Cluster
Redis Cluster는 데이터를 16,384개의 해시 슬롯으로 분산하여 여러 노드에 저장합니다.
클러스터 생성
redis-cli --cluster create \
10.0.1.1:6379 10.0.1.2:6379 10.0.1.3:6379 \
10.0.1.4:6379 10.0.1.5:6379 10.0.1.6:6379 \
--cluster-replicas 1
redis-cli --cluster check 10.0.1.1:6379
redis-cli --cluster add-node 10.0.1.7:6379 10.0.1.1:6379
redis-cli --cluster reshard 10.0.1.1:6379
클라이언트 연결 (Node.js)
const Redis = require('ioredis');
const cluster = new Redis.Cluster([
{ host: '10.0.1.1', port: 6379 },
{ host: '10.0.1.2', port: 6379 },
{ host: '10.0.1.3', port: 6379 }
], {
redisOptions: { password: 'redis-pass' },
scaleReads: 'slave',
maxRedirections: 16,
retryDelayOnFailover: 300
});
// Hash Tag 사용: 같은 슬롯으로 라우팅
await cluster.set('{user:100}.name', 'Kim');
await cluster.set('{user:100}.email', 'kim@test.com');
비교표
| 기준 | Sentinel | Cluster |
|---|---|---|
| 데이터 분산 | 없음 (단일 마스터) | 해시 슬롯 기반 샤딩 |
| 최대 메모리 | 단일 노드 한계 | 노드 수 x 메모리 |
| 최소 노드 | 3 (Sentinel) + 3 (Redis) | 6 (Master 3 + Replica 3) |
| 자동 failover | 지원 | 지원 |
| multi-key 연산 | 제한 없음 | 같은 슬롯만 가능 |
| Pub/Sub | 정상 동작 | 모든 노드에 브로드캐스트 |
| Lua 스크립트 | 제한 없음 | 같은 슬롯 키만 |
| 운영 복잡도 | 낮음 | 높음 |
선택 가이드
- Sentinel 선택: 메모리 32GB 이하, multi-key 연산 필요, Lua 스크립트 활용, 운영 간소화 우선
- Cluster 선택: 메모리 32GB 초과, 쓰기 트래픽 수평 확장 필요, 대규모 데이터셋
- 대부분의 서비스는 Sentinel로 충분합니다. Cluster는 데이터가 수십 GB 이상일 때 고려하세요.
- Redis 7.0+의 Cluster는 성능과 안정성이 크게 향상되었으므로, 신규 구축 시 최신 버전을 사용하세요.
댓글 0