Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Kuma's Curious Paradise

[이룸] Redis 영속성 설정 / RDB + AOF 본문

이룸 프로젝트

[이룸] Redis 영속성 설정 / RDB + AOF

쿠마냥 2024. 4. 24. 00:00

1. 인메모리 데이터 Redis, 서버가 꺼지면...

Redis는 모든 데이터를 컴퓨터의 주기억장치인 RAM(Random Access Memory)에 저장한다. RAM은 현재 수행 중인 작업과 관련된 데이터를 저장하며, 빠른 속도가 강점이다. 하지만 전원이 공급되는 동안에만 데이터가 유지되는 '휘발성 '메모리이기 때문에, 전원을 끄면 RAM의 정보는 모두 사라지게 된다. 이 경우 Redis에 저장된 데이터도 모두 날아간다. 

 

다행스럽게도 이를 막기 위해 Redis에는 데이터를 디스크로 옮기는 기능이 존재한다. 이렇게 디스크에 저장해 놓은 데이터를 읽어와 메모리에 로딩하기 때문에, 서버가 꺼져도 데이터가 유실되지 않는다. 이를 Redis의 Persistent(영속성) 기능이라고 한다. 

persistent에 대한 정보는 이렇게 확인할 수 있다!

 

2. Redis Persistent의 단점

Redis의 영속성 기능은 메모리 DB에 저장되는 데이터의 지속성을 높인다는 장점이 있지만, 다음의 단점을 지닌다. 

1) 데이터가 많을수록 이들을 모두 메모리로 로드하는데 상당한 시간이 소요된다. 

2) Redis의 스냅샷 기능은 많은 메모리와 CPU 리소스를 소모하므로, 데이터 양이 많을 때는 사용하지 않는 것이 낫다. 

즉, 데이터 양이 많을 때 영속성 기능을 쓰기는 어렵다

 

 

3. RDB와 AOF, Redis의 데이터를 디스크에 저장하는 두 가지 방법

RDB는 주기적으로 전체 데이터의 스냅샷을 찍어 바이너리 파일로 관리하는 방법이다. 실행 시간은 오래 걸리지만 AOF보다 작기 때문에 복구 속도가 빠르다. AOF는 조회를 제외한 생성, 수정, 삭제 로그를 모두 기록하여 파일로 관리하는 방법이다. 텍스트 파일이라 편집이 가능하다. 데이터 양이 많아지면 스냅샷 찍는 시간, AOF로 복구하는 시간이 상당히 소모되기 때문에 보통 이 두 가지 방법을 섞어서 사용한다. RDB, AOF에 대해 차례로 알아본 후 두 가지를 섞어서 사용하는 방법을 살펴보자. 

 

*** 나는 Redis는 잘 구동되나 conf 파일은 찾을 수 없는 문제를 마주하였다. 이는 Redis가 설치될 때 모종의 이유로(?) conf 파일이 함께 설치되지 않는 경우가 있기 때문이라고 한다. 이를 해결하기 위해서는 Redis를 재설치하거나 conf파일을 작성해서 넣어 주면 된다. 후자로 진행하기로 결정!

 

*** 따라서 이글은 Redis github에서 다운받은 Redis.conf 파일을 기반으로 작성하였다. 

https://github.com/redis/redis 에 들어가 conf 파일을 찾은 후 우측 위쪽 'raw'를 클릭한다. 이후 '다른 이름으로 저장'을 눌러 저장한 후, 해당 파일을 redis의 서버 디렉토리에 넣어 주었다. 이 conf example은 매우 친절한 설명을 제공하므로 해당 설명만 읽어도 충분히 ㄱredis 설정을 마칠 수 있을 것이다. 

1-1) RDB(snapshotting)

  • 특정 조건이 만족되면(ex. 10분에 1번) 메모리에 있는 내용을 snapshot하여 바이너리 파일로 저장한다. 
  • 따라서 스냅샷을 찍은 특정 시점으로 데이터를 복구하는 것이 가능하다. 
  • Redis.conf 파일에서 설정할 수 있으며, 스냅샷을 찍을 경우 '.rdb'라는 확장자 파일에 바이너리 데이터가 들어간다. 
  • 바이너리 데이터라 파일 편집은 불가능. 
  • AOF 파일보다 사이즈가 작기 때문에 로딩 속도가 빠르다. (=복원 속도 빠름)
  • 그러나 스냅샷을 찍는 데 오랜 시간이 소요되며 찍는 도중 서버가 꺼지면 이후의 데이터가 유실된다. 

1-2) RDB 설정하기 (주기적으로 RDB가 일어나게 만드려면)

Redis.conf 파일에 다음의 내용을 추가한다. (디폴트 예시)

Save 3600 1 300 100 60 10000

 

이는 다음의 조건을 만족할 때 스냅샷을 찍겠다는 의미다. 모두 or로 엮이는 조건이기 때문에 하나만 달성해도 된다. (설정 변경 후에는 서버를 꼭 재시작한다.)

  • 3600초(1시간)가 지나고 데이터베이스에 최소 1번의 변경이 있었을 때
  • 300초(5분)가 지나고 데이터베이스에 최소 100번의 변경이 있었을 때
  • 60초가 지나고 데이터베이스에 최소 10000번의 변경이 있었을 때

1-3) 수동으로 스냅샷을 찍는 방법 

수동으로 찍는 방법도 있다. redis를 켜고 -> 클라이언트를 소환한 다음 -> 'SAVE'를 입력한다. ('BGSAVE'도 가능)

brew services start redis
redis-cli
SAVE

 

스냅샷을 찍을 때는 두 가지 방법이 있다. 

 

