[infra] redis 의 durablity

orca·2024년 10월 22일

CS

목록 보기
46/46

Redis

  • 인메모리 DB
  • 레디스 서버에 장애 발생 시 메모리에 있는 데이터 손실 가능성 있음
    ➡️ 레디스를 영구 저장소로 사용한다면 디스크에 데이터를 주기적으로 백업해야 함
  • 두가지 백업 방식
    • AOF : 레디스 인스턴스가 처리한 모든 쓰기 작어을 차례대로 기록함. 복원 시에는 파일을 다시 읽으며 데이터 셋 재구성
    • RDB : 일정 시점에 메모리에 저장된 데이터 전체를 저장함
  • 일반적인 영구 저장소 만큼의 안정성을 원하는 경우 두가지 백업 방식 모두 사용

복구 로직

  1. 레디스 서버는 재시작될 때 AOF 파일이나 RDB 파일이 존재하는지 확인한다.
  2. 파일이 있다면 파일을 로드함
  3. 레디스는 RDB 파일보다 AOF 파일이 더 내구성이 보장된다고 판단하기 때문에 AOF 파일 우선으로 데이터를 로드함

AOF

  • 레디스에서 수행된 모든 쓰기 작업의 로그를 기록함
  • AOF 파일 편집해서 원하는 시점으로 복구 가능함
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"

AOF rewirte

  • 점점 커지는 파일을 주기적으로 압축시키는 과정
  • 특정 조건에 자동으로 재구성 되도록 설정 가능함
  • 과정
    1. 자식 프로세스를 생성해 레디스 메모리를 데이터를 읽어와 신규로 생성한 임시 파일에 저장함
    2. 백그라운드로 (1) 의 과정이 진행되는 동안 레디스 메모리의 데이터가 변경된 내역은 기존의 AOF 파일과 인메모리 버퍼에 동시에 저장됨
    3. AOF 재구성 과정이 끝나면 인메모리 버퍼에 저장된 내용을 임시 파일 마지막에 추가함
    4. 임시 파일로 기존 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

0개의 댓글