redis는 인메모리 DB이지만 데이터를 디스크에 저장할 수 있다. 두가지 방법이 있다.
RDB(snapshotting)
- 특정한 간격마다 메모리에 있는 redis 데이터 전체를 디스크에 저장한다.
- 메모리에 있는 내용을 스냅샷을 떠서 디스크에 옮겨 담는데 이건 특정 시점의 메모리에 있는 데이터를 바이너리 파일로 저장한다는 의미이다.
- 스냅샷이란?
- 마치 사진 찍듯이 특정 시점에 스토리지의 파일 시스템을 포착해 보관하는 기술
- 스냅샷 기능을 이용하여 데이터를 저장하면 유실된 데이터 복원과 일정 시점의 상태로 데이터를 복원할 수 있음
- 그럼 백업과 스냅샷의 차이는..? 스냅샷의 방식은? 다음 포스팅에서 ..!
- 스냅샷은 바이너리 파일 형태로 저장되어서 직접 읽을 순 없다.
- .rdb라는 확장자의 파일에 데이터를 저장하는데, .rdb파일은 AOF 파일보다 사이즈가 작아서 로딩속도가 AOF 보다 빠르다.
- 하지만 스냅샷을 추출하는데 시간이 오래걸리고 스냅샷 추출하는 도중에 서버가 꺼지면 이후의 데이터들이 모두 사라지게 된다.
AOF(append only file)
- redis의 모든 쓰기 명령(write/update) 자체를 모두 로그 파일에 기록하는 형태
- 서버가 재시작될 때, 로그에 기록된 write/update 연산을 재실행하는 형태로 데이터를 복구한다.
- 동작 순서
1. redis 데이터 업데이트 명령 요청
2. redis는 해당 명령을 AOF에 저장
3. 파일쓰기가 완료되면 실제로 해당 명령을 수행해서redis 데이터 수정
- 로그 작성 속도가 빠르고 어떤 시점에 서버가 다운되더라도 데이터가 사라지지 않는다.
- 하지만 모든 연산을 로그파일에 남기기 때문에 로그 데이터 양이 굉장히 크고, 복구 시 모든 연산을 다시 실행하기 때문에 재시작 속도가 느리다.
RDB와 AOF중에 어떤걸 선택해야 할까?
- 단순하게 작업의 기록을 저장해서 재실행하는 형식으로 복구하는 방법인 AOF가 안정적이고 훨씬 좋은게 아닌가? 라고 생각할 수 있지만 RDB 방식에 비해 백업 데이터가 너무 크고, 서버 자원을 많이 사용하게 된다.
The general indication you should use both persistence methods is if you want a degree of data safety comparable to what PostgreSQL can provide you.
- redis 공식 문서에는 두 방법을 적절히 혼재해서 사용할 것을 권장하고 있다. 데이터 백업은 필요하지만 어느 정도 데이터 손실이 발생해도 괜찮은 경우 RDB를 단독으로 사용하고, 모든 데이터가 보장되어야 할 경우 AOF를 사용하면 된다.
- 가장 이상적인 방법은 두 방법을 함께 사용하는 것이다. 주기적으로 스냅샷 형태로 백업하고, 다음 스냅샷까지의 저장을 AOF 방식으로 수행하게 되면 서버가 재시작될 때 스냅샷 데이터를 로드하고, 많지 않은 양의 로그만 재 실행하면 되기 때문에 효율적이다.
[참고자료]
redis 참고자료
redis 데이터 연속성
스냅샷
redis 백업