Skip to content
TUWLAB.com
Linux

Intelli Backup: File system 및 Database 백업 자동화 Bash 스크립트

Posted 2014. 12. 19 Updated 2017. 06. 15 Views 2563 Replies 0

'운영에 실패한 서버 관리자는 용서할 수 있어도, 백업하지 않은 서버 관리자는 용서할 수 없다.'는, 행간에 떠도는 백업의 중요성을 강조하는 유명한 문구가 있습니다.

 

호스팅을 받던 집에서 개인 서버를 운영하던, 초기에는 운영 관련 지식도 부족하고 서툴며, 쌓여 있는 데이터도 그다지 많지 않기 때문에 데이터 백업에 대한 경각심이 그렇게 높지 않습니다.

하지만 본격적으로 서버를 실용적 목적으로 사용하기 시작하면서 데이터가 조금씩 쌓이기 시작하면 이야기가 달라집니다. 매일 공부하면서 조금씩 조금씩 데이터를 쌓아가기 때문에, '이 정도는 구지 백업 안해도 상관 없겠지'라고 안일하게 생각하기 쉽습니다. 혹은 '설마 무슨 일이 나겠어?'라는 생각도 데이터 손실이라는 재앙을 부르는 위험한 생각입니다. 막상 사소하다고 생각한 데이터들도 한데 쌓였다가 한꺼번에 사라진다면, 그것들이 결코 사소하지 않았다는 것을 깨닫게 될 것입니다.

 

저는 개인 서버를 운영하기 시작한 계기가 데스크탑과 노트북, 외장하드 등등 여러 매체에 분산되어 마구잡이로 저장되어 있는 자료들을 한데 모아 체계적으로 관리하기 위해서였기 때문에, 운영 초창기부터 어느 정도 분량이 되는 데이터를 갖고 있었습니다. 때문에 처음 서버를 세팅할 때부터 백업에 대한 고려를 어느 정도 하고 있었습니다.

웹 사이트를 운영하기 때문에 파일시스템과 데이터베이스 백업이 주였고, 여기에 잃어버리면 나중에 다시 설치하고 나서 상당히 귀찮아지는 각종 프로그램의 설정 파일들이 백업 목록에 포함되어 있습니다.

 

이번에 수행한 서버 복구도 그 동안 차곡차곡 쌓아 온 백업 파일이 있어서 큰 문제 없이 무사히 마칠 수 있었습니다. 그 동안 서버에 많은 문제가 발생했었는데, 이번에 발생한 문제는 상당히 까다로웠습니다.

홈페이지에 접속이 안되는 상황으로부터 서버에 문제가 발생했다는 것을 알아차렸는데, 이번에 발생한 문제는 기존에 겪은 문제와 조금 양상이 달랐습니다. 홈페이지에 완전히 접속이 되지 않는 것이 아니라, HTML 페이지가 일부만 전송되는 기이한 상황(-_-)이 벌어졌습니다. 로드가 완료된 홈페이지는 본인을 약올리듯이 점(●) 하나만 덜렁 찍혀 있었습니다...

홈페이지만 이상하고 SSH나 FTP 접속에는 아무런 문제가 없었기 때문에, SSH로 접속해서 1주일 전의 데이터로 홈페이지를 복원시켰습니다. 하지만, 이번에는 접속이 잘 되고 글도 잘 뜨는 반면 새 글을 쓸 수 없거나, 관리자 페이지가 엉망이 되는 등 역시 기이한 현상이 이어졌습니다. OMG

여러 차례 다시 복원을 시도하다가 이상한 점을 하나 발견했는데, 바로 백업된 데이터베이스를 Import 하는 시간이 예전에 걸렸던 시간보다 상당히 짧았다는 것입니다. 그래서 '혹시?' 하는 생각에 백업 데이터베이스 파일의 용량을 확인해 봤더니 정상 용량의 1/10 정도 크기였으며, MySQL에 접속해서 테이블의 갯수를 확인해 보니 역시나 테이블이 20개 정도 누락되어 있었습니다. [...]

네 그렇습니다.. 과거 어느 시점부터 디스크에 저장된 데이터베이스 파일이 깨졌고, 그 이후부터 데이터베이스의 일부만 백업이 되어 왔던 것입니다. 깨진 데이터베이스 파일은 용케 겉으로는 문제를 일으키지 않고 잠복해 있어서 제가 바로 문제를 알아차리지 못했고, 그러다가 어느 날 갑자기 (제가 멘탈이 약해진 틈을 타) 불쑥 문제를 일으킨 것입니다.

