Redis의 데이터 영속성 메커니즘인 RDB 스냅샷과 AOF 로그를 정리합니다.
영속성이 필요한 이유
Redis는 인메모리 데이터베이스이므로, 서버가 재시작되면 모든 데이터가 사라집니다.
영속성(Persistence) 설정을 통해 디스크에 데이터를 저장하고 복구할 수 있습니다.
RDB vs AOF 비교
| 항목 |
RDB (스냅샷) |
AOF (Append Only File) |
| 방식 |
특정 시점의 메모리 전체를 덤프 |
모든 쓰기 명령을 로그로 기록 |
| 파일 |
dump.rdb |
appendonly.aof |
| 크기 |
작음 (바이너리 압축) |
큼 (명령어 텍스트) |
| 복구 속도 |
빠름 |
느림 (명령 재실행) |
| 데이터 손실 |
마지막 스냅샷 이후 데이터 유실 가능 |
최소 (fsync 정책에 따라) |
| 성능 영향 |
fork 시 순간 부하 |
지속적 I/O (적은 부하) |
| 용도 |
백업, 재해 복구 |
데이터 안전성 우선 |
RDB (Redis Database)
동작 방식
- Redis가 자식 프로세스를 fork
- 자식 프로세스가 메모리 데이터를 dump.rdb 파일로 저장
- 저장 완료 후 기존 파일을 교체
설정 (redis.conf)
# 자동 저장 조건 (초 변경수)
save 900 1 # 900초(15분) 동안 1개 이상 변경 시
save 300 10 # 300초(5분) 동안 10개 이상 변경 시
save 60 10000 # 60초(1분) 동안 10000개 이상 변경 시
# RDB 비활성화
save ""
# RDB 파일명
dbfilename dump.rdb
# 저장 디렉토리
dir /var/lib/redis
# 압축 사용
rdbcompression yes
# 체크섬 검증
rdbchecksum yes
수동 저장
# 동기 저장 (블로킹, 운영 환경 비권장)
SAVE
# 비동기 저장 (백그라운드, 권장)
BGSAVE
# 마지막 저장 시간 확인
LASTSAVE
RDB 장단점
| 장점 |
단점 |
| 단일 파일로 백업 간편 |
스냅샷 사이 데이터 유실 가능 |
| 복구 속도 빠름 |
fork 시 메모리 2배 필요할 수 있음 |
| 파일 크기 작음 |
대용량 데이터 시 fork 시간 증가 |
| 원격 백업 용이 |
|
AOF (Append Only File)
동작 방식
- 모든 쓰기 명령을 AOF 파일에 추가(append)
- 서버 재시작 시 AOF 파일의 명령을 순서대로 재실행하여 복구
설정 (redis.conf)
# AOF 활성화
appendonly yes
# AOF 파일명
appendfilename "appendonly.aof"
# fsync 정책
appendfsync always # 매 명령마다 (가장 안전, 가장 느림)
appendfsync everysec # 1초마다 (권장, 최대 1초 유실)
appendfsync no # OS에 위임 (가장 빠름, 유실 가능)
# AOF 재작성 조건
auto-aof-rewrite-percentage 100 # 이전 대비 100% 증가 시
auto-aof-rewrite-min-size 64mb # 최소 64MB 이상일 때
fsync 정책 비교
| 정책 |
데이터 안전성 |
성능 |
최대 유실 |
| always |
최고 |
느림 |
0 (유실 없음) |
| everysec |
높음 |
좋음 (권장) |
최대 1초 |
| no |
낮음 |
최고 |
OS 버퍼 크기만큼 |
AOF 재작성 (Rewrite)
AOF 파일이 커지면 자동으로 재작성하여 크기를 줄입니다.
예: INCR counter가 1000번 기록된 것을 SET counter 1000 하나로 압축
# 수동 재작성
BGREWRITEAOF
# AOF 상태 확인
INFO persistence
AOF 장단점
| 장점 |
단점 |
| 데이터 유실 최소화 |
파일 크기가 RDB보다 큼 |
| 사람이 읽을 수 있는 형식 |
복구 속도가 RDB보다 느림 |
| 재작성으로 크기 관리 |
지속적 디스크 I/O |
권장 설정 (운영 환경)
RDB + AOF 동시 사용 (권장)
# redis.conf
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# AOF 우선 로드 (둘 다 있을 때)
aof-use-rdb-preamble yes # AOF 앞부분을 RDB 형식으로 (Redis 4.0+, 빠른 복구)
용도별 권장 설정
| 용도 |
설정 |
| 순수 캐시 (유실 허용) |
RDB만 또는 영속성 비활성화 |
| 세션 스토어 |
AOF (everysec) |
| 메인 데이터 스토어 |
RDB + AOF |
| 메시지 큐 |
AOF (everysec) + Stream |
백업 및 복구
백업
# RDB 파일 복사 (BGSAVE 후)
BGSAVE
cp /var/lib/redis/dump.rdb /backup/redis/dump_$(date +%Y%m%d).rdb
# AOF 파일 복사
cp /var/lib/redis/appendonly.aof /backup/redis/
복구
# 1. Redis 중지
sudo systemctl stop redis
# 2. 백업 파일을 데이터 디렉토리에 복사
cp /backup/redis/dump.rdb /var/lib/redis/dump.rdb
# 또는
cp /backup/redis/appendonly.aof /var/lib/redis/appendonly.aof
# 3. Redis 시작 (AOF가 있으면 AOF 우선 로드)
sudo systemctl start redis
AOF 파일 손상 복구
# AOF 파일 검증
redis-check-aof --fix appendonly.aof
# RDB 파일 검증
redis-check-rdb dump.rdb
관련된 글 (redis > lecture-redis)