[Redis] 영속화와 백업 전략 — RDB & AOF 완벽 정리

Redis는 인메모리 저장소라 매우 빠르지만, 서버 재시작·장애 시 메모리 데이터가 사라집니다. 이를 보완하는 것이 영속화(Persistence) 입니다. 이 글에서는 두 방식인 RDB(스냅샷)AOF(쓰기 로그) 의 개념·설정·장단점을 비교하고, Redis 7 하이브리드 등 실무 운영 전략까지 정리합니다.

📌 왜 영속화가 필요한가? #

Redis는 기본적으로 데이터를 메모리에 둡니다. 즉 프로세스 종료·서버 재부팅 시 데이터가 사라집니다. 이를 막기 위해 디스크에 저장하는 두 가지 방식을 제공합니다.

  1. RDB (Snapshotting) — 특정 시점 스냅샷
  2. AOF (Append Only File) — 모든 쓰기 명령 로그

1️⃣ RDB (Snapshotting) #

개념 #

특정 시점의 메모리 데이터를 스냅샷으로 디스크에 저장합니다. dump.rdb 파일로 저장되고, 재시작 시 이 파일을 읽어 복구합니다.

SAVE vs BGSAVE #

명령동작
SAVE프로세스를 멈추고 즉시 저장 (blocking — 서비스 중단 위험)
BGSAVE자식 프로세스를 fork해 백그라운드 저장 (non-blocking)

Redis는 기본적으로 BGSAVE 방식을 사용합니다.

설정 예시 (redis.conf) #

1save 900 1      # 900초 동안 1회 이상 변경되면 저장
2save 300 10     # 300초 동안 10회 이상 변경되면 저장
3save 60 10000   # 60초 동안 10000회 이상 변경되면 저장
4
5dbfilename dump.rdb
6dir /var/lib/redis
7stop-writes-on-bgsave-error yes
8rdbcompression yes
9rdbchecksum yes

💡 여러 save 조건은 하나라도 만족하면 스냅샷이 실행됩니다.

장단점 #

항목장점단점
파일 크기작음스냅샷 사이 데이터 유실 가능
복구 속도빠름fork 비용 발생
운영 특성빠른 백업빈번 저장 시 성능 영향

2️⃣ AOF (Append Only File) #

개념 #

모든 쓰기 명령(SET, DEL 등)을 순차적으로 로그에 기록합니다. 재시작 시 로그를 재실행해 복구하며, 텍스트 형식이라 사람이 읽을 수도 있습니다.

설정 예시 (redis.conf) #

1appendonly yes
2appendfilename "appendonly.aof"
3appendfsync everysec
4auto-aof-rewrite-percentage 100
5auto-aof-rewrite-min-size 64mb

주요 옵션 #

옵션설명
appendfsync로그 동기화 타이밍 (always / everysec / no)
no-appendfsync-on-rewriterewrite 중 fsync 중단 여부
auto-aof-rewrite-percentage자동 rewrite 트리거 비율
auto-aof-rewrite-min-size자동 rewrite 최소 파일 크기
aof-load-truncated손상 시 잘린 부분까지만 로드
aof-use-rdb-preambleAOF에 RDB 프리앰블 포함(하이브리드)
aof-timestamp-enabled타임스탬프 기록 여부

💡 appendfsync everysec(기본 권장)은 백그라운드 스레드가 1초마다 fsync합니다. 성능을 유지하면서 최악의 경우 데이터 손실은 1초 수준입니다.

AOF Rewrite (압축) #

AOF는 계속 쌓여 커지므로, Rewrite로 불필요한 명령을 정리합니다. 예를 들어 같은 키에 SET이 100번 실행됐다면 마지막 값만 남겨 파일을 최적화합니다.

장단점 #

항목내용
파일 크기
복구 속도느림(로그 재실행)
데이터 무결성높음

🆚 RDB vs AOF 비교 #

항목RDBAOF
저장 방식스냅샷 시점 저장모든 쓰기 명령 로그
복구 시점가장 최근 스냅샷전체 로그 재실행
파일 크기작음
복구 속도빠름느림
데이터 완전성일부 유실 가능대부분 보장
운영 상황주기 백업데이터 무결성 우선

🔄 Redis 7 하이브리드 (RDB + AOF) #

Redis 7.0부터 AOF는 multi-part 구조로 바뀌었습니다. AOF rewrite 시 부모 프로세스는 새 증분(incremental) AOF에 계속 쓰고, 자식 프로세스가 기준(base) AOF(RDB 형식)를 생성한 뒤, 매니페스트 파일로 원자적 교체를 수행합니다.

대부분의 프로덕션에서는 RDB + AOF 하이브리드 + appendfsync everysec 조합이 권장됩니다.

  • RDB 스냅샷으로 빠른 재시작
  • AOF로 최대 1초 손실 수준의 무결성

🧩 실습 예시 (Docker) #

1# RDB 기반 — redis.conf의 save 조건으로 스냅샷
2docker run \
3  -v $(pwd)/redis.conf:/redis.conf \
4  --name redis-rdb \
5  redis redis-server /redis.conf

AOF는 redis.confappendonly yes를 켠 뒤 같은 방식으로 실행하면 됩니다.


🤔 운영 전략 #

  • 순수 캐시 용도 → 영속화 비활성화 가능(속도 우선)
  • 주기 백업 → RDB 스냅샷
  • 데이터 무결성 우선 → AOF 활성화
  • 균형(권장) → RDB + AOF 동시 활성화

❓ 자주 묻는 질문 #

Q. RDB와 AOF 중 무엇을 켜야 하나요? 프로덕션이라면 둘 다(하이브리드) 가 기본입니다. RDB로 빠른 복구, AOF로 유실 최소화를 동시에 얻습니다.

Q. appendfsync always가 더 안전한데 왜 everysec을 권장하나요? always는 매 쓰기마다 fsync라 가장 안전하지만 처리량이 크게 떨어집니다. everysec은 성능과 안전(최대 1초 손실)의 균형점입니다.

Q. AOF 파일이 너무 커집니다. auto-aof-rewrite-* 설정으로 자동 Rewrite를 켜 두면 주기적으로 압축됩니다.


📚 참고 #

Advertisement