Redis는 메모리 기반 데이터 저장소이므로 기본적으로 휘발성이다. Redis 서버가 재시작되면 모든 데이터가 사라질 수 있으며, 이를 보완하기 위해 Redis는 두 가지 데이터 보존 방식을 제공한다: RDB (Redis Database Snapshot)AOF (Append-Only File). 이번 포스트에서는 두 방식의 특징과 차이점을 살펴보고, 각각의 설정 방법과 장단점을 정리한다.

1. RDB (Redis Database Snapshot)

RDB 방식은 Redis가 메모리에 저장된 데이터를 주기적으로 스냅샷(Snapshot) 형태로 디스크에 저장하는 방식이다. Redis는 설정된 주기에 따라 RDB 파일을 생성하며, 이 파일을 통해 서버 재시작 시 데이터를 복구할 수 있다.

RDB의 주요 특징

  • 저장 주기: redis.conf 파일에서 save 옵션을 통해 데이터를 디스크에 저장할 주기를 설정할 수 있다. 예를 들어 save 60 100060초마다 1000개 이상의 키가 변경된 경우 스냅샷을 생성한다.
save 60 1000
  • 파일 위치: RDB 파일은 기본적으로 dir에서 지정한 디렉토리에 저장되며, 기본 경로는 /var/lib/redis이고 파일명은 dump.rdb이다.
dir /var/lib/redis/
dbfilename dump.rdb

RDB의 장점

  • 고성능: RDB 방식은 Redis의 성능에 큰 영향을 미치지 않으며, 스냅샷 생성 주기가 길다면 CPU 자원도 크게 소모하지 않는다.
  • 작은 파일 크기: 주기적으로 전체 데이터를 스냅샷으로 기록하기 때문에 파일 크기가 비교적 작고 백업 관리가 용이하다.

RDB의 단점

  • 데이터 유실 가능성: RDB 방식은 주기적으로 저장하기 때문에, Redis가 갑자기 중단되면 마지막 스냅샷 이후의 데이터는 유실될 수 있다.
  • 복구 속도: RDB는 모든 데이터를 한 번에 스냅샷하여 저장하므로, 대량의 데이터를 복구할 때 시간이 더 걸릴 수 있다.

RDB의 적합한 사용 사례

RDB는 주로 캐시 데이터처럼 일정 주기마다 백업해도 무방한 경우에 적합하다. 실시간 작업 큐보다는 주기적인 데이터 백업이 필요한 경우 유리하며, Redis 서버의 성능을 유지하면서 간단하게 데이터 보존성을 확보할 수 있다.

2. AOF (Append-Only File)

AOF는 Redis의 모든 쓰기 작업을 디스크에 순차적으로 기록하여 지속적인 데이터 보존을 제공한다. AOF 파일은 모든 데이터 변경 사항을 빠짐없이 기록하므로, Redis 서버가 재시작되더라도 AOF 파일을 통해 완벽하게 복구할 수 있다.

AOF의 주요 특징

  • 명령 기록 방식: AOF 파일은 모든 데이터 변경 명령을 기록한다. 쓰기 명령어가 발생할 때마다 디스크에 저장하기 때문에 모든 데이터 변경 내역이 저장된다.
  • 파일 위치와 이름: AOF 파일은 기본적으로 appendfilename 옵션에서 지정한 이름으로 저장된다. 기본값은 appendonly.aof이며, dir 설정으로 지정된 디렉토리에 저장된다.
dir /var/lib/redis/
appendonly yes
appendfilename appendonly.aof
  • 동기화 주기: appendfsync 옵션으로 디스크에 데이터를 기록하는 주기를 설정할 수 있다.
appendfsync everysec  # 매 초마다 동기화

AOF의 장점

  • 데이터 보존성: 모든 쓰기 작업을 디스크에 기록하므로, 서버가 갑자기 중단되어도 마지막 기록 상태까지 데이터를 복구할 수 있다.
  • 읽기 명령어는 기록하지 않음: AOF는 모든 데이터 변경 명령만 기록하므로, 불필요한 읽기 명령어는 파일에 포함되지 않아 저장 공간을 절약한다.
Redis data persistence options infographic

AOF의 단점

  • 성능 저하 가능성: 모든 쓰기 작업을 디스크에 기록하므로, 특히 appendfsyncalways로 설정한 경우 성능이 저하될 수 있다.
  • 파일 크기 증가: 데이터 변경이 빈번한 경우 AOF 파일 크기가 매우 커질 수 있다. 이를 해결하기 위해 Redis는 BGREWRITEAOF 명령을 통해 AOF 파일을 압축할 수 있다.

AOF의 적합한 사용 사례

AOF는 작업 큐데이터 보존이 중요한 애플리케이션에서 유용하다. 데이터 보존성이 중요한 경우 주기적인 동기화(everysec) 설정과 함께 사용하여 성능과 데이터 보존성을 균형 있게 맞출 수 있다.

3. RDB와 AOF의 동시 사용

Redis에서는 RDB와 AOF 방식을 동시에 사용하여 데이터 보존성과 성능을 균형 있게 유지할 수 있다. 두 방식이 모두 활성화된 경우 Redis는 AOF 파일을 우선하여 복구한다.

  • RDB: 빠르고 간편하게 데이터를 저장하며, 스냅샷 방식으로 기본적인 백업을 제공한다.
  • AOF: 모든 쓰기 작업을 기록하여 데이터 보존성을 높이기 때문에 데이터 유실 가능성을 최소화할 수 있다.

4. Redis 설정 예시

다음은 RDB와 AOF를 동시에 사용하며, 적절한 성능과 데이터 보존성을 유지하는 설정 예시다.

# Redis 기본 디렉토리 및 파일 설정
dir /var/lib/redis/
dbfilename dump.rdb
appendfilename appendonly.aof

# RDB 스냅샷 설정 (매 60초마다 1000개 이상의 키가 변경되면 스냅샷 저장)
save 60 1000

# AOF 설정
appendonly yes
appendfsync everysec  # 매 초마다 디스크 동기화

# AOF 파일 리라이트 설정 (파일 크기가 64MB 이상일 때 100% 증가 시 자동 리라이트)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

마치며

이번 포스트에서는 Redis의 두 가지 데이터 보존 방식인 RDB와 AOF에 대해 알아보았다. 각 방식은 보존성과 성능에 차이가 있으므로, 애플리케이션의 특성에 따라 적절한 방식을 선택하는 것이 중요하다. 다음 편에서는 Redis 메모리 관리와 성능 최적화에 대해 다루며 Redis의 메모리를 효율적으로 활용할 수 있는 방법을 소개할 예정이다.