-
redis 백업의 과정😱 삽질 이슈 기록 2023. 4. 9.
문제 상황
로그 이전에 관한 Job 정보들을 생성해 redis에 적재한 후, 테스트로 Job 단위로 작업을 수행 하던 중, 실수로 Redis 컨테이너를 중지 시켜버리는 문제가 발생 했고, 일부 Job 정보의 변경사항을 날리게 되었다.
만약 테스트를 처음부터 실행하려고 한다면 작업 실행 정보를 다시 redis에 적재하는 초기화 작업을 수행해야 하는 상황이였다.
작업에 대한 정보를 생성하는 작업의 경우 시간이 소요되는 작업이였기 때문에 적재를 하기 때문에 이 작업 부터 다시 시작하는건 비효율 적인 상황 이였다.
해결
다행히 작업 시작 전 혹시 작업을 처음부터 다시 돌려야 하는 상황이 생긴다면, redis에 작업 정보들을 적재하는 작업부터 다시 하지 않도록 적재된 모든 작업 정보의 초기 상태를 백업 해 두었다.
백업의 과정
BGSAVE 명령어로 /data 경로에 dump.rdb 백업 파일을 생성 한 후, 생성된 dump.rdb 파일이 작업 도중 자동으로 생성된 백업 파일로 인해 덮어씌워지지 않도록 initial_dump.rdb 파일로 이름을 변경 한 후 로컬에 따로 저장해두었다.
백업을 통해 다행히 테스트를 처음부터 다시 시작 할 수 있었다. 그러면서 Redis의 백업 방식에 궁금증이 생기게 되었고 관련된 내용을 정리해 보았다.
Redis 에서의 백업
Redis는 인메모리 데이터베이스이기 때문에 휘발성 특성을 가진다. 따라서 위 상황처럼 갑자기 Redis 프로세스가 중지되는 순간 적재한 데이터는 유실되게 된다.
Redis에서는 이 단점을 보완하기 위해 디스크에 데이터를 기록하는 영속성 기능을 지원해주는데 다음과 같은 방식들이 있다.
1. RDB 스냅샷 방식
지정된 간격으로 데이터 세트의 특정 시점 스냅샷을 수행
- 백업에 적합
- 백업 파일을 Amazon S3와 같이 외부 스토리지로 전송할 수 있다.
- RDB는 AOF에 비해 큰 데이터 세트를 복구하기에 용이하다.
- RDB 생성 주기를 짧게 설정하여 자주 저장하면 저장 작업을 완료하는 데 다소 시간이 걸릴 수 있으므로 Redis 성능에 영향을 줄 수 있다. 그렇기 때문에 Redis가 작동을 멈춘 경우(예: 정전 후) 데이터 손실 가능성을 최소화해야 하는 경우 RDB 방식은 좋지 않다.
데이터 세트가 큰 경우 시간이 많이 소요될 수 있다. 그래서 백업을 수행하는 동안 Redis가 몇 밀리초 ~ 1초 동안 클라이언트 서비스에 영향을 줄 수 있다.
RDB 자동 스냅샷
기본적으로 Redis는 디스크에 일정 주기 마다 데이터 세트의 스냅샷을 dump.rdb 라는 이진 파일로 저장한다.
RDB 수동 스냅샷
SAVE 또는 BGSAVE 명령어를 사용해서 수동으로 dump.rdb
2. AOF 방식
모든 쓰기 명령에 대한 쓰기 로그를 남기고, 그 로그를 토대로 데이터를 재구성 한다.
- RDB 방식보다 더 유실에 대해 안정적이 방식이다.
- RDB의 경우 백업 주기를 짧게 설정 할 경우 성능에 영향이 생길 수 있는 반면, AOF 싱크는 백그라운드 스레드에서 수행되기 때문에 기본 설정 값인 매 1초마다 동기화 작업을 수행해도 성능상 큰 문제가 없다.
- AOF 파일은 일반적으로 동일한 데이터 세트에 대한 RDB 파일보다 크다,
- 동기화 정책에 따라 속도가 RDB보다 느릴 수 있다.
RDB VS AOF
만약 PostgreSQL과 같은 상용 데이터베이스가 제공할 수 있는 것과 비슷한 수준의 데이터 안전을 원하는 경우, 두 지속성 방법을 모두 사용해야 하는 일반적이다.
그러나 데이터 양이 많고 재해 발생 시 몇 분의 데이터 손실을 감수할 수 있는 경우, RDB만 단독으로 사용하는 것이 좋다.
AOF 와 RDB 스냅샷을 함께 설정 하는 것이 만약 AOF 엔진에 버그가 있는 상황에 대비할 수있다.
출처
'😱 삽질 이슈 기록' 카테고리의 다른 글
운영중인 앱들의 요청 라우팅 하기 - AWS Route 53, Nginx (0) 2023.03.07 MySQL 8.x 설치 후 Sequal Pro 접속 시 Authentication plugin 'caching_sha2_password' cannot be loaded 에러 해결 (0) 2023.02.17 Next.js CPU 사용량 및 메모리 튀는 현상 개선 (feat. Clinic.js) (0) 2023.01.26 LEFT (OUTER) JOIN 할때 결과 중복 이슈 (0) 2022.11.11 [JS] undefined 참조 에러 체크의 중요성 (0) 2022.11.02