Redis는 강력한 인메모리(In-Memory) 데이터 저장소입니다. 빠른 속도가 생명이지만, "인메모리"라는 특성상 서버가 재시작되면 모든 데이터가 사라질 위험이 있죠. 이를 방지하기 위해 Redis는 두 가지 영속성(Persistence) 옵션을 제공합니다.

  1. RDB (Snapshotting): 특정 시점의 데이터 전체를 스냅샷으로 찍어 디스크에 저장합니다.

  2. AOF (Append Only File): 모든 쓰기(Write) 명령어를 로그 파일에 순차적으로 기록합니다.

AOF는 RDB에 비해 데이터 유실 위험이 거의 없는 (보통 1초 이내) 강력한 내구성을 보장합니다. 하지만 모든 쓰기 작업을 파일에 기록하는 것은 명백한 성능 비용을 초래합니다.

"과연 모든 Redis 사용 사례에 AOF가 필요할까?"

결론부터 말하면, "아니요, 전혀 그렇지 않습니다."

오늘은 AOF 설정을 굳이 사용하지 않아도 되는 경우와, 반대로 AOF가 필수적인 경우를 명확히 구분해 보겠습니다.


AOF를 굳이 사용하지 않아도 되는 경우



AOF의 핵심 가치는 데이터의 내구성(Durability) 에 있습니다. 만약 이 내구성이 중요하지 않은 데이터라면, AOF는 불필요한 성능 저하만 일으키는 '족쇄'가 될 수 있습니다.

1. 캐시 (Cache)로만 사용할 때

가장 대표적인 사례입니다.

  • 이유: 캐시의 데이터는 '원본'이 아닙니다. 데이터베이스(DB)나 다른 API 같은 '진실의 원천(Source of Truth)'이 따로 존재합니다.

  • 데이터 유실 시: Redis가 재시작되어 캐시가 모두 비워져도, 애플리케이션은 잠시 느려질 뿐(Cache Miss), 원본 데이터를 다시 읽어와 캐시를 채우면(Cache-Warm up) 됩니다. 데이터가 영구적으로 손실되는 것이 아닙니다.

  • 결론: 캐시 용도라면 AOF는 물론 RDB조차도 끄는 경우가 많습니다. 디스크 I/O를 완전히 제거하여 Redis의 순수한 인메모리 속도를 극대화하는 것이 이득입니다.

2. Celery 브로커 / 결과 백엔드 (중요도가 낮은 작업)

Redis는 Celery 와 함께 사용하는 경우가 많습니다. Celery의 브로커와 결과 백엔드로서의 Redis에서 AOF설정에서는 '작업의 중요도' 라는 전제가 붙습니다.

  • 이유: 만약 Celery로 처리하는 작업이 '실패해도 그만'이거나 '쉽게 재시도'할 수 있는 경우라면, AOF는 불필요합니다.

  • 예시:

    • 사용자 로그 분석 (몇 초간의 로그가 유실되어도 큰 문제 없음)

    • 주기적인 데이터 정리 (다음 주기에 다시 실행되면 됨)

    • 썸네일 이미지 생성 (원본 이미지가 있으므로 다시 생성 가능)

  • 결론: 이런 시나리오에서 Redis 서버가 다운되면 큐에 있던 작업이나 결과가 사라질 수 있습니다. 하지만 이 손실을 비즈니스적으로 '감수'할 수 있다면, AOF를 끄고 브로커의 성능을 확보하는 것이 현명한 선택입니다.

3. 단순 통계 및 실시간 데이터 (휘발성)

단기간의 트렌드를 보거나 금방 갱신되는 데이터를 다룰 때입니다.

  • 이유: 데이터가 매우 짧은 주기로 갱신되거나, 특정 시점의 스냅샷이 큰 의미가 없는 경우입니다.

  • 예시:

    • 최근 1분간의 웹사이트 방문자 수

    • 실시간 게임 랭킹 (초 단위로 변동)

    • 임시 세션 데이터 (수 분 내로 만료됨)

  • 결론: 어차피 금방 사라지거나 갱신될 데이터입니다. 몇 초간의 데이터를 잃는 것보다, 수많은 쓰기 요청을 빠르게 처리하는 성능이 훨씬 중요합니다. AOF는 이런 환경에 적합하지 않습니다.


Redis AOF의 성능과 내구성 트레이드오프를 보여주는 저울 다이어그램

AOF 사용을 강력히 권장하는 경우

반대로, Redis의 데이터가 유실되면 심각한 문제가 발생하는 경우, AOF는 선택이 아닌 필수입니다.

1. '신뢰할 수 있는' 메시지 큐 (Critical Celery Jobs)

위 Celery 예시의 정반대입니다.

  • 이유: 작업(Task) 자체가 돈이나 핵심 비즈니스 로직과 연결된 경우입니다.

  • 예시:

    • 결제 처리 요청

    • 회원가입 완료 및 인증 메일 발송

    • 주문 처리

  • 결론: 사용자가 '결제' 버튼을 눌렀는데, Redis가 재시작되어 해당 작업 요청이 사라진다면 심각한 장애입니다. 이런 시나리오에서는 fsync everysec (기본값) 옵션으로 AOF를 활성화하여, 작업이 큐에 들어오는 즉시 디스크에 기록되도록 보장해야 합니다.

2. Redis를 기본 데이터베이스로 사용할 때

Redis를 단순 캐시가 아닌, 데이터의 원본(Source of Truth) 으로 사용할 때입니다.

  • 이유: 데이터베이스가 따로 없고 Redis 자체가 원본 데이터를 저장하고 있기 때문에, 데이터 유실은 곧 영구적인 손실을 의미합니다.

  • 예시:

    • 사용자 프로필 정보

    • 영구적으로 보관해야 하는 사용자 세션

    • 게임의 재화(골드, 아이템) 정보

  • 결론: 이 경우 AOF는 필수이며, RDB 스냅샷과 함께 사용하여 백업 및 복구 전략을 수립해야 합니다.

3. 트랜잭션 및 집계 데이터

데이터의 일관성과 정확성이 매우 중요한 경우입니다.

  • 이유: RDB는 '특정 시점'을 저장하므로, 마지막 스냅샷 이후의 데이터는 모두 유실됩니다. AOF는 '모든 변경 이력'을 저장하므로 데이터 유실을 최소화(최대 1초)할 수 있습니다.

  • 예시:

    • 팔로우/언팔로우 관계

    • 정확한 투표 수 집계

    • 금융 관련 데이터(간단한 입출금 내역)

  • 결론: 데이터의 최종 일관성이 중요한 경우, AOF의 'Append-Only' 특성이 RDB보다 훨씬 적합합니다.


결론: 내구성과 성능의 트레이드오프



AOF는 Redis에 내구성(Durability) 을 부여하는 강력한 기능입니다. 하지만 이 기능은 성능(Performance) 을 대가로 합니다.

AOF를 켤지 말지 고민된다면, 개발자는 아래의 질문에 답해보시기 바랍니다.

"만약 지금 Redis 서버가 예고 없이 다운된다면, 최근 몇 분(RDB) 또는 1초(AOF)간의 데이터가 사라졌을 때 우리 서비스에 심각한 문제가 발생하는가?"

  • "아니요, 다시 계산(캐시)하면 됩니다." -> AOF를 끄십시오.

  • "예, 결제 내역이 사라집니다." -> AOF를 반드시 켜십시오.

모든 기술 결정과 마찬가지로, 정답은 없습니다. 내 서비스의 데이터 특성과 요구사항을 정확히 파악하고 적절한 트레이드오프를 선택하는 것이 중요합니다.