Redis

Redis의 AOF 백업 전략

김 정출 2024. 10. 12. 14:23

Redis의 AOF 백업 전략

  • Redis에서 파일로 데이터를 백업하는 방법 중 하나인 AOF(Append Only File) 방식은, 서버에 저장된 데이터를 영구적으로 보존하기 위한 파일 기반의 백업 방식입니다.
  • AOF 방식은 모든 쓰기(write) 명령을 기록하여, 데이터의 변동 사항을 저장하고 복구할 수 있게 합니다.

AOF 방식의 동작 원리:

  1. 명령 기록: Redis는 클라이언트로부터 수신한 모든 쓰기 연산(예: SET, INCR, LPUSH 등)을 AOF 파일에 차례로 기록합니다. 이러한 방식으로 Redis 서버가 재시작되었을 때, 해당 파일을 재실행하여 데이터를 복원할 수 있습니다.
  2. Append-Only: AOF는 기존 데이터를 덮어쓰는 것이 아니라 새로운 명령을 추가로 기록합니다. 이로 인해, 데이터 유실 가능성이 매우 낮고, 안정성이 높습니다.
  3. fsync 설정: AOF 방식에서는 디스크에 데이터를 저장할 때 얼마나 자주 동기화(fsync)할지를 설정할 수 있습니다. Redis는 성능과 안전성을 고려하여 여러 가지 동기화 정책을 지원합니다.
    • fsync=always: 모든 쓰기 연산 후에 디스크에 바로 기록합니다. 매우 안전하지만 성능이 떨어집니다.
    • fsync=everysec: 1초에 한 번씩 기록하는 방식입니다. 성능과 안정성의 균형을 맞춘 방식입니다.
    • fsync=no: 동기화를 직접 요청하지 않고, 운영체제가 관리하게 합니다. 성능은 좋지만 데이터 손실 가능성이 있습니다.
  4. 파일 크기 관리(Rewrite): AOF 파일은 모든 명령어를 추가로 기록하기 때문에 시간이 지남에 따라 파일 크기가 커질 수 있습니다. 이를 해결하기 위해 Redis는 주기적으로 AOF 파일을 압축하는 "Rewrite" 과정을 수행합니다. 이 과정에서는 동일한 결과를 만들 수 있는 더 간결한 명령 집합으로 AOF 파일을 대체하여 크기를 줄입니다.

AOF 설정

  • Redis에서 AOF(Append Only File) 방식을 설정하고 관리하려면 redis.conf 파일을 통해 관련 설정을 구성할 수 있습니다. 이 파일에서 AOF 모드를 활성화하고, AOF 파일 동기화 및 관리 방법을 정의할 수 있습니다.
  • 아래는 AOF 관련 주요 설정 옵션과 각 설정의 역할에 대한 설명입니다.

AOF 설정을 위한 redis.conf 주요 항목은 다음과 같습니다.

1. AOF 활성화

AOF 모드를 활성화하려면 다음 설정을 사용합니다. 기본적으로 Redis는 AOF가 비활성화되어 있으므로 이를 yes로 설정해야 합니다.

appendonly yes

2. AOF 파일 경로

AOF 파일이 저장될 파일명을 지정할 수 있습니다. 기본 파일명은 appendonly.aof입니다.

appendfilename "appendonly.aof"

3. AOF 동기화 정책 (fsync)

AOF 방식에서는 얼마나 자주 디스크에 데이터를 기록할지를 결정해야 합니다. fsync 설정을 통해 성능과 데이터 안전성 간의 균형을 조정할 수 있습니다. 다음 세 가지 옵션 중 하나를 선택할 수 있습니다:

  • fsync always: 모든 쓰기 명령마다 디스크에 기록을 동기화합니다. 데이터 손실 가능성이 거의 없지만 성능은 가장 느립니다.
