Redis
- 인메모리 DB
- 레디스 서버에 장애 발생 시 메모리에 있는 데이터 손실 가능성 있음
➡️ 레디스를 영구 저장소로 사용한다면 디스크에 데이터를 주기적으로 백업해야 함
- 두가지 백업 방식
- AOF : 레디스 인스턴스가 처리한 모든 쓰기 작어을 차례대로 기록함. 복원 시에는 파일을 다시 읽으며 데이터 셋 재구성
- RDB : 일정 시점에 메모리에 저장된 데이터 전체를 저장함
- 일반적인 영구 저장소 만큼의 안정성을 원하는 경우 두가지 백업 방식 모두 사용
복구 로직
- 레디스 서버는 재시작될 때 AOF 파일이나 RDB 파일이 존재하는지 확인한다.
- 파일이 있다면 파일을 로드함
- 레디스는 RDB 파일보다 AOF 파일이 더 내구성이 보장된다고 판단하기 때문에 AOF 파일 우선으로 데이터를 로드함
AOF
- 레디스에서 수행된 모든 쓰기 작업의 로그를 기록함
- AOF 파일 편집해서 원하는 시점으로 복구 가능함
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
AOF rewirte

- 점점 커지는 파일을 주기적으로 압축시키는 과정
- 특정 조건에 자동으로 재구성 되도록 설정 가능함
- 과정
- 자식 프로세스를 생성해 레디스 메모리를 데이터를 읽어와 신규로 생성한 임시 파일에 저장함
- 백그라운드로 (1) 의 과정이 진행되는 동안 레디스 메모리의 데이터가 변경된 내역은 기존의 AOF 파일과 인메모리 버퍼에 동시에 저장됨
- AOF 재구성 과정이 끝나면 인메모리 버퍼에 저장된 내용을 임시 파일 마지막에 추가함
- 임시 파일로 기존 AOF 파일 덮어 씌우기
AOF 의 성능 최적화
- 비동기 쓰기
- Redis는 AOF에 데이터를 비동기적으로 기록할 수 있어, 데이터를 디스크에 기록하는 동안에도 메모리에서의 작업이 빠르게 처리
- AOF 파일 압축
- AOF 파일은 시간이 지남에 따라 커질 수 있지만, Redis는 주기적으로 AOF 파일을 압축하여 파일 크기를 줄임
- 압축 과정에서는 중복된 명령어들이 제거되어, 데이터 복원시 성능을 높임
- 디스크 쓰기와 메모리 작업의 분리
- Redis는 AOF 작업을 수행할 때 메모리에서 데이터 처리와 디스크에 데이터를 기록하는 작업을 철저히 분리함
➡️ 이로 인해 AOF 파일을 디스크에 쓰는 작업이 병목으로 작용하지 않으며, Redis는 여전히 빠른 응답 시간을 유지함
RDB
- 사용자가 지정한 시간 단위로 파일이 저장됨
- 특정 시점의 메모리 데이터가 스냅샷처럼 저장됨
- AOF 보다 복구가 빠름
- 손실 가능성 있음
➡️ 저장 시점부터 장애가 발생한 직전까지의 데이터는 손실될 수 있음
save <초> <키의 개수> : <초> 동안 <키의 개수> 이상 키가 변경된 경우 RDB 파일 생성
save 900 1
AOF vs RDB
- AOF를 기본으로 하고, RDB를 Option으로 함
- AOF 시간 설정은 everysec로 하고, AOF Rewrite를 사용함
- AOF를 사용해도 성능에 거의 영향을 미치지 않음
- 복구 속도
- AOF :
DB loaded from append only file: 6.406 seconds
- RDB :
DB loaded from disk: 4.510 seconds
출처
Durable Redis