[ Programing ]/Redis

Redis 데이터 영구 저장과 동기화 RDB, AOF

Mister_Q 2025. 2. 20. 10:28

메모리에만 저장되어 있던 캐시 장애가 발생했을 경우, 
유실을 방지하고자 디스크에 저장하는 기능도 제공하고 있습니다. 

스냅샷을 저장하는 방식인 `RDB`, 
명령어 단위를 저장하는 `AOF` 
방식을 통해 영속성을 유지할 수 있습니다. 



# RDB
RDB란, `Redis Database`라는 뜻으로 특정 시점마다 데이터를 `snapshot`형태로 디스크 저장합니다.
저장은 `바이너리 형식`으로 저장이 됩니다. 

다양한 Collection을 binary 형식으로 직렬화하여 `.rdb`파일에 저장하며, 사람이 직접 읽기는 불가능합니다. 
바이너리 형식이기 때문에, 
파일 크키에 대해 부담도 적으며 빠르게 읽을 수 있습니다. 
그렇기에 장애가 발생했을 경우, 빠른 복원도 가능해집니다.

snapshot을 저장하고, 
다음 snapshot 저장되기 전에, 오류가 발생했을 경우 그 사이 데이터는 유실 가능성이 큽니다.
이러한 상황을 최대한 방지하기 위해 `redis.conf`에서 스냅샷 조건을 설정할 수 있게 됩니다.

너무 짧을 경우 매번 snapshot 형태로 저장하기 위해 CPU와 메모리를 많이 사용될 수 있습니다. 
그렇다고 너무 길게 설정하게 되면, 데이터의 유실 범위가 커지게 됩니다.




# AOF
메모리에서 작동했던 모든 쓰기 연산의 명령어 (SET, HSET, LPUSH 등)를 디스크에 `순서대로` 저장합니다. 

명령을 입력하면, 파일 맨 끝에 명령어를 append하여 저장하게 됩니다. 
그리하여 AOF, `Append Only File`이라고 합니다. 
서버 재시작 시에 AOF 파일을 처음부터 재실행하며 데이터 상태를 가장 최신으로 유지할 수 있게 됩니다.

명령어 입력때 마다 저장을 하기 때문에, 
RDB 같이 데이터가 유실될 가능성이 거의 없습니다.


별도의 동기 시점을 `appendfsync`을 통해 설정할 수 있습니다. 
appendfsync는 얼마나 자주 동기화할지 정하는 방식으로, 아래와 같습니다.
- always 
: 명령어 실행 때마다 `fsync()`를 호출하여 저장하게 됩니다. 
  장애 발생 시 완전한 일관성 보장을 할 수 있지만, 매번 I/O 발생하여 성능 부하 가능성이 커집니다.

- everysec (default) 
매 초마다 처리를 합니다. 
  즉시 작성은 아니지만, 어느 정도의 성능 저하를 최소화할 수 있습니다.

- no 
: Redis가 `fsync()`호출하여 저장하는 방식이 아닌, OS 내에서 저장하는 방식입니다. 
  성능 면에서는 제일 빠를 수는 있지만, 장애 발생하면 위 옵션들보다 데이터 유실량이 클 가능성이 있습니다.


appendonly (yes / no)
: aof 파일 데이터 저장 유무 설정.
   RDB는 off에 Cluster 환경에서 Master는 yes, Slave에 no로 설정 시 롤 체인지 되면 데이터 유실 가능성 있음.




추가로 시간이 지날수록 파일의 크기가 커진다는 문제가 있으며 
처음부터 명령어를 실행하는 과정에서 데이터의 양이 많아지게 되면, 실행 시간이 늘어날 수 있습니다.
RDB와 AOF 두 가지 모두 적절히 사용하게 되면, 데이터의 유실을 최소화할 수 있습니다. 




 

출처 : 124 [레디스] Redis의 데이터 영구 저.. : 네이버블로그

 

124 [레디스] Redis의 데이터 영구 저장 개념 RDB, AOF에 대해서

관련글 🔗 117 [레디스] Redis 정의 및, Collection 정리 🔗 118 [레디스] Redis와 Memcached 차이...

blog.naver.com