appendfsync always
  • fsync everysec: 매 1초마다 디스크에 동기화를 시도합니다. 성능과 안정성의 균형을 맞추는 설정으로, 일반적으로 많이 사용됩니다.
appendfsync everysec
  • fsync no: Redis는 디스크 동기화를 직접적으로 관리하지 않고, 운영체제에 맡깁니다. 성능이 가장 좋지만, 장애가 발생하면 데이터를 잃을 수 있습니다.
appendfsync no

4. AOF Rewrite (압축) 설정

AOF 파일은 시간이 지남에 따라 커질 수 있기 때문에, Redis는 주기적으로 AOF 파일을 압축(Rewrite)하여 크기를 줄입니다. 이를 위한 관련 설정 옵션입니다.

자동 Rewrite 조건:

  • auto-aof-rewrite-percentage: 현재 AOF 파일 크기가 마지막 Rewrite 시점 대비 몇 % 이상 커지면 Rewrite 작업을 수행할지를 결정합니다. 예를 들어, 100%로 설정하면 AOF 파일이 두 배로 커질 때 Rewrite가 발생합니다.
auto-aof-rewrite-percentage 100
  • auto-aof-rewrite-min-size: 자동 Rewrite가 트리거되기 위한 최소 AOF 파일 크기입니다. 이 값보다 작으면 Rewrite가 실행되지 않습니다. 기본적으로 64MB로 설정됩니다.
auto-aof-rewrite-min-size 64mb

5. AOF 파일 복구 시 유효성 검사

Redis는 AOF 파일을 읽고 복구할 때 파일의 무결성을 확인합니다. 이를 설정하는 옵션입니다.

  • aof-load-truncated: AOF 파일이 손상되었을 때, 파일의 일부분만 복구할 수 있도록 허용할지를 결정합니다. 기본값은 yes로, AOF 파일이 손상된 경우에도 가능한 범위 내에서 데이터를 복구합니다.
aof-load-truncated yes

6. AOF 동기화 속도 제한

AOF rewrite 시점에서 I/O 병목을 방지하기 위해 속도를 제한할 수 있습니다. 이를 통해 Redis가 너무 많은 자원을 사용하지 않게 조정합니다.

  • aof-rewrite-incremental-fsync: Rewrite 중에 fsync 작업을 점진적으로 수행하여, 한 번에 많은 I/O 작업이 발생하지 않도록 설정할 수 있습니다. 기본적으로 yes로 설정되어 있으며, 권장됩니다.
aof-rewrite-incremental-fsync yes

7. AOF Override 설정 (새로운 Redis 버전)

Redis 7.0 이후에는 AOF 파일을 압축할 때 기존 AOF를 덮어쓰지 않고 새로운 AOF 파일로 교체하는 방법이 기본 설정입니다. 이를 통해 AOF 파일이 손상될 가능성을 줄일 수 있습니다.

AOF 설정 예시

# AOF 사용 여부 설정 (활성화)
appendonly yes

# AOF 파일 이름 설정
appendfilename "appendonly.aof"

# AOF fsync 동기화 정책: 1초마다 디스크 동기화
appendfsync everysec

# AOF가 비정상적으로 종료된 경우, 복구 가능한 데이터를 읽어 들이는 설정
aof-load-truncated yes

# AOF 파일이 마지막 rewrite 이후 두 배로 커지면 압축 실행
auto-aof-rewrite-percentage 100

# AOF 파일이 최소 64MB 이상일 때만 rewrite 실행
auto-aof-rewrite-min-size 64mb

# AOF Rewrite 중 점진적 fsync 사용 (I/O 성능 최적화)
aof-rewrite-incremental-fsync yes

AOF 관련 명령어

AOF 설정은 redis.conf에서 관리할 수 있지만, Redis CLI 명령어를 사용하여 수동으로 제어할 수도 있습니다:

  • AOF 백그라운드 저장: Redis는 백그라운드에서 AOF 파일을 rewrite할 수 있습니다.
