Redis 스냅샷(RDB: Redis Database File)
RDB는 Redis의 데이터를 특정 시점에 복제해 디스크에 저장하는 방식입니다. 이 저장본을 **스냅샷(Snapshot)**이라고 하며, .rdb 파일로 저장됩니다. Redis 서버가 재시작되면 해당 파일을 불러와 데이터를 복원합니다.
RDB 저장 트리거 (자동 + 수동)
1. 자동 저장
- 설정 파일(redis.conf)에서 save 옵션으로 조건 정의
- 조건 중 하나라도 만족하면 RDB 스냅샷 생성
save 900 1 # 15분(900초) 동안 1개 이상의 키 변경 발생 시 저장
save 300 10 # 5분 동안 10개 이상
save 60 10000 # 1분 동안 1만 개 이상
2. 수동 저장
- 명령어 사용
- SAVE: 동기식 저장 (Redis가 멈추고 저장 완료까지 대기)
- BGSAVE: 비동기식 저장 (자식 프로세스 fork하여 백그라운드 저장)
주의: SAVE는 운영 중 잘 사용하지 않음. 장애 시 재시작 전 수동 저장 용도로 사용.
SAVE 명령의 위험성 (동기식 저장)
- SAVE는 현재 Redis 프로세스가 직접 RDB 파일을 생성합니다.
- 이 과정 동안 Redis는 **모든 클라이언트 요청을 차단(block)**합니다.
- 즉, 저장이 완료될 때까지 서비스는 멈춰 있는 것과 같은 상태가 됩니다.
- 따라서 실시간 트래픽이 있는 운영 환경에서는 절대 사용이 권장되지 않습니다.
예: 수 GB 메모리에서 SAVE를 호출하면 수 초~수십 초 동안 서비스 응답 중단
SAVE 내부 동작 원리
BGSAVE 실행 시
- Redis는 fork()를 호출하여 자식 프로세스를 생성
- 자식 프로세스는 현재 메모리 상태를 기반으로 RDB 파일 생성
- 부모 프로세스는 그대로 명령을 계속 처리
- 저장이 완료되면 자식 프로세스는 종료
이때 OS는 Copy-on-Write (COW) 메커니즘을 활용하여 메모리 복사를 최소화
이전에 레디스는 싱글 스레드로 작동한다고 했는데 자식 스레드를 fork해서 작업하다고 하니 의아할 수 있습니다.
Redis는 요청 처리(Request Handling)에 대해 싱글 스레드 로 작동하지만,
특정 작업(BGSAVE, AOF Rewrite 등)은 자식 프로세스를 fork해서 멀티 프로세싱으로 처리할 수 있습니다.
운영 환경에서는 BGSAVE 권장 (비동기 저장)
- BGSAVE는 자식 프로세스를 fork하여 RDB 파일을 저장하는 방식입니다.
- Redis는 부모 프로세스를 통해 클라이언트 요청을 계속 처리할 수 있습니다.
- 다만, fork() 자체가 부담스러운 작업이므로 다음과 같은 주의가 필요합니다:
- 메모리 사용량이 클 경우 fork 비용이 커짐
- 일시적인 CPU 스파이크 및 I/O 부하
- 자식 프로세스와 부모 프로세스 간 Copy-on-Write(COW) 발생
BGSAVE 내부 동작 원리
RDB 파일 위치 및 이름
- 기본 위치: Redis 실행 디렉토리 or dir 설정값
- 기본 이름: dump.rdb
- 설정 예시:
- dir /var/lib/redis dbfilename dump.rdb
3. 스냅샷 사용 사례
- RDB는 주기적인 백업 용도로 적합
- 비즈니스에 큰 지장을 주지 않는 데이터 손실 허용 시 기본값 유지 권장
- 백업 자동화 및 외부 백업 시스템 연동 시 사용 용이
- 마스터/슬레이브 구성 시 초기 데이터 동기화에도 사용됨
'DB > Redis' 카테고리의 다른 글
[Redis][실전레디스] 레디스 트랜잭션 MULTI-EXEC & Lua 스크립트 (0) | 2025.03.30 |
---|---|
[Redis][실전레디스] 레디스 운용관리 - 스냅샷 & AOF (0) | 2025.03.29 |