Database/Redis

[실전 레디스] 5-1. 레디스 운용 관리: 영속성

noahkim_ 2025. 3. 21. 23:26

하야시 쇼고 님의 "실전 레디스" 책을 정리한 포스팅 입니다.


1. 데이터 영속성

인메모리 데이터베이스

  • 레디스는 기본적으로 인메모리 데이터베이스이므로 서버가 재시작되면 데이터가 유실될 수 있음

 

영속성 지원

  • 레디스를 데이터 저장소처럼 데이터 영속성을 전제로 운영할 수 있음 (옵션 제공)

 

성능 vs 내구성

  • 영속성을 설정하면 성능에 영향을 줄 수 있으므로, 적절한 트레이드 오프를 고려해야 함
  • 성능과 내구성의 타협점을 찾고 설정하는것을 권장함

 

전략 설정 필요

  • 시스템 요구사항에 맞는 영속성 설정을 선택하여 운영해야 함

 

2. 스냅숏

  • 특정 시점의 데이터베이스 내용을 RDB라는 형식의 파일로 저장
  • 파일을 복원하는 형태로 데이터 재사용이 가능함
  • 기본적으로 설정된 영속성 방법

 

저장 방식

방식 실행 방식 특징 동작 방식 권장 여부
SAVE 동기 블로킹 발생 즉시 RDB 파일을 생성하고 저장
❌ (권장되지 않음)
BGSAVE 비동기 성능 우수 자식 프로세스를 포크하여 RDB 파일을 덤프 (Copy On Write 활용) ✅ (권장)
자동 BGSAVE 비동기 설정 기반 일정 시간 내에 변경된 키 개수가 기준을 넘으면 자동 실행 ✅ (권장)

 

예시
SAVE
BGSAVE
save 900 1    # 900초(15분) 동안 1개 이상의 키 변경 시 RDB 저장  
save 300 10   # 300초(5분) 동안 10개 이상의 키 변경 시 RDB 저장  
save 60 10000 # 60초(1분) 동안 10000개 이상의 키 변경 시 RDB 저장

 

복원

  • cron, system.timer 활용하여 자동 복원 가능

 

튜닝

쓰기 작업 수용 여부
  • 저장 중 오류가 발생하면 쓰기 작업 요청을 수락하지 않음
  • 영속성 문제를 관리자에게 알리기 위함

 

압축
  • rdbcompression 지시자를 활용하여 사용 여부 설정

 

데이터 무결성
  • CRC64 체크섬을 추가하여 데이터의 무결성을 체크

 

지시자

지시자 설명 예제 값
dir RDB 파일이 저장될 디렉토리 경로 /var/lib/redis
dbfilename 저장될 RDB 파일의 이름 dump.rdb
rdbcompression RDB 파일 압축 여부 (yes = 압축, no = 압축 안 함) yes / no
stop-writes-on-bgsave-error BGSAVE 중 오류 발생 시 추가적인 쓰기 요청을 수락할지 여부 yes / no

 

 

3. AOF

  • Append-Only File (추가 전용 파일)
  • 모든 쓰기 작업을 로그 형식으로 기록하여 데이터를 복구하는 방식
  • 명령어를 AOF 파일에 추가하고, 재시작 시 AOF 파일을 읽어와 데이터를 복원

 

AOF 버퍼

  • 명령어를 버퍼링하여 저장 후, 일정 주기마다 AOF 파일에 디스크 플러시(저장)

 

AOF 재작성

  • AOF 파일이 커지면 Redis는 자동으로 AOF 파일을 재작성하여 크기를 줄이고 효율성을 높임
  • 부모 프로세스와 자식 프로세스가 협력하여 새로운 AOF 파일을 생성 및 교체함

 

과정
  1. 자식 프로세스 포크
    • 현재 실행중인 프로세스에서 자식 프로세스를 포크함
    • Copy-On-Write 기법을 사용하여 메모리 복사를 최소화함
  2. 자식 프로세스: 새로운 AOF 파일을 생성
    • 자식 프로세스는 기존 AOF 파일을 기반으로 최적화된 새로운 AOF 파일을 생성함
    • 삭제된 키, 중복된 명령어, 불필요한 명령어를 제거하여 AOF 파일 크기를 줄임
  3. 부모 프로세스: AOF 재작성 버퍼에 명령어 저장
    • AOF 재작성 중에도 Redis는 계속해서 클라이언트 요청을 처리해야 함
    • 부모 프로세스는 포크 이후 들어온 새로운 쓰기 작업을 AOF 재작성 버퍼에 저장해 둠
  4. 자식 프로세스: AOF 재작성 완료 후 부모 프로세스에게 신호 전달
    • 부모 프로세스는 AOF 재작성 버퍼의 변경 사항을 자식 프로세스에 전달함
  5. 자식 프로세스: 변경사항 반영 및 저장
    • 자식 프로세스는 전달 받은 AOF 재작성 버퍼의 내요을 새로운 AOF 파일에 추가하여 최신 상태로 만듬
  6. 새 AOF 파일을 기존 파일과 교체

 

멀티파트 AOF

스냅숏(RDB)과 다른 디렉터리에 저장
기본 AOF 파일과 추가 AOF 파일
  • AOF 파일은 기본 파일과 추가 파일로 분할됨
  • 기본 AOF 파일은 Redis 서버가 시작될 떄 전체 데이터 세트를 보유하는 파일로 사용됨
  • 추가 AOF 파일은 새로운 명령어들이 추가될 때마다 생성됨 (여러개가 될 수 있음)
  • 분리로 인해 부모 프로세스가 자식 프로세스로 추가 데이터를 전송하는 과정이 불필요해져 CPU 처리 시간이 줄음

 

단점

  • AOF 파일이 커질수록 재시작 시간이 길어짐

 

지시자

지시자 설명
appendonly
AOF 활성화 (yes로 설정 시 동작)
appenddirname
AOF 파일이 저장될 디렉터리 지정
appendfilename
AOF 파일 이름 지정
appendfsync
AOF 데이터 디스크 반영 주기 (always, everysec, no 선택)
auto-aof-rewrite-percentage
기존 AOF 크기 대비 몇 % 커지면 AOF 재작성 실행할지 설정
auto-aof-rewrite-min-size
AOF 재작성이 실행될 최소 크기 지정

 

예제

활성화
appendonly yes
appenddirname /var/lib/redis/aof
appendfilename "appendonly.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

 

AOF 재작성 수동 실행
BGREWRITEAOF