◾️ 시나리오
웹, 데이터베이스 서버에 문제가 발생했을 때 바로 복구할 수 있도록 백업 체계 갖추기.
▪️ 자주 사용될 명령어
• tar
# 압축 시
tar -cvzf 압축할파일명 압축할디렉토리/파일 -
# 압축 해제 시
tar -xvzf 압축풀파일명
◾️ 백업 정책 세우기
정책 | 내용 | 방법 |
---|---|---|
무엇을 | 웹 : 웹소스 , 서버주요설정 DB: 데이터,서버 주요섫정 스토리지 : 서버 주요 설정 |
tar 볼로 묶어서 보관 |
언제 | 하루 한번, 유저 트래픽이 가장 적은 시간대 | 새벽 3시 ~ 5시 |
어디에 | 각 서버 이름(hostname) 디렉토리 | /mnt/backup/서버호스트이름 |
▪️ 해야할 일 정리
- 백업 스크립트가 수행해야 할 job 목록
- 스토리지에 마운트 (
mount
) - 지정한 파일/디렉토리를 tar볼로 묶어서 저장 (tar)
- 데이터베이스 서버의 경우 데이터 덤프 후 tar볼로 묶어서 저장(mariabackup)
- 백업 레포팅파일 생성 (
echo
,redirect
)- 백업 시작/종료 시각 (
date
) - 백업 파일 정보 (
ls
)
- 백업 시작/종료 시각 (
- 레포팅 파일을 읽어 관리자 텔레그램으로 전송 (
/root/monitor/tel_push.sh
)
◾️ 스크립트 작성
▪️ 백업 스크립트 (web)
# /home/${USER}/backup-script/web/script.sh
#!/usr/bin/bash
#### 필요한 변수 선언
HOST="${HOSTNAME}"
LOG_FILE_NM="/tmp/backup.log"
TEL_FILE="/home/${HOST}/telegram/alarm.sh"
DATE="$(date +%Y.%m.%d)"
#
#### 백업할 디렉토리/파일 지정
TARGET_BAK_LIST="/home/${HOST}/wordpress/html"
#
#### 백업 디렉토리 경로 지정
BAK_PATH="/mnt/${HOST}/${HOST}-backup"
#
#### 백업 파일 이름 지정
BAK_FILE_NM="${BAK_PATH}/${DATE}_${HOST}.tgz"
#
#### 로그 파일 생성
touch "${LOG_FILE_NM}"
#
#### BAK_PATH가 없는 경우 새로 생성
if [[ ! -e "${BAK_PATH}" ]]; then
echo "백업 디렉토리 생성"
mkdir -p "${BAK_PATH}"
fi
#
#### 로그 기록 시작
{
echo -e "백업 시작 "
echo -e "($(date "+%Y.%m.%d %H:%M"))\n"
tar -czpPf "${BAK_FILE_NM}" "${TARGET_BAK_LIST}"
NAME=$(ls -lh "${BAK_FILE_NM}" | awk '{print $9}')
SIZE=$(ls -lh "${BAK_FILE_NM}" | awk '{print $5}')
echo -e "=== 백업 파일 정보 (${HOST}) ===\n"
echo "파일명 : ${NAME}"
echo "파일크기 : ${SIZE}"
echo
echo -e "\n백업 종료 "
echo -e "($(date "+%Y.%m.%d %H:%M)")\n"
} > "${LOG_FILE_NM}"
#
#### 텔레그램으로 알림 전송
"${TEL_FILE}" "${HOST}" "$(cat "${LOG_FILE_NM}")"
#
#### 로그 파일 삭제
rm -rf "${LOG_FILE_NM}"
#
▪️ 백업 스크립트 (nfs)
# /home/${USER}/backup-script/nfs/script.sh
#!/usr/bin/bash
#### 필요한 변수 선언
HOST="${HOSTNAME}"
LOG_FILE_NM="/tmp/backup.log"
TEL_FILE="/home/${HOST}/telegram/alarm.sh"
DATE="$(date +%Y.%m.%d)"
#
#### 백업할 디렉토리/파일 지정
TARGET_BAK_LIST="/etc/exports /etc/nfs.conf /etc/nfsmount.conf /etc/fstab"
#
#### 백업 디렉토리 경로 지정
BAK_PATH="/mnt/md1/${HOST}-backup"
#
#### 백업 파일 이름 지정
BAK_FILE_NM="${BAK_PATH}/${DATE}_${HOST}.tgz"
#
#### 로그 파일 생성
touch "${LOG_FILE_NM}"
#
#### BAK_PATH가 없는 경우 새로 생성
if [[ ! -e "${BAK_PATH}" ]]; then
echo "백업 디렉토리 생성"
sudo mkdir -p "${BAK_PATH}"
fi
#
#### 로그 기록 시작
{
echo -e "백업 시작 "
echo -e "($(date "+%Y.%m.%d %H:%M"))\n"
sudo tar -czpPf "${BAK_FILE_NM}" ${TARGET_BAK_LIST}
NAME=$(ls -lh "${BAK_FILE_NM}" | awk '{print $9}')
SIZE=$(ls -lh "${BAK_FILE_NM}" | awk '{print $5}')
echo -e "=== 백업 파일 정보 (${HOST}) ===\n"
echo "파일명 : ${NAME}"
echo "파일크기 : ${SIZE}"
echo
echo -e "\n백업 종료 "
echo -e "($(date "+%Y.%m.%d %H:%M)")\n"
} > "${LOG_FILE_NM}"
#
#### 텔레그램으로 알림 전송
"${TEL_FILE}" "${HOST}" "$(cat "${LOG_FILE_NM}")"
#
#### 로그 파일 삭제
sudo rm -rf "${LOG_FILE_NM}"
#
▪️ 백업 스크립트 (db)
# /home/${USER}/backup-script/db/script.sh
#!/usr/bin/bash
#### 필요한 변수 선언
HOST="${HOSTNAME}"
LOG_FILE_NM="/tmp/backup.log"
TEL_FILE="/home/${HOST}/telegram/alarm.sh"
DATE="$(date +%Y.%m.%d)"
#
#### 백업할 디렉토리/파일 지정
TARGET_BAK_LIST="/home/${HOST}/database/db-data"
#
#### 백업 디렉토리 경로 지정
BAK_PATH="/mnt/${HOST}/${HOST}-backup"
#
#### 백업 파일 이름 지정
BAK_FILE_NM="${BAK_PATH}/${DATE}.db.tgz"
#
#### 로그 파일 생성
touch "${LOG_FILE_NM}"
#
#### BAK_PATH가 없는 경우 새로 생성
if [[ ! -e "${BAK_PATH}" ]]; then
echo "백업 디렉토리 생성"
sudo mkdir -p "${BAK_PATH}"
fi
sudo chmod +w "/mnt/${HOST}/${HOST}-backup"
#
#### 로그 기록 시작
{
echo -e "백업 시작 "
echo -e "($(date "+%Y.%m.%d %H:%M"))\n"
sudo tar -czpPf "${BAK_FILE_NM}" ${TARGET_BAK_LIST}
NAME=$(ls -lh "${BAK_FILE_NM}" | awk '{print $9}')
SIZE=$(ls -lh "${BAK_FILE_NM}" | awk '{print $5}')
echo -e "=== 백업 파일 정보 (${HOST}) ===\n"
echo "파일명 : ${NAME}"
echo "파일크기 : ${SIZE}"
echo
echo -e "\n백업 종료 "
echo -e "($(date "+%Y.%m.%d %H:%M)")\n"
} > "${LOG_FILE_NM}"
#
#### 텔레그램으로 알림 전송
"${TEL_FILE}" "${HOST}" "$(cat "${LOG_FILE_NM}")"
#
#### 로그 파일 삭제
sudo rm -rf "${LOG_FILE_NM}"
#
▪️ 텔레그램 봇 연동
# telegram/alarm.sh
#!/usr/bin/bash
# 파라미터 확인하기
if [[ ${#} -ne 2 ]]; then
clear
echo -e "Usage\n${0} hostname message"
exit 1
fi
# 텔레그램 봇 관련 정보
TELE_INFO_FILE="/home/${USER}/telegram/.telegram.info"
TELE_INFOS=( $(awk -F '=' '{print $2}' "${TELE_INFO_FILE}" ) )
CHAT_ID="${TELE_INFOS[0]}"
API_TOKEN="${TELE_INFOS[1]}"
URL="https://api.telegram.org/bot${API_TOKEN}/sendMessage"
# 날짜
DATE="$(date +'%Y-%m-%d %H:%M')"
# 보낼 메시지 작성
TEXT="[${1}] ${2}"
# 메시지 보내기
curl -s -d "chat_id=${CHAT_ID}&text=${TEXT}" ${URL} > /dev/null
# /home/${USER}/telegram/telegram.info
CHAT_ID=1002XXXXX
TOKEN=66XXXX:XXXXXX
◾️ cron 스케줄러 등록
# DB서버 백업
00 04 * * * /root/backup/db_backup.sh >/dev/null 2>&1