[Redis] AOF vs RDB - Redis 메모리 관리 방식 비교

728x90
반응형
SMALL
반응형

 

# RDB (Redis Database)

 

특정 시점(snapshot)의 메모리에 있는 데이터 전체를 바이너리 파일로 저장한다.

 

AOF 파일보다 사이즈가 작다. 따라서 로딩 속도가 AOF 보다 빠르다.

 

저장 시점은 redis.conf의 save 파라미터로 설정한다.

  • save 900 1 : 900초 동안 1번 이상 key 변경 발생 시 저장
  • save 300 10 : 300초 동안 10번 이상 key 변경 발생 시 저장
  • save 조건은 여러 개 지정 가능, 모두 or 조건. 즉, 하나라도 만족하면 수행

 

RDB 파일 이름 지정은 redis.conf에서 dbfilename dump.rdb

 

BGSAVE 또는 SAVE 명령으로 RDB 파일 생성 가능

  • BGSAVE : 파일 쓰기 작업은 child process가 생성되어 background로 실행되므로 쓰기 작업 중에도 레디스 서버는 클라이언트의 명령을 정상 처리 가능

 

  • SAVE : 파일 쓰기 작업을 레디스 main process가 직접 하므로 끝날 때까지 클라이언트의 명령 처리 불가

 


 

## redis.conf

  • stop-writes-on-bgsave-error: yes (or no)
    • yes인 경우, 레디스는 RDB 파일을 디스크에 저장하다 실패하면, 모든 쓰기 요청을 거부한다. 쓰기에 문제가 생겼으니, 빨리 조치를 취하라는 의미
    • no인 경우, 디스크 저장에 실패하더라도, 레디스는 쓰기 요청을 포함한 모든 동작을 정상적으로 처리한다.
    • 서비스를 계속하는 것이 중요하고 모니터링이 잘되어 있다면 no 권장
    • 이 파라미터는 sava 이벤트에만 해당, bgsave 명령 직접 입력 시 해당하지 않는다.

 

  • rdbcompression: yes (or no) : RDB 파일을 쓸 때 압축 여부 설정

 

  • dbfilename dump.rdb : RDB 파일명 지정, path 지정 불가

 

 



 

# AOF (Append Only File)

 

appendonly.aof 파일에 기록된다.

  • 입력/수정/삭제 명령이 실행될 때 마다 기록된다. 조회 명령은 제외

 

AOF는 계속 추가가 되면서 기록된다. 하지만, 특정 시점에 데이터 전체를 다시 쓰는 기능이 있다.

 

AOF는 계속 추가하면서 기록되기 때문에 파일 사이즈가 계속 커진다.

너무 커지면 OS 파일 사이즈 제한이 걸려 기록이 중단될 수도 있고, 레디스 서버 시작 시 로드가 지연될 수 있다.

 

이런 경우, rewrite를 통해 파일 데이터를 다시 써서 사이즈를 줄인다.

  • ex) set 명령으로 동일한 key의 value를 5번 변경하면 메모리에는 수행된 값만 남아있다. 하지만, AOF에는 5번이 모두 남아있기에 rewrite를 수행해서 이전 기록은 모두 지우고 최종 데이터만 기록한다.

 

AOF 파일은 text 파일이므로 edit 가능하다.

실수로 FLUSHALL 명령으로 메모리에 있는 데이터 전체를 날렸을 경우, 즉시 레디스 서버를 shutdown 하고,

appendonly.aof 파일에서 FLUSHALL 명령을 제거한 후 레디스를 다시 시작하면 데이터 손실 없이 DB를 살릴 수 있다.

 



## AOF rewrite 동작 순서

child process fork()

 

child process는 데이터를 새 AOF temp파일에 쓴다.

동시에 parent process는 새로운 명령을 메모리 버퍼에 기록하면서 현재 aof 파일에도 쓴다.

rewrite 작업 실패 시 데이터 보존을 위해..

 

child process가 fork()된 시점의 데이터 쓰기(1차 쓰기) 완료가 되면 child → parent로 stop 시그널 전송

 

parten에서 시그널 받으면 child가 쓰는 동안 발생한 새 데이터를 child로 보내고

child는 이 데이터를 받아 임시 AOF파일(2차 쓰기)에 쓴다. 쓰기 완료 시 parent 완료 시그널

 

parent는 임시 AOF 파일을 열고, 2차 쓰기 동안  추가로 발생한 데이터를 AOF 파일(3차 쓰기)에 쓴다.

 

3차 쓰기가 완료되면 현 AOF 파일을 삭제하고 새 파일로 교체한 다음, 새 파일에 쓴다.

 



 

## redis.conf

  • appendonly yes

 

  • appendfilename "appendonly.aof" : AOF 파일명 지정, path는 불가

 

  • appendfsync : AOF 기록 시점
    • always : 모든 명령 기록, 데이터 유실 염려는 없으나 성능 저하
    • everysec : 1초마다 기록, 1초 사이 데이터 유실 가능성 존재, 성능에 거의 영향을 미치지 않으면서 데이터를 보존할 수 있어 권장
    • no : OS가 기록 시점 정의, 일반적으로 리눅스 디스크 기록 간격은 30초, 유실 위험 큼

 

  • auto-aof-rewrite-percentage 100 : AOF 파일 사이즈가 100% 이상 커지면 rewrite

 

  • auto-aof-rewrite-min-size 64mb : AOF 파일 사이즈가 64mb 이하면 rewirte를 하지 않는다. 파일 사이즈가 작을 때 rewrtie가 발생 방지

 


 

# 정리

 

## AOF

  • AOF를 기본으로 하고, RDB를 Option으로 사용.
  • AOF 시간 설정은 everysec, AOF rewrite 사용.
  • Master 노드이고 Auto-restart 기능 사용 시 AOF를 사용하는 것이 안전하다.
  • Master 노드가 자동 재시작했을 때 AOF 파일은 없고, 몇 분 전 RDB 파일만 있다면 Slave 노드들의 데이터도 마스터와 같이 몇 분 전 RDB 파일의 데이터를 받게 된다.

 

## DB 복구

  • redis.conf의 appendonly 설정이 yes일때는 AOF 파일을 먼저 읽고, no인 경우에는 RDB 파일을 먼저 읽는다.
  • appendonly 설정이 yes일 때, AOF 파일이 없다면 RDB가 있어도 읽지 않는다. 반대도 마찬가지.
  • 레디스 서버 시작 시 별도의 명령 없이 데이터 파일을 읽어 온다.

 

 


 

 

728x90
반응형
LIST