본문 바로가기

독서/개발자를 위한 레디스

[개발자를 위한 레디스] 7장 레디스 데이터 백업 방법

반응형
SMALL

레디스에서 데이터를 영구 저장하기

레디스 인스턴스가 재시작될 경우 메모리에 상주해 있던 레디스의 모든 데이터는 손실될 가능성이 있다.

  • 복제: 가용성을 위한 것
  • 백업: 장애 상황에서 데이터의 복구를 위한 것

 

레디스에서는 RDB와 AOP 두 가지의 백업 방식을 지원한다.

  RDB AOP
개념 일정 시점에 메모리에 저장된 데이터 전체를 저장한다. (snapshot) 레디스 인스턴스가 처리한 모든 쓰기 작업을 차례대로 기록한다.
복원 시에는 파일을 다시 읽어가며 데이터 세트를 재구성한다.
장점 시점 단위로 여러 백업본을 저장할 수 있다.
AOF 파일보다 복원이 빠르다.
원하는 시점으로 복구할 수 있다.
단점 특정 시점으로의 복구는 불가능하다. RDB 파일보다 크기가 크고 주기적으로 압축해 재작성해야 한다.

 

RDB 방식의 데이터 백업

원하는 시점에 메모리 자체를 스냅숏 찍듯 저장할 수 있기 때문에 백업에 적합한 파일 형태로 볼 수 있다. 하지만 저장 시점부터 장애가 발생한 직전까지의 데이터는 손실될 수 있다.

 

특정 조건에 자동으로 RDB 파일 생성

save <기간(초)> <기간 내 변경된 키의 개수> # 일정한 기간동안 변경된 키의 개수가 조건에 맞을 때 자동으로 RDB 파일 저장
dbfilename <RDB 파일 이름> # RDB 파일은 dbfilename 옵션에 지정된 이름으로 생성
dir <RDB 파일이 저장될 경로> # dir에 지정한 경로에 저장

save 옵션을 사용해 원하는 조건에 RDB 파일을 저장하도록 설정할 수 있다.

 

수동으로 RDB 파일 생성

  • SAVE 커맨드
    • 동기 방식으로 파일을 저장한다.
    • 파일 생성이 완료될 때까지 다른 모든 클라이언트의 명령을 차단한다.
  • BGSAVE 커맨드
    • fork를 호출해 자식 프로세스를 생성하며 생성된 자식 프로세스가 백그라운드에서 RDB 파일을 생성한 뒤 종료된다.
    • 백그라운드로 데이터가 저장되고 있을 때 이 커맨드를 수행하며 에러를 반환한다. (SCHEDULE 옵션을 사용하면 기존 백업 완료 후 다시 BGSAVE 수행)

 

복제를 사용할 경우 자동으로 RDB 파일 생성

  • 복제본에서 REPLICAOF 커맨드를 이용해 복제를 요청하면 마스터 노드에서는 RDB 파일을 새로 생성해 복제본에 전달한다.
  • 이미 복제 연결이 돼 있는 상태에서도 상황에 따라 마스터에서는 언제든지 RDB 파일을 재생성할 수 있다.

 

AOF 방식의 데이터 백업

appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"

appendonly 옵션을 yes로 지정하면 AOF 파일에 주기적으로 데이터가 저장된다.

 

AOF 파일을 재구성하는 방법

버전7 이후의 AOF 파일 관리 구조

  • 기본이 되는 바이너리 형태의 RDB 파일, 증가하는 RESP의 텍스트 형태의 AOF 파일로 나눠 데이터를 관리한다.
  • 현재 레디스가 바라보고 있는 파일이 어떤 것인지 나타내는 매니페스트 파일이 추가적으로 도입됐다.
  • 세 파일 모두 설정 파일에 지정한 appenddirname 이름의 폴더 내에 저장된다.

 

버전 7 이후에서 AOF 재구성이 실행되는 과정

  1. 레디스 인스턴스는 fork를 이용해 자식 프로세스를 생성한다. 생성된 자식 프로세스는 레디스 메모리의 데이터를 읽어와 신규로 생성한 임시 파일에 저장한다.
  2. 백그라운드로 (1)의 과정이 진행되는 동안 레디스 메모리의 데이터가 변경된 내역은  신규 AOF 파일에 저장된다.
  3. (1)의 AOF 재구성 과정이 끝나면 임시 매니페스트 파일을 생성한 뒤, 변경된 버전으로 매니페스트 파일 내용을 업데이트한다.
  4. 생성된 임시 매니페스트 파일로 기존 매니페스트 파일을 덮어 씌운 뒤, 이전 버전의 AOF, RDB 파일들을 삭제한다.

 

자동 AOF 재구성

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

AOF 파일을 다시 쓰기 위한 시점을 정하기 위한 옵션이다. 마지막으로 재구성됐던 AOF 파일의 크기와 비교해, 현재의 AOF 파일이 지정된 퍼센트만큼 커졌을 때 재구성을 시도한다.

 

수동 AOF 재구성

BGREWRITEAOF 커맨드를 이용하면 원하는 시점에 직접 AOF 파일을 재구성할 수 있다.

 

AOF 타임스탬프

aof-timestamp-enabled yes

aof-timestamp-enabled 옵션을 활성화시키면 AOF 데이터가 저장될 때 타임스탬프도 함께 저장된다.

 

AOF 파일 복원

  • 시점 복원에서 사용한 redis-check-aof 프로그램은 AOF 파일이 손상됐을 때에도 사용할 수 있다.
  • 레디스가 의도치 않은 장애로 중단됐을 때 redis-check-aof 프로그램을 사용하면 AOF 파일의 상태가 정상적인지 확인할 수 있다.
  • fix 옵션을 사용한 복구 또한 원본 파일을 변경하기 때문에 이전의 데이터를 보호하고 싶은 경우 원본 데이터를 다른 곳에 복사해두는 것이 안전하다.

 

AOF 파일의 안전성

레디스에서 AOF 파일을 저장할 때 APPENDSYNC 옵션을 이용하면 FSYNC 호출을 제어할 수 있으며, 즉 파일 저장의 내구성을 제어할 수 있다.

  • APPENDSYNC no: AOF 데이터를 저장할 때 WRITE 시스템 콜을 호출한다.
  • APPENDSYNC always: AOF 데이터를 저장할 때 항상 WRITE와 FSYNC 시스템 콜을 함께 호출한다.
  • APPENDSYNC everysec: 데이터를 저장할 때 WRITE 시스템 콜을 호출하며, 1초에 한 번씩 FSYNC 시스템 콜을 호출한다.

 

백업을 사용할 때 주의할 점

  • RDB와 AOF 파일을 사용하는 경우 인스턴스의 maxmemory 값은 실제 서버 메모리보다 여유를 갖고 설정하는 것이 좋다.
  • 물리적 메모리에 있는 실제 메모리 페이지가 그대로 복제되기 때문에 최악의 경우 레디스는 기존 메모리 용량의 2배를 사용하게 될 수도 있다.
  • RDB 스냅숏을 저장하는 도중엔 AOF의 재구성 기능을 사용할 수 없고, AOF 재구성이 진행될 때에는 BGSAVE를 실행할 수 없다.
반응형
LIST