Name
Last commit
Last update
..
images system/db backup init
.gitkeep SYSTEM/BACKUP init
README.md system/db backup modify4

logo

Overview

홍쓰넷의 백업은 System 설정과 DBMS 두 가지를 진행하고 있다.

zabbix

System 설정 백업

먼저 시스템 백업은 Bash Script 기반으로 구성되어 있으며, 다음과 같이 구성되어 있다.

  • STEP 1 : 백업할 서버의 rsyncd.conf 파일을 설정하고, TCP/873 포트를 허용한다.
  • STEP 2 : Rsync (Netowkr)를 이용하여, 원격지의 설정 파일을 백업 받는다.
  • STEP 3 : 증분백업이 필요한 시스템의 경우 STEP 1이 완료되면, 내부적으로 증분 백업(cp -al 링크 옵션)으로 진행한다.

또한 백업 스크립트의 경우도 다음과 같이 두 가지로 분기 처리된다.

  • 백업정책 스크립트 : backup_hongsnet.sh
  • 백업 스크립트 : remotebackup_type2

/etc/rsyncd.conf 설정 내역

# cat /etc/rsyncd.conf
[etc]
path = /etc
comment = pds dir
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = 192.168.1.8
max connections = 3
timeout = 300

[home]
path = /home
comment = home dir
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = 192.168.1.8
max connections = 3
timeout = 300

[usrlocal]
path = /usr/local
comment = /usr/local dir
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = 192.168.1.8
max connections = 3
timeout = 300

[root]
path = /root
comment = root dir
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = 192.168.1.8
max connections = 3
timeout = 300

백업정책 스크립트

#!/bin/sh
# Description: Backup Policy Script
# Author: juhanida21@nate.com

date=`date +"%Y-%m-%d"`
epath="/usr/local/scripts/backup/hosting/backup/hongsnet/remotebackup_type2"

BACKUP="BACKUP/hongsnet"
logdir="/$BACKUP/log"
log="$logdir/result_log-$date"

if [ ! -d /$BACKUP ]; then
  /bin/mkdir -p /$BACKUP
  echo ""
  echo "/$BACKUP Directory Create!"
  echo ""
fi

if [ ! -d /$BACKUP/log ]; then
  /bin/mkdir -p /$BACKUP/log
  echo ""
  echo "/$BACKUP/log Directory Create!"
  echo ""
fi

date_net=`date +"%Y-%m-%d-%H:%M:%S"`
echo "###########################################################################" >> $log
echo "$date_net NETWORK BACKUP (START)" >> $log
echo "###########################################################################" >> $log

echo "###########################################################################" >> $log
echo "Hongs Dev NETWORK BACKUP START" >> $log
echo "###########################################################################" >> $log
$epath $BACKUP etc 172.24.0.135 NOT NOT >> $log
$epath $BACKUP home 172.24.0.135 NOT NOT  >> $log
$epath $BACKUP usrlocal 172.24.0.135 NOT NOT >> $log
$epath $BACKUP root 172.24.0.135 NOT NOT >> $log
echo "###########################################################################" >> $log
echo "Hongs Dev NETWORK BACKUP END" >> $log
echo "###########################################################################" >> $log
....중략

echo "###########################################################################" >> $log
echo "TB3-K8S NETWORK BACKUP START" >> $log
echo "###########################################################################" >> $log
$epath $BACKUP etc 172.16.0.251 NOT NOT >> $log
$epath $BACKUP home 172.16.0.251 NOT NOT  >> $log
$epath $BACKUP usrlocal 172.16.0.251 NOT NOT >> $log
$epath $BACKUP root 172.16.0.251 NOT NOT >> $log
echo "###########################################################################" >> $log
echo "TB3-K8S NETWORK BACKUP END" >> $log
echo "###########################################################################" >> $log

echo "###########################################################################" >> $log
echo "TB3 NETWORK BACKUP START" >> $log
echo "###########################################################################" >> $log
$epath $BACKUP etc 172.16.0.158 NOT NOT >> $log
$epath $BACKUP home 172.16.0.158 NOT NOT  >> $log
$epath $BACKUP usrlocal 172.16.0.158 NOT NOT >> $log
$epath $BACKUP root 172.16.0.158 NOT NOT >> $log
echo "###########################################################################" >> $log
echo "TB3 NETWORK BACKUP END" >> $log
echo "###########################################################################" >> $log

echo "###########################################################################" >> $log
echo "TB2 NETWORK BACKUP START" >> $log
echo "###########################################################################" >> $log
$epath $BACKUP etc 172.24.0.151 NOT NOT >> $log
$epath $BACKUP home 172.24.0.151 NOT NOT  >> $log
$epath $BACKUP usrlocal 172.24.0.151 NOT NOT >> $log
$epath $BACKUP root 172.24.0.151 NOT NOT >> $log
echo "###########################################################################" >> $log
echo "TB2 NETWORK BACKUP END" >> $log
echo "###########################################################################" >> $log

date_net_end=`date +"%Y-%m-%d-%H:%M:%S"`
echo "###########################################################################" >> $log
echo "$date_net_end NETWORK BACKUP (END)" >> $log
echo "###########################################################################" >> $log