SAVE : 스냅샷 찍는 동안 레디스 일시 정지.

BGSAVE: 백그라운드에서 save 명령을 실시하여 redis 계속 가동된다. 그러나 매우 많은 CPU를 사용함 주의. 


2-1) AOF(Append only file)

  • redis에서 조회를 제외한 입력, 수정, 삭제가 진행될 때마다 로그를 기록하여 '.aof' 확장자 파일에 저장한다. 
  • 그리고 서버가 재시작될 때 파일에 기록된 모든 행위를 재가동시켜 데이터를 복구한다. 
  • 이 로그 파일은 텍스트 형식이라, 필요하면 편집이 가능하다. 
  • 스냅샷처럼 전체 파일을 찍는 게 아니라 aof 파일에 해당 행위 데이터를 추가하기만 하면 되기 때문에 쓰기 작업은 비교적 빠르다. 
  • 그러나 모든 행위(입력, 수정, 삭제)를 기록하기 때문에 데이터양이 상당히 크고 재시작 속도가 매우 느리다. (Rewrite 기능이 보완)

2-2) AOF 설정하기

마찬가지로 Redis.conf 파일에 들어가서 설정한다. (여기 적혀 있는 모든 예시는 디폴트값이다.)

appendonly yes

 

 

AOF 파일 이름은 여기서 변경한다. 

appendfilename "appendonly.aof"

 

지연 쓰기 옵션도 존재한다. 다음의 세 가지 중에 고를 수 있다. 1) always, 2) everysec, 3) no

  • always : 데이터를 AOF 파일에 기록할 때마다 즉시 디스크와의 동기화를 수행한다. 데이터 안정성은 높지만 성능 저하를 초래한다. 
  • everysec(권장/디폴트) : 매초마다 디스크와의 동기화를 수행한다. 최적의 성능을 제공하면서도 충분한 데이터 안정성을 보장한다. 
  • no : OS가 자체적으로 결정하는 시점에 디스크와의 동기화를 수행한다. 성능은 높지만 데이터 안정성은 떨어진다. 

    *** OS는 입출력 효율을 높이기 위해 데이터를 '버퍼'라는 임시 저장 공간에 모았다가, 충분한 양이 쌓이면 이를 한 번에 디스크로 전송한다. 이처럼 버퍼의 데이터가 특정 크기에 도달했거나 시스템이 일정 시간 동안 쉬고 있거나(밤이나 주말, 절전모드 직전 등 시스템 사용량이 감소해 있을 때), 시스템이 종료되기 직전 등 OS가 생각하기에 '이 타이밍이다' 하는 시점에 동기화를 수행한다는 뜻이다. 
appendfsync everysec

 

2-3) AOF Rewrite 기능

  • 이 기능은 AOF 파일에 저장된 명령들을 읽고 현재 상태만 반영하도록 파일을 생성한다. 만약 동일한 키의 값이 3에서 5로, 5에서 10으로 변경되었다면 '10'을 기록하여 불필요한 중복 기록을 제거한다. 
  • AOF 기능은 로그들이 계속해서 쌓이기 때문에 파일 용량도 지속적으로 커진다. 따라서 AOF 파일의 크기가 설정된 임계값에 도달하면 자동으로 파일을 재작성한다. 이는 서버 운영에 방해가 되지 않도록 백그라운드에서 실행된다. 

Rewrite 기능을 위해서 다음을 설정한다. 

 

이전 AOF 파일 크기 대비, 해당 퍼센트까지 증가하면 Rewrite가 실행된다. 디폴트 100퍼센트. 

auto-aof-rewrite-percentage 100

 

AOF 파일이 이 크기에 도달하기 전까지는 100퍼센트에 도달해도 Rewrite가 실행되지 않는다. 디폴트 64mb.

auto-aof-rewrite-min-size 64mb

 

설정 변경 후에는 서버를 꼭 재시작한다. 

 

 

3. 이 둘을 혼합해서 사용하려면

주기적으로 RDB로 스냅샷을 저장하면서, 다음 스냅샷 저장 전까지는 AOF 파일에 로그를 저장한다. 

 

이를 위해서 다음의 과정을 거친다. 

  1. Redis.conf 파일에서 RDB와 AOF를 활성화한다. (위의 방법 참고)
  2. 설정을 변경한 후에는 서버를 재시작한다. 
  3. RDB 파일이 생성되면, 정기적으로 외부 저장소나 백업 위치로 옮겨 백업해 놓는다.
  4. AOF 파일이 너무 커지지 않도록 주기적으로 BGREWRITEAOF을 수행한다. (redis-cli에 명령어를 입력할 수도, 어플리케이션 내에서 일정 시간마다 해당 작업을 수행할 수도 있다.)

 

 

4. Redis 서버 복구 시나리오

더보기

서버의 하드웨어가 갑자기 고장 나면서 채팅 내역을 저장하고 있던 Redis 서버가 다운되었다. 데이터가 손실될 위험이 발생했다!

 

복구 절차

1. 최신 RDB 백업 파일과 AOF 파일을 확인한다. 

2. Redis가 읽어낼 수 있는 정확한 Redis 데이터 디렉토리로, 최신 RDB과 AOF 파일을 복사해 넣는다. 

3. 서버를 재시작한다. 

4. 채팅 메시지 복구를 확인한다. 가장 최근 메시지를 추출해 보고 복구 전 기록(RDB나 AOF파일)과 비교해 본다. 

5. redis 복구를 확인한다. 'INFO' 명령어로 메모리나 CPU 사용량 등 서버 성능 지표를 확인한다.