다행히도 1주일 간격으로 쌓여 온 백업 히스토리가 남아 있었고, 그것들을 모두 뒤져서 데이터베이스 백업 파일이 정상 용량인 가장 최근 시점의 데이터를 기준으로 홈페이지 복원을 무사히 마칠 수 있었습니다. (가장 최근의 백업본 뿐만 아니라, 어느 정도 기간의 백업 히스토리를 유지해야 하는 이유입니다.)

 

이 외에도, 이번 서버 복구때 우여곡절이 조금 많았습니다.

아무 생각없이 디스크를 포맷했다가 백업되지 않은 누락된 항목이 발생해서 앗차 했습니다. 다른 것들은 수시로 백업되고 있어서 문제가 없었지만, 더 이상 사용하지 않고 자료 추출 및 이전을 위해 남겨 놓은 구 Wiki와 프로젝트를 위해 단기간동안만 사용했던 임시 Wiki를 복사하는 것을 깜박 했던 것입니다.

이후 서버가 어느 정도 안정화 되고 나서, 백업 히스토리를 뒤지다가 우연히 구 Wiki의 수동 백업본을 발견해서 이것은 복구를 할 수 있었지만, 단 한 번도 백업하지 않았던 임시 Wiki는 영영 복원할 수 없게 되었습니다. (저도 용서받을 수 없는 백업에 실패한 관리자가 되고 말았군요..ㅠㅠ)

여튼 이번 계기로 백업에 대한 경각심을 다시 한 번 느끼는 계기가 되었습니다. 지금은 주기적인 백업은 홈페이지와 위키, GIT Repository 및 여러 환경설정 파일들에만 한정하여 수행하고 있습니다. 그 외에 창고에 저장해 놓은 개념으로 서버에 올려놓은 자료들은 용량 등의 문제로 인해 몇년 전에 DVD에 백업한 이후로는 아직 한 번도 백업을 하지 않고 있는데, 이번 기회에 다시 한 번 백업을 해 두어야 할 것 같습니다. (RAID1 하드가 CentOS에서 인식이 되지 않을 때 엄습해 온 그 공포감이란...ㄷㄷ)

 

Intelli Backup

이번 기회에 백업 솔루션을 사용해 보려고 찾아다니다가, 별로 마음에 드는게 없어서 Shell Script 공부도 할 겸 간단하게 직접 만들어 보았습니다.

이식성이 좋도록 하기 위해 Bash Shell Script를 사용하여 만들었고, 백업 대상 목록과 백업 저장소를 따로 분리하여 관리할 수 있도록 하여 백업 대상이나 저장소가 추가/삭제되었을 때 목록만 수정하여 빠르게 업데이트할 수 있도록 하였습니다.

이 백업 스크립트는 Daemon 형태로 동작하지 않고, 명령을 입력하여 1회 백업을 실행하는 방식이기 때문에 주기적으로 백업을 하려면 crontab에 직접 등록을 해 주어야 합니다. 관련 응용 예제가 이 글의 아래쪽(↓↓↓)에 있으니, 필요하신 분은 참조하시기 바랍니다.

 

GIT Repository Address

http://git.tuwlab.com/temflic/intelli-backup/tree/master

 

기능 요약

프로그램에는 두 개의 파라미터가 입력되며, 하나는 백업 대상 목록 파일(Backup item list file)이고, 다른 하나는 백업 저장 목록 파일(Backup storage list file)입니다.

스크립트가 실행되면 백업 대상 목록 파일에 나열된 백업 대상들을 한데 모아서 백업 Collection을 만들고, 이를 백업 저장 목록 파일에 나열된 백업 저장소에 순차적으로 전송합니다.

지원되는 백업 대상의 종류는 다음과 같습니다.

  • 로컬 파일 시스템: 파일, 디렉토리
  • MySQL 데이터베이스 (mysqldump)
  • PostgreSQL 데이터베이스 (pg_dump)

지원되는 백업 저장소의 종류는 다음과 같습니다.

  • 로컬 파일 시스템
  • 원격 파일 시스템 (scp)
  • FTP 서버

각 항목별로 또는 저장소에 저장하기 전에 압축을 수행할 수 있습니다.

  • tar.gz archive
  • zip archive (저장소 저장시 압축 비밀번호 설정)

 

설치 방법