date_local=`date +"%Y-%m-%d-%H:%M:%S"`
echo "###########################################################################" >> $log
echo "$date_local LOCAL BACKUP (START)" >> $log
echo "###########################################################################" >> $log

echo "###########################################################################" >> $log
echo "Hongs Dev INC BACKUP START" >> $log
echo "###########################################################################" >> $log
$epath $BACKUP home 172.24.0.135 3 data_rotate >> $log
echo "###########################################################################" >> $log
echo "Hongs Dev INC BACKUP END" >> $log
echo "###########################################################################" >> $log

echo "###########################################################################" >> $log
echo "iHosting INC BACKUP START" >> $log
echo "###########################################################################" >> $log
$epath $BACKUP home 192.168.100.156 3 data_rotate  >> $log
echo "###########################################################################" >> $log
echo "iHosting INC BACKUP END" >> $log
echo "###########################################################################" >> $log

echo "###########################################################################" >> $log
echo "1M BYTE UP FILE DELETE BACKUP START" >> $log
echo "###########################################################################" >> $log
/usr/bin/find /$BACKUP/ -name ".*" -size +1000k -exec rm -rfv {} \;  >> $log
echo "###########################################################################" >> $log
echo "1M BYTE UP FILE DELETE BACKUP END" >> $log
echo "###########################################################################" >> $log

date_local_end=`date +"%Y-%m-%d-%H:%M:%S"`
echo "###########################################################################" >> $log
echo "$date_local_end LOCAL BACKUP (END)" >> $log
echo "###########################################################################" >> $log

설정될 모듈은 반드시 rsync 모듈명과 같아야 한다.

백업 스크립트

#!/bin/sh
# Description: Hongsnet Backup Scripts
# Date : 2015-10-20
# Author : joohanhong <juhanida21@nate.com>

#date=`date +"%Y-%m-%d-%H"`
date=`date +"%Y-%m-%d"`

#echo $1
#echo $2
#echo $3
#echo $4
#echo $5

