Redis는 메모리에 데이터를 저장합니다. 서버가 재시작되면 데이터가 사라집니다. 이를 방지하기 위해 Redis는 두 가지 영속성 메커니즘을 제공합니다.
RDB(Redis Database)는 특정 시점의 메모리 데이터를 통째로 디스크에 저장합니다.
t=0 [데이터 A, B, C] → dump.rdb 저장
t=1 데이터 변경 (D 추가)
t=2 [데이터 A, B, C, D] → dump.rdb 저장
# redis.conf
save 900 1 # 900초 안에 1개 이상 변경되면 저장
save 300 10 # 300초 안에 10개 이상 변경되면 저장
save 60 10000 # 60초 안에 10000개 이상 변경되면 저장
dbfilename dump.rdb
dir /var/lib/redis
# 동기 저장 (완료까지 Redis 블로킹)
SAVE
# 비동기 저장 (백그라운드에서 fork 후 저장)
BGSAVE
# 마지막 저장 시각 확인
LASTSAVE
fork: 부모 프로세스의 메모리를 복사해 자식 프로세스를 생성하는 OS 기능. RDB는 fork 후 자식이 파일에 쓰는 동안 부모는 계속 요청을 처리합니다.
장점:
단점:
AOF(Append Only File)는 Write 명령을 모두 로그 파일에 추가합니다. 재시작 시 로그를 재실행해 데이터를 복구합니다.
SET user:1 "철수" → appendonly.aof에 기록
INCR counter → appendonly.aof에 기록
DEL temp → appendonly.aof에 기록
# redis.conf
appendonly yes
appendfilename "appendonly.aof"
# 디스크 동기화 주기
appendfsync always # 모든 명령마다 (가장 안전, 느림)
appendfsync everysec # 초당 1회 (기본값, 최대 1초 데이터 유실 가능)
appendfsync no # OS에 맡김 (빠름, 데이터 유실 위험)
fsync: OS 버퍼에 있는 데이터를 실제 디스크에 기록하도록 강제하는 시스템 호출. always는 모든 명령마다 fsync를 호출해 가장 안전하지만 I/O 부하가 큽니다.
시간이 지나면 AOF 파일이 커집니다. BGREWRITEAOF로 최소한의 명령 집합으로 압축할 수 있습니다.
# AOF 파일 재작성 (백그라운드)
BGREWRITEAOF
# 자동 재작성 설정
# redis.conf
auto-aof-rewrite-percentage 100 # 파일 크기가 2배가 되면
auto-aof-rewrite-min-size 64mb # 64MB 이상일 때만
예시: INCR counter를 1000번 한 경우, AOF에는 1000줄이 쌓입니다. 재작성하면 SET counter 1000 1줄로 압축됩니다.
장점:
everysec 설정 시 최대 1초 치 데이터만 유실always 설정 시 데이터 손실 없음단점:
| 항목 | RDB | AOF |
|---|---|---|
| 파일 크기 | 작음 | 큼 |
| 복구 속도 | 빠름 | 느림 (로그 재실행) |
| 데이터 유실 | 저장 주기만큼 | 최대 1초 (everysec) |
| 백업 편의성 | 좋음 (파일 하나) | 복잡 |
| 쓰기 성능 | 좋음 | 약간 느림 |
운영 환경에서는 RDB와 AOF를 함께 사용하는 것이 권장됩니다. 재시작 시 AOF를 우선 사용해 복구하고, RDB는 주기적 백업과 빠른 스냅샷 용도로 씁니다.
# redis.conf — 함께 사용
save 900 1
appendonly yes
appendfsync everysec
캐시 전용으로 쓰고 데이터 유실이 허용된다면 두 방식 모두 끌 수 있습니다. 메모리 사용을 최소화하고 쓰기 성능을 높입니다.
# redis.conf
save "" # RDB 끄기
appendonly no # AOF 끄기