본문 바로가기

시스템/REDIS

[REDIS] AOF & RDB

반응형

결론


AOF(Append Only File) 와 RDB(Snapshot) 를 어떤 식으로 운영 해야 할까?

 - 데이터가 좀더 중요한 환경이라면 AOF와 RDB를 동시에 운영하고  AOF를 기본으로 RDB를 서브로 운영한다.

 - AOF의 appendfsync 를 everysec으로 하고 rewrite 기능을 사용하여 데이터 유실을 최소화 하고 RDB를 옵션으로 운영하여 복구 시간에 이점을 가져간다.

 

 

AOF(Append Only File)


  • AOF는 명령이 실행 될때 마다 기록.
  • save 옵션에 따라 운영되는 RDB에 비해 데이터 손실이 거의 없음.
  • 입력/수정/삭제 명령이 실행될때 마다 기록되며 조회 명령은 기록되지 않음.
  • AOF 파일이 무한히 커지는 것을 방지 하고자 rewrite을 사용함.
  • rewrite는 예를 들어 같은 key로 set 명령이 여러번 발생 했다면 rewrite 할 경우 최종 명령의 데이터만 기록되는 식으로 운영 되어 파일 사이즈가 작아 질 수 있음.
  • AOF 파일은 text파일 이므로 수정이 가능
  • flushall 명령으로 메모리에 있는 데이터 전체를 날렸을 경우 AOF 파일에서 제일 마지막 flushall 명령을 제거 후 redis를 재기동하면 복구 가능.
  • 아래 3줄 삭제
> cat aof.aof
...
*1
$8
flushall
  • info persistence 정보
127.0.0.1:8300> info persistence
...
# aof 활성화 여부
aof_enabled:1
# rewrite가 진행중인지 여부
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
# 마지막 rewrite 하는데 걸린 시간
aof_last_rewrite_time_sec:-1
# 최근 rewrite 시작하여 현재까지 걸린 시간
aof_current_rewrite_time_sec:-1
# 마지막 rewrite 때 성공 여부
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0
# 현재 aof 파일 사이즈
aof_current_size:221
# 베이스 AOF 파일 사이즈, base size와 current size를 비교해서 rewrite-percentage 값 이상이되면 자동으로 rewrite 한다.  
aof_base_size:221
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0

 

 

RDB(Snapshot)


  • RDB는 save 옵션에 따라 메모리에 있는 데이터 전체는 파일로 저장
  • AOF 보다 파일 사이즈가 작으며 redis 기동시 AOF 보다 RDB가 로딩하는 속도가 더 빠름.
  • save 설정에 따라 설정값을 만족하면 데이터 저장이 일어나며 save 설정은 여러 조건으로 중복하여 설정이 가능함.(or 조건)
  • save 설정을 주석 처리할 경우 데이터는 저장 되지 않음.
  • 데이터를 저장하는 방법은 save와 bgsave가 있으며 config에서의 save 설정은 bgsave로 동작함.

save 방식

  • redis의 main process가 직접 데이터를 저장하므로 저장하는 동안 클라이언트의 요청을 받을 수 없음.
  • 운영중인 경우 저장하려는 파일 사이즈나 리소스 퍼포먼스에 따라 장애시간이 증가 할 수 있음.
  • redis-cli에서 수행 할 수 있음.
127.0.0.1:6379> SAVE
OK

# LOG
DB saved on disk
  • save 조건 설정 : OR 조건으로 어느것 하나라도 만족하면 수행
save 900 1   # 900초(15분) 동안 1번 이상 key 변경이 발생하면 저장 
save 300 10   # 300초(5분) 동안 10번 이상 key 변경이 발생하면 저장 
save 60 10000   # 60초(1분) 동안 10000번 이상 key 변경이 발생하면 저장

 

bgsave 방식

  • redis의 child process를 fork하여 작업을 처리하므로 background로 동작하며 작업 중에도 클라이언트의 요청을 처리할 수 있음.
  • redis-cli 에서 수행 할 수 있음.
127.0.0.1:6379> BGSAVE
Background saving started
  • info persistence 정보
127.0.0.1:8300> info persistence
# Persistence
loading:0
rdb_changes_since_last_save:0
# 현재 bgsave가 진행중이지 않음(0).
rdb_bgsave_in_progress:0
# rdb 마지막 저장 시간(unixtime)
rdb_last_save_time:1642579386
# rdb 마지막 저장 성공 여부
rdb_last_bgsave_status:ok
# rdb 마지막 저장에 걸린 시간
rdb_last_bgsave_time_sec:0
# 최근 rdb 저장을 시작하고 현재 까지 경과 시간
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:229376

 

 

Redis 기동 시 DB 파일 로드


  • AOF와 RDB 파일이 모두 존재 할 경우 RDB보다 AOF가 우선순위를 가져감

    - redis.conf에 appendonly 값이 yes 이고 AOF 파일이 존재 할 경우 : AOF 로드

    - redis.conf에 appendonly 값이 yes 이고 AOF 파일이 존재 하지 않을 경우 : 로드 하지 않음

    - redis.conf에 appendonly 값이 no 이고 RDB 파일이 존재 할 경우 : RDB 로드

    - redis.conf에 appendonly 값이 no 이고 RDB 파일이 존재 하지 않을 경우 : 로드하지 않음.

  • Redis 운영 도중에 AOF, RDB 파일을 로드 할 수 없으며 redis 시작 시 만 로드가능.
반응형