[ $# -ne 5 ] &&
{
echo
echo ========================================================================================================================================================================
echo
echo 'USAGE : remotebackup_type2 PATH RSYNC_NAME IPADDR HOMEROTATE(DAY) ROTATE'
echo
echo 'e.g, remotebackup_type2 backup(/ not!) test 192.168.1.1 3 data_rotate(if no value is NOT)'
echo
echo ========================================================================================================================================================================
echo
exit 1
}

# Requirement Args 값이 NULL이 아닐경우에 시작
if [ $1 != NULL -a $2 != NULL -a $3 != NULL -a $4 != NULL -a $5 != NULL ]; then

  if [ ! -d /$1 ]; then
    /bin/mkdir -p /$1
    echo ""
    echo "$1 Directory Created!"
    echo ""
  fi

  if [ ! -d /$1/$3 ]; then
    /bin/mkdir -p /$1/$3
    echo ""
    echo "$3 Directory Created!"
    echo ""
  fi

  if [ ! -d /$1/$3/$2 ]; then
      /bin/mkdir -p /$1/$3/$2
      echo ""
      echo "$3 Directory /$1/$3/$2 Created!"
      echo ""
  fi

  if [ $5 == "NOT" ]; then

      /usr/bin/rsync -az --timeout=600 $3::$2 /$1/$3/$2/

  elif [ $5 == "data_rotate" ]; then

    if [ ! -d /$1/$3/${2}_Rotate ]; then
      /bin/mkdir -p /$1/$3/${2}_Rotate
      echo ""
      echo "/$1/$3/${2}_Rotate Directory Create!"
      echo ""
    fi

    number=$4
    number2=$4

    for dirs in $(cd /$1/$3/${2}_Rotate; ls |grep inc. |cut -c5-6)
    do
      if [ "$dirs" -gt "$number2" ]; then
       /bin/rm -rf /$1/$3/${2}_Rotate/inc.$dirs
      fi
    done

    echo "# $DATE2 : mv /$1/$3/${2}_Rotate/inc.${number2} /$1/$3/${2}_Rotate/inc.99"
    /bin/mv /$1/$3/${2}_Rotate/inc.${number2} /$1/$3/${2}_Rotate/inc.99 2>/dev/null

    while [ $number -gt 1 ]; do
      number2=$[number - 1]
      DATE2=$(date +%Y%m%d-%H:%m:%S)
      echo "# $DATE2 : mv /$1/$3/${2}_Rotate/inc.${number2} /$1/$3/${2}_Rotate/inc.${number}"
      /bin/mv /$1/$3/${2}_Rotate/inc.${number2} /$1/$3/${2}_Rotate/inc.${number} 2>/dev/null
      sleep 1
      number=$[number - 1]
    done

    #inc.1
    if [ -d /$1/$3/${2}_Rotate/inc.1 ]; then
      /bin/rm -rf /$1/$3/${2}_Rotate/inc.1
      echo ""
      echo "$date on /$1/$3/${2}_Rotate/inc.1 Directory Created!"
      echo ""
    fi

    #Real DATA inc Copying Link
    if [ -d /$1/$3/$2 ]; then
      /bin/mkdir -p /$1/$3/${2}_Rotate/inc.1/$2
      /bin/cp -al /$1/$3/$2/* /$1/$3/${2}_Rotate/inc.1/$2/
    fi

    #AFTER DAYS DELETE
    /bin/rm -rf /$1/$3/${2}_Rotate/inc.99

  fi

fi

DBMS 백업

DB 백업의 경우 위의 구성도와 같이 외부의 NFS 볼륨을 마운트한 후 진행한다.

# df -h /BACKUP
Filesystem                     Size  Used Avail Use% Mounted on
172.24.0.135:/PDS/BACKUP/DBMS  1.5T  1.3T  258G  83% /BACKUP

다음과 같이 mariabackup 명령을 사용하여, 전체/증분백업을 수행한다.

#!/bin/bash
# Description: MariaDB Full/Inc Backup Script
# Author: juhanida21@nate.com

date=`date +"%Y-%m-%d"`
service="HONGSNET"
dst="/BACKUP/$service/FULL"
incdir="/BACKUP/$service/INC"
xbk="/usr/bin/mariabackup"
user="root"
password="패스워드"
slave="no" # yes | no
inc=5

mkdir -p $dst || exit 1
mkdir -p $incdir || exit 1

ulimit -Sn 65535
ulimit -Hn 65535

############ FULL ############
if [ ! -d $dst/0 ]; then
    #최초 백업이라면..
    if [[ $slave == "yes" ]]; then
            $xbk --backup --slave-info --target-dir ${dst}/0 --user ${user} --password ${password}
    else
            $xbk --backup --no-lock --target-dir ${dst}/0 --user ${user} --password ${password}
    fi

else

    #증분백업의 전체백업본을 생성한다. 이 과정은 향후 증분백업 시 필요하기 때문이다.
    if [ ! -d $incdir/0 ]; then
        if [[ $slave == "yes" ]]; then
            $xbk --backup --slave-info --target-dir ${incdir}/0 --user ${user} --password ${password}
        else
            $xbk --backup --no-lock --target-dir ${incdir}/0 --user ${user} --password ${password}
        fi
    fi

    #최초 백업이 완료되었고, 증분을 수행해야할 경우
    if [[ $slave == "yes" ]]; then
        $xbk --backup --slave-info --target-dir ${dst}/1 --incremental-basedir ${dst}/0 --user ${user} --password ${password}
        if [[ -d ${incdir}/$date ]]; then
                rm -rf ${incdir}/$date
        else
                cp -rf ${dst}/1 ${incdir}/$date
        fi
    else
        $xbk --backup --no-lock --target-dir ${dst}/1 --incremental-basedir ${dst}/0 --user ${user} --password ${password}
        if [[ -d ${incdir}/$date ]]; then
                rm -rf ${incdir}/$date
        else
                cp -rf ${dst}/1 ${incdir}/$date
        fi
    fi

    #매일 백업된 전체백업의 준비를 한다. 만약 이 과정을 무시하면, 다음의 에러가 발생된다.
    #error: applying incremental backup needs a prepared target.
    $xbk --prepare --target-dir ${dst}/0

    #위의 준비가 완료되었으면, 실제로 매일 백업된 증분백업을 전체백업으로 합친다.
    $xbk --prepare --target-dir ${dst}/0 --incremental-dir ${dst}/1 --user ${user} --password ${password}
    #이 과정은 전체백업에 대한 부분이므로, 증분백업된 내역은 제거한다.
    rm -rf ${dst}/1
fi

find $incdir/ -ctime +${inc} -exec rm -rf {} \;

위의 스크립트의 핵심내역은 전체백업을 먼저 진행한 후 백업된 전체 본을 증분(--incremental-basedir)한다.

만약 Slave Replication 서버에 대한 백업을 수행하려면, 변수 slave="yes" 로 한다. 참고적으로 그 이유는 mariabackup 시 Slave 정보가 필요하기 때문이다.

다음은 전체백업본에 대한 현황이다.

# ls -al /BACKUP/HONGSNET/
합계 0
drwxr-xr-x 4 root root  29 10월 12  2021 .
drwxr-xr-x 4 root root  45  3월  4 03:50 ..
drwxr-xr-x 3 root root  15  3월  4 01:11 FULL
drwxr-xr-x 9 root root 123  3월  4 01:11 INC

또한 증분백업본은 다음과 같다.

# ls -al /BACKUP/HONGSNET/INC/
합계 28
drwxr-xr-x  9 root root  123  3월  4 01:11 .
drwxr-xr-x  4 root root   29 10월 12  2021 ..
drwx------ 20 root root 4096  2월 28 01:09 0
drwx------ 20 root root 4096  2월 27 01:08 2023-02-27
drwx------ 20 root root 4096  2월 28 01:15 2023-02-28
drwx------ 20 root root 4096  3월  1 01:07 2023-03-01
drwx------ 20 root root 4096  3월  2 01:07 2023-03-02
drwx------ 20 root root 4096  3월  3 01:06 2023-03-03
drwx------ 20 root root 4096  3월  4 01:07 2023-03-04