이슈트래커 YONA 사용하기(2) - 백업
June/개발도구

이슈트래커 YONA 사용하기(2) - 백업

  1. 개요
    Yona는 여러명이 사용하는 이슈 트래커이자, 코드 저장소이다.
    그런 공간이 만일 서버의 문제나 휴먼 에러로 인하여 장애가 발생한다면,
    꽤 많은 유효정보들을 손실하게 될 것이다.
    이에 대응할 수 있도록 백업 서비스를 만들어 보자.

  2. 백업대상
    (현재 내장형 DB인 h2 DB를 사용중이다.)
    yona.h2.db
    yona.trace.db
    [dir]repos - 코드 저장소 파일
    [dir]uploads - 업로드 첨부 파일
    [dir]logs

  3. 백업방식
    증분 백업 방식 - 최초 1회 백업 수행 후, 변경 된 사항들만 원하는 주기에 맞추어 백업 하는 방식
    저장소 : AWS S3

  4. 백업주기 및 유지 정책
    백업주기) 매일(cron 새벽 4시)
    백업 유지 정책) 7일간 증분 백업본 및 로그 유지, 이후 삭제

  5. 과정
    1) CentOS의 시간을 맞춰준다.(cron 작업 사전 준비)


    2) 스케쥴링 테스트




    위의 설명을 제대로 참고하면 아래의 스케쥴링 명령어를 수비게 이해할 수 있다.
    각 항목에 들어가는 것들이 분 / 시 / 날 / 월 / 주 등을 의미하기 때문에 자신에게 맞는
    명령어를 작성하도록 하자.

    리눅스의 경우 yum install vixie-cron으로 cron을 설치해줄 수 있다.
    실행은 service crond start

  6. 코드작성
#!/bin/bash
 
##################### description ###############
# Backup to YONA script
# Create a backup file using the current date in it's name
# Backupfiles = /data/yona/yona-1.10.0/repo&&uploads&&db&&logs
# Backup Cycle = 04:00A.M. Everyday
# Backup Type = Incremental Backups
##################################################
snapdir=/data/yona/yona/backup
awsdir=s3://midasit-dv-s3-backup/yona
yonadir=/data/yona/yona-1.10.0
RM_DATE=$(date -d "-1 week" "+%Y%m%d")
BACKUP_DATE=$(date "+%Y%m%d")
CYCLE_DATE=$(date "+%d")
##################################################
 
echo "##################################################################"
echo "Backup yona user data files from CentOS to S3 on" `date`
echo "target Dir : ${yonadir}"
echo "log Dir : ${snapdir}/logs"
echo "##################################################################"
 
# If A day is the first day of its month, then reassign a snapfile
if [ ${CYCLE_DATE} -eq 01 ]
then
 
    tar -g ${snapdir}/backup.snap -zcf ${snapdir}/backupfiles/backup_base_${BACKUP_DATE}.tgz ${yonadir}/ --exclude ${yonadir}/README.md  --exclude ${yonadir}/RUNNING_PID --exclude ${yonadir}/bin --exclude ${yonadir}/conf --exclude ${yonadir}/lib --exclude ${yonadir}/share --exclude ${yonadir}/yona.lock.db --exclude ${yonadir}/backup --ignore-failed-read
    aws s3 cp ${snapdir}/backup.snap ${awsdir}/backup.snap
    aws s3 cp ${snapdir}/backupfiles/backup_base_${BACKUP_DATE}.tgz ${awsdir}/backup_base_${BACKUP_DATE}.tgz
    aws s3 rm ${awsdir}/backup_${RM_DATE}.tgz
    echo "Cycle refresh has completed."
 
else
 
    # Makes a copy of the snap file of an original starting point.
    cp ${snapdir}/backup.snap ${snapdir}/backup-1.snap
 
    # Creates a chain of changed
    tar -g ${snapdir}/backup-1.snap -zcf ${snapdir}/backupfiles/backup_${BACKUP_DATE}.tgz ${yonadir}/ --exclude ${yonadir}/README.md  --exclude ${yonadir}/RUNNING_PID --exclude ${yonadir}/bin --exclude ${yonadir}/conf --exclude ${yonadir}/lib --exclude ${yonadir}/share --exclude ${yonadir}/yona.lock.db --exclude ${yonadir}/backup --ignore-failed-read
 
    # If it performs without any error, transfer it to AWS S3
    # Delete a file that has made exactly 7 days ago
    if [ $? -eq 0 ]
    then
        aws s3 cp ${snapdir}/backupfiles/backup_${BACKUP_DATE}.tgz ${awsdir}/backup_${BACKUP_DATE}.tgz
        echo "Transfer backup files to S3 has completed "
 
        if [ -f "${snapdir}/backupfiles/backup_${RM_DATE}.tgz" ]
        then
            find ${snapdir}/backupfiles/ -maxdepth 1 -mtime +7 -exec rm -f {} \;
            find ${snapdir}/logs/ -maxdepth 1 -mtime +7 -exec rm -f {} \;
            aws s3 rm ${awsdir}/backup_${RM_DATE}.tgz
            echo "Old backup files has removed succeesful."
        else
            echo "There is no files to be deleted."
 
        fi
        rm -f  ${snapdir}/backup-1.snap
 
        echo "Backup performed perfectly"
 
     else
        echo "fail : Yona is on processing. Try it later"
        rm -f  ${snapdir}/backup-1.snap
        exit 9
    fi
 
    exit 0
 
fi

 

- 복원

위와 같이 --incremental이 tar 명령어의 옵션으로 사용되면 자동으로 증분만을 더해가며 압축이 해제된다.