Database/NoSQL

[Redis] 레디스 영속성 (Redis persistence)

Ella_K 2022. 12. 4. 22:30

Redis Persistence

Persistence는 solid-state disk (SSD)와 같은 내구성 있는 저장소에 데이터를 쓰는 것을 의미한다. 

📌 Persistence Options

RDB (Redis Database)

  • 지정된 간격으로 데이터 세트의 특정 시점 스냅샷을 수행

AOF (Append Only File)

  • 서버에서 수신한 모든 쓰기 작업을 기록
  • append only file 방식으로 입력, 수정, 삭제가 실행될 때마다 로그가 저장되며, 기본적인 설정으로는 appendonly.aof 파일의 로그가 저장되는데 조회는 제외하고 저장된다.
  • 서버 시작 시 기록된 쓰기 작업이 다시 재생되어 데이터 세트를 재구성할 수 있다.

No Persistence

  • 영속성을 완전히 비활성화

RDB + AOF

  • 동시에 둘을 같이 사용하기도 함

 

📌 RDB 장점

  • 백업에 적합 Ex. 24시간 동안 매시간 RDB 파일을 보관하고 30일 동안 매일 RDB 스냅샷을 저장할 수 있다. 장애 발생 시 다양한 버전의 데이터 세트를 복원할 수 있다.
  • 원거리 데이터 센터 또는 Amazon S3로 전송할 수 있는 단일 압축 파일
  • Redis 부모 프로세스가 자식 프로세스를 생성. 부모 프로세스는 디스크 I/O를 수행하지 않고 자식 프로세스가 disk에 snapshot을 저장
  • AOF에 비해 큰 데이터 세트를 더 빨리 restart할 수 있다. (복원 시)
  • replicas 에서 restarts 및 장애조치 후 partial resynchronizeations를 지원

 

📌 RDB 단점

  • 장애 발생시 데이터 손실 가능성이 있다. (저장 시점과 장애 발생 시점 사이의 데이터 손실)
  • 하위 프로세스 (자식 프로세스)를 이용하여 스냅샷을 disk에 저장하는데, 이는 fork()가 필요하다. (fork()는 부모 프로세스가 자식 프로세스를 생성하는 것). fork()는 데이터 세트가 큰 경우 시간이 많이 소요 될 수 있다.
Copy-on-Write
Linux에서는 자식 프로세스를 생성하면 같은 메모리 공간을 공유한다. 그런데 부모 프로세스가 데이터를 새로 넣거나, 수정하거나, 지우게 되면 같은 메모리 공간을 공유할 수 없게 된다. 이때 부모 프로세스는 해당 페이지를 복사한 다음 수정한다. 이를 Copy-on-Write라고 한다.
자식 프로세스가 생성되어 작업을 하는 동안 데이터 입력/수정/삭제가 발생하면 해당 메모리 페이지를 복사해야 되기 때문에 평소보다 더 많은 메모리가 필요해진다.
AOF 또한 append-only파일이 커지면 append-only파일을 다시 쓰기 위해서 fork()가 필요하지만 이는 덜 빈번하며 다시 작성하는 빈도를 조정할 수 있다.

 

📌 AOF 장점

  • 여러 fsync 정책을 수립할 수 있다. (fsync 비활성화, 매초 fsync, 매 쿼리 fsync 등) fsync는 백그라운드 Thread에서 수행된다.
  • append-only log이므로 Redis관련 시스템 장애시 마지막 명령의 기록이 완전하지 않은 경우에도 redis-check-aof 도구를 사용하여 aof파일의 잘못된 부분을 고칠 수 있다.
  • AOF가 너무 커지면 백그라운드에서 자동으로 다시 작성할 수 있다.  redis는 오래된 이전 파일에 계속 기록 하면서 현재 data set을 생성하는데 필요한 최소한의 작업 set로 새로운 파일을 생성하고, 이 새로운 파일로 전환해서 새로운 파일에 기록한다.
  • flushall 명령과 같은 명령에 의하여 데이터를 완전히 잃어버리는 사태를 방지할 수 있다. Ex. 기존 Redis 서버를 잠시 중단시키고, aof 파일을 열어서 마지막에 기록된 flushall 명령을 제거하고 Redis를 다시 시작하면 데이터 손실 없이 DB를 살릴 수 있다.

 

📌 AOF 단점

  • RDB 파일보다 더 많은 디스크 용량을 차지한다.
  • fsync 정책에 따라 모든 명령어를 기록하므로 RDB보다 느릴 수 있다. (일반적으로 fsync를 매초로 설정해도 성능은 여전히 높다. RDB에 비해 느리다는 의미.)

 

📌 무엇을 사용해야 하나?

  • PostgreSQL이 제공할 수 있는 것과 비슷한 수준의 데이터 안전을 원하는 경우 두 영속성 방법을 모두 사용하는 것이 일반적인 방법이다.
  • 데이터를 보존해야하지만 장애 발생 시 몇분의 데이터 손실을 감수할 수 있는 경우 RDB만 단독으로 사용
  • AOF만 사용하는 사용자들이 많지만, 빠른 재시작을 위해서, 그리고 AOF 엔진의 버그의 경우를 고려해서 데이터베이스 백업으로 RDB 스냅샷을 사용하는게 좋은 아이디어이기 때문에 AOF만 사용하는 것을 추천하지 않는다.

 


source

https://redis.io/docs/management/persistence/

 

Redis persistence

How Redis writes data to disk

redis.io

http://redisgate.kr/redis/configuration/copy-on-write.php

 

Redis Copy-on-Write

copy-on-write Redis Copy-on-Write 분석 Redis Copy-on-Write 분석 개요 槪要 Outline 레디스 서버의 메모리 사용량은 실 데이터 크기에 관리 메모리(overhead)를 더해야 한다.   그리고 Copy-on-Write로 인한 추가 메모

redisgate.kr

https://escapefromcoding.tistory.com/707

 

Redis Persistence AOF vs RDB

개요 Redis는 In-memory 데이터 저장소이므로 서버를 재시작하면 모든 데이터를 유실합니다. 또한 복제 기능을 사용해도 잘못된 코드나, 사람의 실수가 발생하면 복제본도 똑같이 데이터가 삭제됩

escapefromcoding.tistory.com

https://server-talk.tistory.com/490

 

Redis Persistence - AOF 기본설정 알아보기

Redis Persistence - AOF 기본설정 알아보기 이번 포스팅에서는 Redis AOF 사용법의 대해서 알아보도록 하겠습니다. Redis 이전글 https://server-talk.tistory.com/471 - Redis - In-Memory - 알아보기​ https://server-talk.tist

server-talk.tistory.com

https://djlee118.tistory.com/121

 

34.Redis, 레디스의 AOF(Append Only File)에 대해서 알아보자구요! ^^

AOF(Append Only File) 이란? Redis 에서 데이터의 영구 저장을 위하여 지원하는 두번째 기능. Redis 가 수신하는 모든 쓰기 명령을 aof 파일에 기록하여 데이터를 보관함. 알기쉽게 말하면, MySQL 의 bin 로그

djlee118.tistory.com

 

'Database > NoSQL' 카테고리의 다른 글

[MongoDB] PyMongo(python 라이브러리)로 MongoDB사용하기  (0) 2022.07.21