Redis RDB, AOF (Persistence)

  • Redis 에서 디스크에 백업하는 두가지 방식이 있다.
    • AOF: 입력/수정/삭제 명령이 실행될 때마다 입력하는 방식
    • RDB: 특정 시점에 메모리에 있는 데이터 전체를 바이너리 파일로 저장하는 방식.

AOF (Append Only File)

  • Redis에 수행되는 [입력/수정/삭제] 명령을 appendonly.aof 파일에 기록합니다.
  • AOF는 명령을 계속 추가하면서 기록합니다. 그래서 시간이 지날수록 AOF 파일의 용량은 커지는데 용량이 커지게되면 OS 파일 사이즈 제한이 걸려 기록이 중단되거나, 레디스 서버 시작시 로드타임이 길어질 수 있습니다. 이를 방지하기 위한 방법으로 Rewrite 기능을 사용하는 것인데 이는 특정 시점에 데이터 전체를 다시 쓰는 기능입니다.
    • 예를 들어 INCR 명령을 200번 수행했을 때 메모리에는 200 하나만 기록되어있지만 AOF는 200번 수행한 명령이 기록되어 있습니다. 만약 Rewrite를 수행했다면 이전기록은 사라지고 최종 데이터만 기록이됩니다. INCR count 1000 -> SET count 1000 처럼 기록될 것입니다.
AOF Rewrite 동작 순서
  1. Child Process fork() 함.
  2. Child Process 는 새로운 AOF temp 파일에 데이터를 쓴다.
    1. 동시에 Parent Process는 새로운 명령을 메모리 버퍼에 기록하면서 현재 AOF파일에도 쓴다. (Rewrite 실패 방지)
  3. Child Process가 fork()된 시점에 1차 쓰기가 완료되면 Child Process는 Parent Process에 stop시그널을 보낸다.
  4. Parent Process는 시그널을 받으면 Child Process가 쓰는 동안 새로 발생한 데이터를 ChildProcess에게 보내고, ChildProcess는 이를 2차로 AOF temp 파일에 쓴다. (2차 쓰기)
    1. 쓰기가 완료되면 파일을 닫고 Parent Process에게 완료 시그널을 보낸다.
  5. Parent Process는 AOF temp파일을 열고, 2차 쓰기 동안 추가로 발생한 데이터를 AOF 파일에 쓴다. (3차쓰기)
  6. 3차 쓰기 가 완료되면 현재 AOF파일을 삭제하고 새 파일로 교체하여 새롭게 쓰기를 시작한다.

RDB

  • 특정 시점에 메모리에 있는 데이터 전체를 바이너리로 저장하는 것이다.
    • 특정 시점에 저장하기 때문에 AOF보다 용량도 적고 로딩속도가 빠르다.
  • RDB의 설정은 redis.conf 에서 save 라인을 참고하면 된다.

redis.conf

save 900 1
save 300 10
save 60 10000
  • save 900 1 : 900초 동안 1번이상 key변경이 발생할때 저장.
  • save 300 10 : 300초 동안 10번이상 key변경이 발생할때 저장.
  • save 60 10000 : 60초 동안 10,000번이상 key변경이 발생할때 저장.

만약 RDB를 수행하지 않으려면 위 코드를 주석처리하면 된다.