Server Backup
이번에는 Server Backup에 대한 관련 내용을 다뤄 보겠습니다. Server 뿐만 아니라 Backup은 어떤 의미에서든지 굉장히 중요합니다. 언제든지 데이터를 어떠한 사고나 실수에 의해서 잃을 수 있고 이 때에 적절한 백업이 이루어지지 않았다면 소중한 데이터를 모두 잃을 수 있기 때문에 만약을 대비해서라도 주기적인 Backup은 정말 중요합니다
그렇기 때문에 수많은 User들의 정보를 저장하는 Server는 Backup이 그만큼 더 중요합니다. 개인 서버에 대한 일이라면 개인의 데이터를 잃는 것으로 끝나지만 많은 사용자를 보유한 서비스의 서버에 대한 일이라면 그 서버를 이용하고 있는 수많은 사용자들의 데이터를 모두 잃게 될 수 입니다.
백업 시에는 보통 다음의 사항들을 고려해야 합니다.
1. 언제 백업을 할 것인가?
2. 무엇을 백업할 것인가?
3. 어디에 백업할 것인가?
4. 어떻게 백업할 것인가?
언제 백업을 할 것인가?
언제?, 얼마나 자주?(주기), 얼마나 오래보관?(삭제시한)
무엇을 백업할 것인가?
사용자 데이터(Home directory), DB 데이터(시스템DB, 사용자DB), 시스템 설정파일(각 서버프로그램의 conf 파일 등)
어디에 백업할 것인가?
내부백업(시스템 내에서 여유공간이 있는 디렉토리나 외장하드) - 서버 자체에 문제가 생길경우 데이터를 보존하기 어려움
디스크 2개 이상 - 하나의 디스크를 백업용 디스크로 사용하는 개념
외부백업(자동전송, 수동 업로드) - 본 서버가 아닌 다른 서버 또는 저장소에 저장함, 상대적으로 안전함
어떻게 백업할 것인가?
압축 파일로 저장 - tar -czpf(어떤 directory 하위에 있는 모든 파일들을 한번에 묶어서 압축파일로 생성, 기본적으로 파일을 묶는 유틸리티) (리눅스 이전의 유닉스 시스템부터 존재하던 명령, -z 옵션은 압축을 해줘야 함을 의미함)
비압축 저장 - 데이터가 많아서 압축시간이 길어지는 경우 서버에 많은 부하가 걸려서 서비스에 지장을 주는 경우가 있으므로 비압축 저장을 하느 경우가 있음 - cp -R, tar -cpf
증분백업 - 이전의 백업내용에서 변경된 부분만 백업하는 것 - 백업 시간을 단축할 수 있는 장점이 있음 rsync
관련내용을 간단하게 살펴봤으니 이제 라즈베리파이에서 실제로 서버 백업을 실습해보도록 하겠습니다.
실제로 서버내에서 백업을 진행하기 위해서는 다음의 절차를 거칩니다. (완전히 처음 시스템에 대한 백업을 하는 경우라고 가정)
백업용 directory 생성 및 권한 조정 |
||
mkdir /backup chmod 700 /backup (700의 경우 rwx----- 로서 소유자에게만 권한이 있음 즉, 해당 내용을 작업하는 root만 접근할 수 있음) |
||
백업 Script 작성 |
||
backup.sh (sh는 주로 Shell Script를 의미함) 1. 사용자 데이터 압축백업(tar) 2. 사용자 DB 백업(musqldump) 3. 특정기간이 지난 백업파일 삭제(find) |
||
백업 Script 테스트 |
위의 절차에 따라서 순서대로 실습을 진행해보겠습니다. 실습환경은 다음과 같습니다.
OS : MacOS
Shell : zsh(iTerm)
우선 위에서 언급했듯이 백업용 directory를 생성합니다. 그리고 오직 소유자만이 접근할 수 있도록 권한을 설정해 줍니다.
여기서 700은 리눅스에서 chmod관련 내용에서 확인해볼 수 있었는데 관련내용은 해당 링크를 참고하시기 바랍니다.
설정 후에 해당 경로로 이동해서 권한을 살펴보면 다음과 같이 drwx------ 즉, 소유자만이 접근할 수 있도록 설정된 것을 확인할 수 있습니다.
이제 다음으로 backup script를 작성해보도록 하겠습니다. 여기서 backup script 파일은 backup.sh 인데 backup.sh 파일의 내용은 다음과 같이 구성됩니다.
#!/bin/bash
tar -czpf /backup/userdata_`date +%Y%m%d%H%M%S`.tgz /home 1>>/backup/log_`date +%Y%m%d` 2>>error_log_`date +%Y%m%d`
mysqldump -uroot -p12345678 userdb |gzip > /backup/userdb_`date +%Y%m%d%H%M%S`.sql.gz
find /backup/ -type f -mtime +7 | sort | xargs rm -f
사실 각 라인에 대한 의미를 자세하게 파악하기 위해서는 shell script에 대해서 공부해야하지만 현 시점에서는 shell script에 대한 공부가 이루어지지 않았기 때문에 간단하게 의미만 파악해보고 넘어가도록 하겠습니다.
각 라인에 대한 의미는 다음과 같습니다.
#!/bin/bash |
||
어떤 Shell Script 인지 의미, 사용자가 사용하는 Shell의 종류에 따라서 뒤에 언급을 해주면 됨 |
||
/backup/userdata_`date +%Y%m%d%H%M%S`.tgz |
||
어떤 파일을 생성할 것인가?(target), 현재 시점의 시간을 찾음(백쿼트 사용, format 지정) - 백업시점을 알기위함 ` ` - 실행된 결과값을 문자열로 받아내는 명령 |
||
/home |
||
어디에 있는 파일을 압축할 것인가?(Source) |
||
1>>/backup/log_`date +%Y%m%d` |
||
화면에 출력되는 메시지들을 해당경로의 파일에 저장(백업에 관련된 로그를 남김) >> - 추가해서 계속 만들 것(1은 하루에 한개씩 이라는 의미) |
||
2>>error_log_`date +%Y%m%d` |
||
error가 발생했을 때 해당 파일에 error log를 생성함 |
||
mysqldump -uroot -p12345678 userdb |
||
사용자 DB 'userdb'를 dump하라(DB에 있는 내용을 그대로 텍스트로 옮겨낼 것) -p 뒤에오는 숫자는 DB root에 대한 비밀번호를 입력한 것이다. 각자 설정한 비밀번호를 입력해주면 된다. 그래서 root에 접근해서 이전에 생성한 userdb의 내용을 가져온다고 생각하면 된다. |
||
|gzip > /backup/userdb_`date +%Y%m%d%H%M%S` .sql.gz |
||
이전 구문에서 전달받은 내용을 압축해서 해당경로에 해당 format으로 파일을 생성 |
||
-type f -mtime +7 | sort | xargs rm -f |
||
파일 중에서 7일이 지난파일들을 정렬해서 그 항목 하나하나를 rm -f로 보내라(파일 삭제를 의미) ( 삭제주기를 '+'뒤에 원하는 일수를 넣어서 지정할 수 있습니다.) |
여기서 주의할 점은 곳곳에 역따옴표(백쿼터)가 사용되는 데 현재 제가 사용 중인 Mac에서는 키보드 상에서 단일입력으로 해당 문자를 입력할 수 없습니다. 해당 문자를 맥에서 입력하기 위해서는 "Option + \" 을 입력하면 됩니다.
다음과 같이 root 의 home directory에 backup.sh 파일을 다음과 같이 위에 제공한 내용대로 입력해 줍니다.
backup.sh를 위와 같이 내용을 입력하고 저장했다면 이도 동일하게 소유자만 접근할 수 있도록 권한을 변경해줍니다.
이제 backup script가 정상적으로 동작하는 지 확인합니다.
이렇게 해서 backup script 테스트까지 모두 마쳤습니다.
참고하기
그런데 다음과 같이 backup script 테스트를 마치게 되면 backup.sh가 위치한 디렉터리에 다음과 같이 error_log 파일이 생성됩니다.
정상적으로 잘 테스트가 됬는데 왜 error_log 파일이? 해당 파일을 열어보면 다음과 같은 내용을 확인할 수 있습니다.
이게 무슨 의미일까요?
사실 이 메시지는 에러메시지라기 보다는 알림메시지라고 봐야 합니다. 이는 압축할 파일들의 경로에서 '/' 문자를 제거하였음을 의미합니다. 현재 shell script 에서 사용하는 tar 명령어는 기본값으로 상대경로를 사용합니다. 그래서 위에서와 같이 파일의 경로를 절대경로를 사용해서 입력하면 위 처럼 알림메시지를 내보내고 해당 문자를 삭제합니다.
큰 문제가 되지 않지만 계속 이렇게 error log가 발생되는 것이 거슬린다면 해당 링크를 참조하시기 바랍니다.
모든 백업을 관리자가 수동으로 진행하는 경우는 많지 않습니다. 즉, 주기적으로 평소에 이루어지는 백업은 자동화하여 수행합니다.
이를 위해서 우리는 cron을 사용합니다. cron은 일종의 서버 서비스로 데몬이 돌아갑니다. 그래서 주기적으로 수행해야하는 명령을 자동으로 실행시켜주는 데 활용할 수 있습니다.
cron에 대한 보다 세부적인 설명은 아래 링크를 참고하시기 바랍니다.
https://jhnyang.tistory.com/68
그래서 cron을 세팅해서 사용하기 위해서는 cron table을 설정해야 합니다. cron table은 cron이 관리하는 table을 이야기 하는 것으로서corn table에 대한 명령어는 crontab 명령어를 사용합니다. crontab 명령어에 -e 옵션을 추가하면 이는 cron table의 내용을 수정하겠음을 의미하며 해당 명령어를 입력하면 다음과 같이 사용할 수 있는 설치된 에디터의 리스트가 나타납니다.
저는 여기서 vim basic을 에디터로 사용하도록 하겠습니다. 원하는 항목 번호를 입력해주고 엔터를 누르면 해당 에디터로 cron table을 열게 됩니다.
crontab을 열게되면 다음과 같이 내용이 나타납니다. 이제 여기에 원하는 작업을 등록하려면 위에서 보이는 23번 라인 아래 즉, 24번 라인에 다음의 내용을 입력해주면 됩니다.
0 5 * * * /root/backup.sh 1>/dev/null 2>/dev/null |
||
/root/backup.sh를 실행해라, 기본출력은 보내지 말 것(실행만 시켜라) |
현재의 입력은 백업을 매일 새벽 5마다 수행하는 것으로 설정하겠다고 가정한 상황입니다. 여기서 중요한 것은 가장 앞에오는 5자리의 숫자인데 이 5자리의 의미는 다음과 같습니다.
0 5 * * * |
||
1. minute(0~59) |
||
2. hour(0~23) |
||
3. day of month(1 ~ 31) |
||
4. month(1~12) |
||
5. day of week(0~6) (Sunday = 0) |
||
즉 위의 구문은 매일 새벽 5시마다 해당 명령을 수행하라는 의미로 해석할 수 있다. |
||
하루에 백업을 2번 수행하고 싶다면? -> 위의 해당구문을 하나 더 입력해주면 됨 |
해당 의미에 맞춰서 다음과 같이 crontab에 내용을 추가해주면 됩니다.
이렇게 세팅함으로서 이제 해당 라즈베리파이 서버는 서버의 home 디렉터리를 매일 새벽 5시에 백업하게 됩니다.
이것으로 Server Backup 관련 글을 마치도록 하겠습니다.
'Web Basic > Raspberry PI' 카테고리의 다른 글
라즈베리파이 - Wordpress Theme 설정 및 사용자화 (0) | 2021.02.03 |
---|---|
라즈베리파이 - Wordpress 설치 및 세팅 (0) | 2021.02.03 |
System Administration & mariadb setup (0) | 2021.02.02 |
라즈베리파이 - Batflat의 관리자 페이지 사용법 (0) | 2021.02.01 |
라즈베리파이 - CMS를 이용한 블로그 페이지 세팅 (0) | 2021.01.31 |
댓글
이 글 공유하기
다른 글
-
라즈베리파이 - Wordpress Theme 설정 및 사용자화
라즈베리파이 - Wordpress Theme 설정 및 사용자화
2021.02.03 -
라즈베리파이 - Wordpress 설치 및 세팅
라즈베리파이 - Wordpress 설치 및 세팅
2021.02.03 -
System Administration & mariadb setup
System Administration & mariadb setup
2021.02.02 -
라즈베리파이 - Batflat의 관리자 페이지 사용법
라즈베리파이 - Batflat의 관리자 페이지 사용법
2021.02.01