의존성 패키지 설치 (CentOS/RHEL 배포판의 경우 apt-get 대신 yum을 사용합니다.)

sudo apt-get install expect ftp scp

GIT Repository로부터 다운로드

git clone git@git.tuwlab.com:temflic/intelli-backup.git

디렉토리 이동, 심볼릭 링크 생성

sudo mv ./intelli-backup /etc/
sudo ln -s /etc/intelli-backup /usr/local/bin/intelli-backup

 

사용 방법

sudo intelli-backup {Item list file} {Storage list file} [Report output file]

 

백업 대상 목록 파일 형식

* 예제 파일 위치: ./example/items

[Type]    [Source]    [Destination]    [Compression]    [Username]    [Password]

 

[Type]

백업 항목의 유형을 지정합니다.

  • file: 로컬 파일/디렉토리
  • mysql: MySQL 데이터베이스
  • postgresql: PostgreSQL 데이터베이스

 

[Source]

로컬 파일/디렉토리 경로 혹은 데이터베이스 이름

 

[Destination]

Collection 내에서 항목이 저장될 위치 (상대경로)

%Y, %m, %d와 같은 Date format string을 사용할 수 있습니다.

 

[Compression]

Collection 내에 항목을 저장할 때 압축을 할 지 여부를 지정합니다.

  • Y: 대상 항목을 tar.gz 형태로 압축하여 저장합니다.
  • N: 대상 항목을 그냥 복사합니다. 데이터베이스의 경우 SQL 형식의 파일로 저장합니다.

 

[Username]

데이터베이스 사용자(User/Role)를 입력합니다.

[Type]이 mysql이나 postgresql인 경우에만 입력합니다.

 

[Password]

데이터베이스 패스워드를 입력합니다.

[Type]이 mysql이나 postgresql인 경우에만 입력합니다.

 

백업 저장소 목록 파일 형식

* 예제 파일 위치: ./example/storages

[Type]    [Path]    [Compression/Passphrase]    [Port]    [Username]    [Password]

 

[Type]

백업 저장소 유형을 지정합니다.

  • fs-local: 로컬 파일 시스템
  • fs-remote: 원격 파일 시스템
  • ftp: FTP 서버

 

[Path]

백업 Collection을 저장할 위치를 지정합니다.
지정 경로의 디렉토리가 존재하지 않을 경우, 자동으로 생성합니다.

%Y, %m, %d와 같은 Date format string을 사용할 수 있습니다.

※ fs-remote나 ftp 유형 저장소인 경우, 이곳에 Username을 입력하지 않도록 합니다.
[예: 'tuwlab.com:/home/blah/var'(O), 'blah@tuwlab.com:/home/blah/var'(X)]

 

[Compression/Passphrase]

저장소에 백업 Collection을 압축하여 저장할 지 여부를 지정합니다.

  • N: 압축하지 않고 저장소에 디렉토리 구조 그대로 저장합니다.
  • Y: 비밀번호 잠금을 사용하지 않는 tar.gz 압축파일로 저장합니다.
  • (기타 문자열): 여기에 입력한 문자열을 비밀번호로 하는 zip 압축파일 형태로 저장합니다.

 

[Port]

저장소에 연결할 포트번호를 지정합니다.
ftp 유형 저장소의 경우 '21,20'처럼 쉼표(,)로 구분하여 Command 포트와 Data 포트를 순서대로 입력합니다.

[Type]이 fs-local인 경우 입력하지 않습니다.

 

[Username]

저장소 인증에 사용할 사용자 이름을 입력합니다.

[Type]이 fs-local인 경우 입력하지 않습니다.

 

[Password]

저장소 인증에 사용할 비밀번호를 입력합니다.

[Type]이 fs-local인 경우 입력하지 않습니다.

 

fs-remote 유형의 저장소인 경우, 내부적으로 scp 명령어를 사용하여 백업 Collection을 전송합니다. 따라서 비밀번호 입력 없이 SSH-Key를 사용한 인증 방식을 사용할 수 있으며, 이 경우 [Password]필드를 비워 두면 됩니다.

 

환경설정

환경설정 파일의 경로는 /etc/intelli-backup/intelli-backup.conf 입니다.

 

임시 디렉토리

백업 작업시 Collection을 생성하는 임시 저장소로 활용됩니다.

TemporaryDirectory=/tmp/intelli-backup

 

최대 SSH 연결 대기 시간

