Overview
홍쓰넷의 백업은 System 설정과 DBMS 두 가지를 진행하고 있다.
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