백업 시스템 구축
회사에서 기획, 개발, 배포, 운영등을 다 하다보니 여러가지 고려할 사항들이 있었는데 그중 백업 시스템도 그러했다.
백업 시스템의 필요성을 느끼게 되었고 이에 따라 공부를 진행했다.
백업관련 공부를 하다보니 3, 2, 1 법칙에 대해 알 수 있었다.
3, 2, 1 법칙
- 3 최소 3개(원본 + 사본 2) 개의 데이터를 유지
- 2 2개 유형의 스토리지의 저장
- 1 최소 1개는 원격지에 저장하는 백업 방식
현재 사내 사이트는 모두 클라우드 환경에 돌아가고 있기 때문에 3, 2, 1 법칙에서 이미 1은 달성한 셈이다.
이제 이에 따른 백업 시스템을 구상하기로 하였다.
백업 시스템에 도입하기로 한것은 두가지다.
- 증분 백업
- 전체 백업
증분 백업
일정 시간마다 변경된 데이터만 백업하는 방식
RSYNC를 통해 운영 서버의 데이터와 백업 서버의 데이터를 1시간 주기로 일치화 시켜주는 작업을 진행했다.
먼저 해당 작업의 자동화를 위해 백업 쉘을 작성해주었다.
rsync
remote sync의 약자로 말 그대로 원격주소의 sync를 위해 사용하는 유틸리티이다.
여러가지 옵션들이 있지만 주로 사용한 옵션들은 다음과 같다
rsync 옵션 현재 데이터가 있는 주소 동기화 시킬원격지 주소
- -a : archive mode. -r, -t(타입스탬프 보존), -l (심볼릭 링크 보존), -p(permission 보존),
-g(g그룹 보존), -o(소유자 보존 - root 만 가능), -D(device, special 파일 보존)를 합친 내용과 동일하다. - -v: verbose 자세한 정보 출력한다.
- -p 현재 폴더가 가지고 있는 permision을 그대로 옮긴다.
- -h : human-readable 사람이 읽기 쉽게 표시한다.
- --progress 진행상황을 표시한다.
- --delete 원본 데이터에서 지워진 파일은 복사 대상에서도 지운다.
쉘 만들기
backup.sh
today=`date +%Y-%m-%d/%H-%M-%S`
echo $today
sudo rsync -avph --bwlimit=4000 --progress --delete 현재 주소 백업할곳 주소(로컬 주소 or 원격주소)
쉘을 실행시켜 원격 주소에 Rsync를 통해 데이터를 통신한다면 비밀번호를 입력하라고 나오게 된다.
해당 쉘을 만들어 쉘이 잘 동작하는지 테스트 해준다.
쉘을 실행시켜서 동작시키게 되면 원격 백업의 경우 해당 원격지의 비밀번호를 물어보게 된다.
하지만 매번 작업마다 비밀번호를 입력 하는 불편함을 개선함과 동시에 자동화 작업을 위해 키를 활용한 ssh 접속 방식을 채택하였다.
SSH 접속 허용하기
ssh-keygen - ssh 공개키를 생성한다
ssh-copy-id - 로컬호스트의 공용키를 원격지에 복사한다.
sudo ssh-keygen -t rsa -b 4096
sudo ssh-copy-id test@22.222.222.222(예시 원격지)
해당 작업을 진행하고 나서 쉘을 실행시키게 되면 비밀번호를 입력하지 않고도 rsync ssh통신이 가능하다.
자동화를 위한 crontab 작업하기
이제 자동화를 위해 crontab을 작성한다.
crontab
윈도우의 스케줄러와 비슷하며 특정시간에 특정 작업을 할때 활요할 수 있다.
- crontab -e 크론탭 내용을 작성할 경우 사용
- cronatb -l 크론탭의 내용을 조회할 경우 사용
- crontab -r 크론탭 내용을 삭제할 경우 사용
crontab -e 를 실행하여 크론탭에 내용을 작성해준다.
크론탭 작성시 *
*로 표시하게 되면 전체에 해당하게 된다.
* * * * *
분(0-59) 시간(0-23) 일(1-31) 월(1-12) 요일(0-7)
1 1 * * * ls -> 매일 1시 1분마다 ls를 실행
* 1 * * * ls -> 매일 1시에 해당되는 모든 분마다 ls를 실행
위까지 작성하게 되면 이제 매시간 마다 30분이 되면 해당 shell 작업을 실행시켜 rsync 백업(증분백업)을 진행한다.
전체 백업
전체 데이터의 복사본을 만드는 백업 방식으로써 복구가 간편하지만 용량을 많이 차지하는 단점이 있다.
RSYNC를 통해 받아온 운영서버의 데이터를 하루 주기로 백업하는 방식을 진행했다.
운영중인 서버에서 전체 백업을 진행하게 되면 운영하는 서버에 부담을 줄수 있기 때문에
운영서버의 데이터를 백업 서버에 증분 백업으로 넘기고
증분 백업으로 받아온 데이터를 전체 백업 관리를 통해 진행시켜준다.
전체 백업 과정은 다음과 같다
전체 백업을 위한 쉘 을 작성한다 -> crontab에서 하루에 한번 전체 백업을 기록한다.
전체 백업을 위한 쉘을 작성해준다.
data_backup.sh
#zip이 들어가는 디렉토리 갯수 가져오기
count=`ls -l /mnt/backup | grep .zip | wc -l`
echo $count
#zip 파일 갯수 파익하기(7개 초과이면 가장 나중에 만든 파일 삭제)
if [ $count -gt 7 ]
then
#가장 나중에 만든 파일이름 가져오기
delete_data=`ls -ltr /mnt/backup | tail -n +2 | head -1 | awk '{print $9}'`
sudo rm -r /mnt/backup/$delete_data
fi
#zip 프로세스 진행하기
today=`date +%Y-%m-%d_%H:%M`
sudo zip -r /mnt/backup/$today /mnt/data
echo "완료"
일주일치의 백업 데이터를 가지고 있기 위해 데이터가 7개초과인 경우 가장 마지막에 생성된 백업데이터를 삭제하는 방식으로 쉘을 짜 보았다.
마지막으로 해당 쉘을 크론탭에 등록해주면 끝이다.
매일 23시 59분이 되면 해당 backup 로직을 실행할수 있도록 진행하였다.
마무리
기존에 부실하던 백업시스템을 뒤엎고(해당 시스템도 과거의.. 내가 만들었지만) 새로운 백업 시스템을 구축했다는것이 상당히 흥미로웠다.
백업을 위한 설계 방식, 운영하는 서버의 안정성을 고려하면서 진행하다보니 도움이 많이 된 작업이였다.
참고한 블로그
https://noil0816.tistory.com/109
https://notes.harues.com/posts/incremental-backup-using-rsyncssh/
https://blog.dalso.org/linux/1592