fs-remote 유형의 저장소에 연결을 시도할 때, 최대로 대기할 시간을 지정합니다. 이 시간 동안 서버로부터 응답이 없는 경우, 해당 저장소로의 백업을 유보하고 연결을 종료합니다.

SSHConnectionTimeout=10

 

최대 FTP 연결 대기 시간

FTPConnectionTimeout=10

ftp 유형의 저장소에 연결을 시도할 때, 최대로 대기할 시간을 지정합니다. 이 시간 동안 서버로부터 응답이 없는 경우, 해당 저장소로의 백업을 유보하고 연결을 종료합니다.

 

응용 예시

다음 구성은 매주 월요일 오전 3시에 파일 시스템과 데이터베이스로부터 백업 대상 항목들을 추출하여 백업 Collection을 만들고 이를 로컬 저장소, 원격 저장소 및 FTP 서버 전송합니다. 백업 프로그램이 종료되면 출력된 로그를 수집하여 admin@example.com으로 백업 레포트를 전송합니다.

file          /var/www/site      files/websites       Y
file          /home/blah/Poop    files/pictires       N
mysql         xe                 db/xe-%Y-%m-%d       Y    root        mysqldbpass
postgresql    wiki               db/wiki-%Y-%m-%d     Y    postgres    psqldbpass

 

fs-local   /mnt/backup/%Y/%m/%d                     N
fs-remote  backup.example.com:/etc/backup/%Y-%m-%d  Y  22
ftp        storage.example.com:/backup              Y  21,20  ftpuser  ftppass

 

Log="$(intelli-backup /etc/intelli-backup/backup_items /etc/intelli-backup/backup_storages)"
echo "$Log" | mail -s "Server backup report $(date +"%Y-%m-%d")" "admin@example.com"

 

...
0   3   *   *   1   root    /etc/intelli-backup/backup.sh
...

 

서비스 선택
이용중인 SNS 버튼을 클릭하여 로그인 해주세요.
SNS 계정을 통해 로그인하면 회원가입 없이 댓글을 남길 수 있습니다.
댓글
?
Powered by SocialXE

List of Articles
번호 분류 제목 글쓴이 최근 수정일 조회 수
151 Linux [VirtualBox] Windows 7 물리 디스크 부팅 (Raw Disk Booting or Native Booting) - 방법 1 file TUW 2017.06.14 1936
150 Linux [VirtualBox] Windows 7 물리 디스크 부팅 (Raw Disk Booting or Native Booting) - 배경 file TUW 2017.06.03 1943
149 일반 [GIT] Submodule (Nested Repository) 사용하기 file TUW 2017.06.03 3489
148 Linux [Linux] Screen 터미널 에뮬레이션 프로그램 사용하기 TUW 2015.08.19 1770
147 일반 정규식(Regular Expression)에 대한 소개와 입문, 튜토리얼 1 file TUW 2017.12.11 20417
» Linux Intelli Backup: File system 및 Database 백업 자동화 Bash 스크립트 TUW 2017.06.15 2563
145 Linux [Linux] Sudo 명령의 Secure Path TUW 2015.04.24 2559
144 Linux [Linux] fdisk 활용 외: 파티션 생성, 배드블록 검사, 파일시스템 생성 TUW 2015.04.24 5381
143 Linux TCPDump를 활용하여 패킷 모니터링하기 TUW 2014.10.28 3680
142 일반 [C++] Template Class의 정의(Definition)와 구현(Implementation)은 한 파일 안에 있어야 한다. TUW 2015.11.27 5693
141 일반 [GIT] Patch 만들기 및 적용하기: format-patch, am TUW 2015.01.11 19462
140 일반 [GIT] 실행취소와 Commit 삭제: reflog, reset, checkout, revert TUW 2018.06.13 32152
139 일반 [GIT] 임시 저장소 사용하기: stash TUW 2015.11.28 3662
138 일반 [GIT] 병합하고 Commit 재정렬하기: cherry-pick, rebase, merge file TUW 2017.06.03 17029
137 일반 [GIT] Branch 관리하기: branch, checkout, push, pull 2 TUW 2018.02.03 8831
136 일반 [GIT] Commit하고 원격 저장소로 내보내기: add, reset, commit, push TUW 2018.01.18 4910
목록
Board Pagination Prev 1 2 3 4 5 6 7 ... 12 Next
/ 12

Powered by Xpress Engine / Designed by Sketchbook

sketchbook5, 스케치북5

sketchbook5, 스케치북5