RDB방식은 특정한 각격마다 메모리에 있는 레디스 데이터 전체를 디스크에 쓰는 것이다. 이를 통하여 백업에 이점을 가져갈 수 있다.
AOF 방식은 명령이 실행될때 마다 데이터를 파일에 기록하여 데이터 손실이 거의 없다.
RDB 방식은 특정 시점의 스냅샷으로 데이터를 저장한다. 재시작 시 RDB 파일이 있으면 읽어서 복구한다.
장점
RDB 방식의 저장 - Save, bgsave 방식
1번 Save 방식
2번 bgsave 방식
멀티 스레드 형식으로 비동기로 작업을 수행한다. redis 서비스에서 사용중인 데이터는 모두 메모리에 있는데 작업을 수행한다. 서비스 영향 없이 스냅샷으로 저장하기 위해서는 Copy-on-Write(COW) 방식을 사용한다.
자식 프로세스 fork 후 부모 프로세스의 메모리에서 실제로 변경이 발생한 부분만 복사한다. wrtie 작업이 많아서 부모 페이지 전부에 변경이 발생하게 되면 부모 페이지 전부를 복사하게 된다.
이때 자원을 많이 사용하기 때문에 cpu, memory를 체크를 해야된다. 나는 새벽 2시에 작업을 수행하게 하여 이 문제를 우회를 하였다.
#!/bin/bash
# 사용자 프로파일 로드
. ~user1/.bash_profile
# Redis CLI를 사용하여 백그라운드에서 스냅샷 생성
docker exec study-redis redis-cli BGSAVE
# 백그라운드 세이브 작업이 완료될 때까지 대기
sleep 10
# 현재 시간을 이용하여 백업 파일명 생성
backup_filename="dump_$(date +"%Y%m%d%H%M%S").rdb"
# 생성된 스냅샷 파일을 호스트의 안전한 위치로 복사
docker cp study-redis:/data/dump.rdb "/home/ubuntu/CStudy_Infra/$backup_filename"
~user1/.bash_profile
에 대한 궁금증이 생길 수 있다. 이 부분은 Cronntab을 위해 작성을 하였다. 이 부분 때문에 2시간을 삽질을 했다.이 부분은 Crontab과 관련이 있어 밑에서 설명을 하겠습니다.
모든 쓰기 요청에 대한 로그를 저장
재시작 시 AOF에 기록된 모든 동작을 재수행해서 데이터를 복구
장점
1. 모든 변경사항이 기록되므로 RDB 방식 대비 안정적으로 데이터 백업 가능
2. AOF 파일은 append-only 방식이므로 백업 파일이 손상될 위험이 적음
3. 실제 수행된 명령어가 저장되어 있으므로 사람이 보고 이해할 수 있고 수정 가능
단점
1. RDB방식보다 파일 사이즈가 크다.
2. RDB 방식 대비 백업&속도가 느리다. (백업 성능은 FSYNC 정책에 따라서 조절이 가능하다.)
유닉스 계열 운영체제의 JOB 스케줄러로 날짜, 시간 조건에 따라 주기적으로 특정 로직을 실행하는 프로그램입니다.
Crontab은 Cron 설정 정보를 파일로 관리하는 기능입니다.
Cron과 Crontab 모두 크게 용어를 구분하지 않고 스케줄러라는 의미로 사용을 한다.
Spring 프레임워크에서는 스케줄러 라이브러리를 사용할 때, 연을 제외한 6자리를 사용한다.
Crontab에서는 초와 연을 제외한 5자리를 사용한다.
Shell : 사용자가 입력한 명령어를 해석하고 프로그램을 실행시키는 인터페이스
쉘 스크립트 : 쉘로 작성한 명령어를 스크립트로 작성해, 한 줄 씩 실행하도록 만든것이다.
# cron 설치
sudo apt update -y
sudo apt install -y cron
# cron 시작
sudo service cron start
# cron systemctl 활성화
sudo systemctl enable cron.service
# cron systemctl 등록 확인
sudo systemctl list-unit-files | grep cron
sudo service cron status
이후 쉘 스크립트를 하나 작성을 하겠습니다.
만약에 없다면 vi redis_backup_script.sh
을 입력하셔서 만드시면 되지만 저는 Github Repo에 Infra에 관련된 파일이 있어서 Clone을 했습니다.
cat redis_backup_script.sh
을 통해 내용을 살펴보겠습니다.
#!/bin/bash
# 사용자 프로파일 로드
. ~user1/.bash_profile
# Redis CLI를 사용하여 백그라운드에서 스냅샷 생성
docker exec study-redis redis-cli BGSAVE
# 백그라운드 세이브 작업이 완료될 때까지 대기
sleep 10
# 현재 시간을 이용하여 백업 파일명 생성
backup_filename="dump_$(date +"%Y%m%d%H%M%S").rdb"
# 생성된 스냅샷 파일을 호스트의 안전한 위치로 복사
docker cp study-redis:/data/dump.rdb "/home/ubuntu/CStudy_Infra/$backup_filename"
실행이 되지 않는 이유
crontab -e
를 통하여 조건을 작성을 하겠습니다.컨트롤 +x
를 누르고 Y
와 엔터
를 눌러서 저장을 합니다.그러면 잘 적용이 되었는지 확인을 하겠습니다. crontab -l
을 통해 조회를 할 수 있습니다.
이후 저는 테스트를 위하여 3분마다 저장을 하게 만들었더니 성공적으로 rdb 파일이 만들어졌습니다.
만약에 crontab이 작성을 했지만 정상적으로 동작을 하지 않는다면 cat /var/log/syslog | grep CRON
을 통하여 확인할 수 있습니다.
물론 AOF 방식이 데이터의 정합성으로 좋은 방식이라고 생각하지만 현재 프로젝트의 상황과 제한된 리소스에서 RDB 방식이 더 적합하고 문제점을 Shell, Cron을 통하여 해결할 수 있다고 생각을 하였습니다.
물론 이 방식이 나중에 사람들이 많이 사용을 한다면 변경이 필요하지만 그때는 현재 방식의 문제점을 더 개선하는 redis sentinel
을 통하여 해결을 하고 싶다.
리눅스에 대해서 명령어만 알고 있었는데 직접 shell, cron을 설정 및 작성을 하였는데 더욱 학습이 필요하다고 생각이 들었다.
https://sidepower.tistory.com/17
https://ourcstory.tistory.com/63