[redis] data persistence - rdb

cochocho·2026년 4월 27일

redis 의 휘발성

메모리에서 데이터를 관리하기 때문에 기본적으로 전원이 꺼지면 데이터가 삭제되는 휘발성의 특성을 가진다

따라서 내용을 보관하기 위해서는 디스크에 데이터를 저장하는 작업이 따로 필요하다

레디스로 저장되기 적합한 데이터

빈번하게 확인되고 수정되는 데이터지만 rdb를 들르기에는 병목이 가능할 때
레디스를 활용해서 더 빠르게 응답을 제공할 수 있다

  • 섹션 데이터
  • 사용자 로그인 정보
  • 장바구니 내용
  • 진행중인 상태 (ex) 결제 진행 중)

이중 비즈니스에 중요한 데이터들은 영속성 설정이 필요하다
이는 레디스의 영속성을 활용해 실제로 데이터를 저장하고 조회하는 형태이다

  • 실시간 순위표
  • 최근 대화 목록(채팅에서)

*단순 캐시의 경우는 필요 없다(원본 데이터베이스를 애초에 따로 두는 경우이므로)

redis의 영속성 제공

redis에서 제공하는 영속의 방식은

  • rdb snapshot
  • aof (append on file)
  • hybrid (rdb + aof 의 혼합)
    이다

rdb snapshot

rdb 는 redis db를 의미한다
특정 시점에 데이터들을 하나의 파일로 저장한다
이는 dump.rdb로 압축된 바이너리 형식이다
따라서 사람이 읽을 수 없는 이진 데이터로 속도가 빠르다는 장점이 있다

background에서 실행한다는 점에서 snapshot을 만드는 동안 redis가 다른 명령을 처리할 수 있다

이가 가능한 이유는 부모 프로세스가 포크를 활용해 자식 프로세스를 만들고,
이 자식 프로세스가 rdb snapshot 생성을 맡아 부모가 클라이언트의 요청을 처리할 수 있기 때문이다

이는 copy on write 기반으로 동작한다
따라서 쓰기가 발생 시 부모는 쓰기 동작을 할 페이지를 복사해 할당받는다
자식이 읽어 rdb snapshot을 생성하고 있을 때, 해당 데이터와 공유되면 안되기 때문이다

따라서 전체 과정은 이와 같다

  • 포크가 일어난 후 부모와 자식이 같은 메모리 페이지를 공유함
  • 자식 프로세스는 이 메모리를 읽어 디스크에 씀
  • 부모 프로세스가데이터를 추가로 변경 시 os가 해당 페이지만 복사해줌
  • 이후 다시 주기가 되어 snapshot 생성 시점이 되면 fork로 자식을 새로 생성함

이를 통해 알 수 있듯,
rdb snapshot을 활용할 때는 주기적으로 데이터 파일을 만들어주게 된다
이에 따라 다음 스냅샷을 생성하기 전까지 데이터에 변경이 있을 때,
해당 데이터는 따로 저장되어있지는 않다

그렇기 때문에 서버가 다운되는 것과 같은 문제가 발생했을 때
스냅샷에 저장되지 않은 변경 데이터는 유실될 수 있다는 단점이 있다

rdb 의 장점

  • 단일 파일로 관리하기 쉬움
  • 성능 영향 적음 : 이진파일로 컴퓨터가 빠르게 처리 가능
  • 백그라운드 실행

rdb의 한계

  • 포크 시 메모리 여유 공간 필요
    cow를 활용하기 때문
    최악의 경우 스냅샷 생성하는 중에 모든 데이터의 변경 발생 가능한데
    그렇게 되면 모든 데이터 크기만큼의 공간을 따로 할당해줘야함

  • 대용량의 경우 어쩔 수 없이 느림(io에 대한 비용 발생)

0개의 댓글