BGREWRITEAOF
  • AOF 수동 동기화: 동기화가 필요한 경우, 수동으로 FSYNC 명령을 실행할 수 있습니다.
FSYNC

이렇게 redis.conf 파일에서 AOF 설정을 관리하면, 데이터 영속성을 유지하면서도 성능과 데이터 안전성을 적절히 조정할 수 있습니다. Redis 운영 환경에 맞게 AOF 설정을 최적화하는 것이 중요합니다.


AOF의 장점:

  • 안정성: 모든 쓰기 명령을 기록하기 때문에, 데이터 손실 가능성이 적습니다.
  • 복구 가능성: Redis가 비정상 종료되더라도, AOF 파일을 통해 데이터 복구가 가능합니다.
  • 세밀한 복원: 데이터를 실시간에 가깝게 복원할 수 있으며, 복구 시 특정 시점까지 복원할 수 있습니다.

AOF의 단점:

  • 성능 저하: 쓰기 명령을 모두 기록해야 하므로 RDB 스냅샷 방식보다 성능이 떨어질 수 있습니다.
  • 파일 크기: 시간이 지나면서 파일 크기가 커질 수 있으며, 이를 줄이기 위한 Rewrite 과정이 필요합니다.

AOF는 고가용성 환경에서 Redis의 데이터를 안전하게 보호할 수 있는 좋은 방법이며, 설정에 따라 성능과 안정성 간의 적절한 균형을 맞출 수 있습니다.


AOF 복구 시간에 영향을 미치는 요소:

  1. 파일 크기:
    • AOF 파일이 커질수록 Redis가 파일을 읽고 재실행하는 데 더 많은 시간이 필요합니다. 모든 명령을 순차적으로 실행해야 하기 때문에, 파일 크기가 크면 클수록 복구 시간이 증가합니다.
  2. 명령의 종류:
    • AOF에 기록된 명령의 종류에 따라 복구 시간이 달라질 수 있습니다. 복잡한 명령이나 데이터 구조(예: 대규모 해시, 리스트 등)는 단순한 키-값 쌍보다 복구하는 데 더 많은 시간이 소요됩니다.
  3. 디스크 성능:
    • AOF 복구는 디스크 I/O 성능에 의존하므로, 사용 중인 디스크의 속도(예: SSD vs. HDD)에 따라 복구 속도가 달라집니다. SSD가 HDD보다 훨씬 빠르게 데이터를 읽을 수 있습니다.
  4. 메모리 사용량:
    • Redis는 메모리 내에서 명령을 실행하므로, 복구 과정에서 메모리가 부족할 경우 성능이 저하될 수 있습니다. 데이터가 매우 크면 시스템의 메모리 제약으로 인해 복구가 더 느려질 수 있습니다.

복구 시간을 단축하는 방법:

  1. AOF 파일 압축:
    • AOF 파일을 정기적으로 rewrite하여 파일 크기를 줄이면 복구 시간을 단축할 수 있습니다. AOF rewrite는 Redis가 현재 데이터의 상태를 반영한 새로운 AOF 파일을 생성합니다.
  2. fsync 정책 조정:
    • AOF의 fsync 설정을 조정하여 성능과 안정성 간의 균형을 맞출 수 있습니다. 예를 들어, fsync=everysec 설정은 성능을 유지하면서도 일정 수준의 데이터 손실 위험을 감수하는 방식입니다.
  3. Redis 클러스터 사용:
    • 복구 시간이 너무 오래 걸리는 경우 Redis 클러스터를 사용하면 읽기 작업을 분산시킬 수 있습니다. 클러스터를 사용하면 데이터를 여러 노드에 분산 저장하여 복구 속도를 개선할 수 있습니다.
  4. 병렬 복구:
    • Redis의 최신 버전에서는 AOF 복구 시 병렬 처리 기능이 개선되어, 여러 명령을 동시에 실행할 수 있어 복구 시간을 단축하는 데 도움이 됩니다.