Redis는 인메모리 저장소라 프로세스가 재시작되면 기본적으로 데이터가 사라진다. 이를 방지하기 위해 두 가지 영속성(Persistence) 옵션을 제공한다.
특정 시점(Point-in-Time)의 전체 데이터를 바이너리 파일(.rdb)로 저장한다.
SAVE 900 1 — 900초 안에 1건 이상 변경되면 스냅샷 저장BGSAVE 명령으로 자식 프로세스를 fork해서 비동기로 저장하기 때문에 메인 스레드를 막지 않는다.모든 쓰기 명령(SET, XADD, JSON.SET 등)을 로그 파일(.aof)에 순서대로 기록한다. 재시작 시 로그를 처음부터 재실행해서 복구한다.
appendfsync always — 매 명령마다 디스크 동기화. 가장 안전하지만 느림.appendfsync everysec — 1초마다 동기화. 성능과 안전의 균형. 최대 1초치 유실.appendfsync no — OS에 맡김. 가장 빠르지만 유실 위험.BGREWRITEAOF로 압축(rewrite)해야 한다.| RDB | AOF | |
|---|---|---|
| 데이터 유실 | 스냅샷 주기만큼 | 최대 1초 (everysec 기준) |
| 복구 속도 | 빠름 | 느림 (명령 재실행) |
| 파일 크기 | 작음 | 커질 수 있음 |
| 손상 위험 | 낮음 | 파일 손상 가능 |
두 방식을 함께 활성화하면 Redis는 재시작 시 AOF로 복구(더 최신 상태)하고, AOF가 손상됐을 때 RDB를 백업으로 사용한다. 거래 주문, 결제처럼 유실이 허용되지 않는 데이터에는 이 이중 구성이 적합하다.
단일 Redis 인스턴스는 메모리 한계와 단일 장애점(SPOF) 문제가 있다. Redis Cluster는 이를 해결하기 위한 공식 분산 구성이다.
클러스터는 키 공간을 16,384개의 해시 슬롯으로 나눈다. 키가 들어오면 CRC16(key) % 16384로 슬롯을 결정하고, 해당 슬롯을 담당하는 노드로 라우팅한다.
노드 A: 슬롯 0 ~ 5460
노드 B: 슬롯 5461 ~ 10922
노드 C: 슬롯 10923 ~ 16383
각 마스터 노드에 레플리카를 둔다. 마스터가 응답하지 않으면 레플리카가 자동으로 마스터로 승격(Failover)되어 서비스가 중단되지 않는다.
여러 키를 같은 노드에 배치하고 싶을 때 {} 해시 태그를 사용한다. {user:1}:orders와 {user:1}:profile은 user:1 부분만 슬롯 계산에 사용되어 같은 노드에 저장된다. 트랜잭션(MULTI/EXEC)이나 다중 키 명령(MGET)은 같은 슬롯의 키에만 사용할 수 있기 때문에 키 설계 시 반드시 고려해야 한다.