18 июня 2015

Полный бэкап Zabbix сервера



В среднего размера сети база данных сервера мониторинга имеет большой объем и бэкап средствами mysqldump не годится из-за очень длительного процесса восстановления(счет может идти на сутки). Есть способ простой и быстрый.



Percona Xtrabackup — "Программный продукт с открытым исходным кодом, позволяющий делать резервные копии баз данных MySQL без блокировки. Open Query, mozilla.org и Facebook используют данный продукт...". Звучит не плохо и работает хорошо. На момент копирования БД я всеже останавливаю zabbix. Иначе может возникнуть ситуация что персона не будет успевать считать данные записываемые заббиксом.

Я создал файл, запускаемый раз в сутки кроном-
/home/zabbix/scripts/zb-backup.sh

#!/bin/bash
DAY=`date +%m%d`
LOGFILE=/var/log/zabbix_backup.log
EMAIL=smart-bit@com.com
MAILFILE=/tmp/mailfile.tmp
BK_GLOBAL=/home/zabbix/backups
BK_DIR=$BK_GLOBAL/$DAY
MYSQLCNF=/etc/mysql/my.cnf
set_date ()
{
DT=`date "+%y%m%d %H:%M:%S"`
}
#
mkdir $BK_DIR
set_date
echo -e "$DT Start ZABBIX DB backuping" > $MAILFILE
service zabbix-server stop >> $MAILFILE
innobackupex
 --defaults-file=$MYSQLCNF --user=root --password=zabbix --no-timestamp 
$BK_DIR/xtra 2>&1 | tee /var/log/innobackupex.lo
g | egrep "ERROR|innobackupex: completed OK" >>$MAILFILE
innobackupex
 --apply-log --use-memory=1000M $BK_DIR/xtra 2>&1 | tee 
/var/log/innobackupex.log | egrep "ERROR|innobackupex: completed
OK" >>$MAILFILE
service zabbix-server start >> $MAILFILE
set_date
echo -e "$DT DB backuping done" >> $MAILFILE
set_date
echo -e "$DT Start archiving" >> $MAILFILE
cd $BK_DIR
tar -cf $BK_DIR/zabbix_db_$DAY.tar ./xtra 2>>$MAILFILE
rm -rf $BK_DIR/xtra
cd /usr/share
tar -cf $BK_DIR/zabbix_files_$DAY.tar ./zabbix 2>>$MAILFILE
cd /etc
tar -cf $BK_DIR/zabbix_etc_$DAY.tar ./zabbix 2>>$MAILFILE
cd /
gzip $BK_DIR/zabbix_db_$DAY.tar 2>>$MAILFILE
gzip $BK_DIR/zabbix_files_$DAY.tar 2>>$MAILFILE
gzip $BK_DIR/zabbix_etc_$DAY.tar 2>>$MAILFILE
set_date
echo -e "$DT Archiving done" >> $MAILFILE
rm -f zabbix_db_$DAY.tar
rm -f zabbix_files_$DAY.tar
rm -f zabbix_etc_$DAY.tar
set_date
echo -e "$DT Start copyning to zb2 (10.77.12.3) server" >> $MAILFILE
ssh smart-bit@zb2 'mkdir /home/zabbix/backups/'$DAY
scp $BK_DIR/zabbix_db_$DAY.tar.gz smart-bit@zb2:/home/zabbix/backups/$DAY 2>>$MAILFILE
scp $BK_DIR/zabbix_files_$DAY.tar.gz smart-bit@zb2:/home/zabbix/backups/$DAY 2>>$MAILFILE
scp $BK_DIR/zabbix_etc_$DAY.tar.gz smart-bit@zb2:/home/zabbix/backups/$DAY 2>>$MAILFILE
set_date
echo -e "$DT Copyning to zb2 (10.77.12.3) server done" >> $MAILFILE
set_date
echo -e "$DT Deleting old archive" >> $MAILFILE
find $BK_GLOBAL/* -type f -ctime +1 -exec rm -rf {} \; 2>>$MAILFILE
ssh smart-bit@zb2 'find /home/zabbix/backups/* -type f -ctime +7 -exec rm -rf {} \;' 2>>$MAILFILE
find $BK_GLOBAL/* -type d -name "*" -empty -delete 2>>$MAILFILE
ssh smart-bit@zb2 'find /home/zabbix/backups/* -type d -name "*" -empty -delete' 2>>$MAILFILE
set_date
echo -e "$DT Deleting old archive done" >> $MAILFILE
set_date
cat $MAILFILE >> $LOGFILE
echo -e "\nWe have on $BK_DIR:\n" >> $MAILFILE
ls -lh $BK_DIR >> $MAILFILE
echo -e "\nHDD usage:\n" >> $MAILFILE
df -h >> $MAILFILE
mail -aFrom:zabbix1@com.com -s "Zabbix backup log $DAY" $EMAIL < $MAILFILE

Скрипт, кроме самой базы, архивирует файлы заббикса. Копирует эти архивы на резервный сервер, удаляет старые вырсии бэкапов и отправляет отчет о проделанной работе на почту. На резервном сервере я сделал скрипт позволяющий за несколько минут развернуть нужную копию бэкапа. БД в 4ГБ разворачивается в течении 5 минут. Неплохо, да?
В качестве параметра скрипту можно указать требуемый бэкап для восстановления в формате ММДД. Например zb-restore.sh 1231

/home/zabbix/scripts/zb-restore.sh
#!/bin/bash
MAILFILE=/tmp/mailfile.tmp
if [ "x$1" = "x" ] ; then
DAY=`date +%m%d`
echo -e "Start ZABBIX2 restoring to TODAY backup" > $MAILFILE
else
DAY=$1
echo -e "Start ZABBIX2 restoring to $DAY backup" > $MAILFILE
fi
LOGFILE=/var/log/zabbix_restore.log
EMAIL=smart-bit@com.com
BK_GLOBAL=/home/zabbix/backups
BK_DIR=$BK_GLOBAL/$DAY
set_date ()
{
DT=`date "+%y%m%d %H:%M:%S"`
}
#
cd $BK_DIR
file_db="zabbix_db_$DAY.tar.gz"
if [ -e $file_db ]; then
set_date
echo -e "$DT Start ZABBIX DB restoring" >> $MAILFILE
service zabbix-server stop >> $MAILFILE
service mysql stop >> $MAILFILE
rm -R /var/lib/mysqlcrashed
tar xvfz $file_db
mv /var/lib/mysql /var/lib/mysqlcrashed
mv xtra /var/lib/mysql
chown -R mysql:mysql /var/lib/mysql
service mysql start >> $MAILFILE
set_date
echo -e "$DT DB restoring done" >> $MAILFILE
else
echo "File with backup DB does not exists. DB IS NOT RESTORED!" >> $MAILFILE
fi
file_files="zabbix_files_$DAY.tar.gz"
if [ -e $file_files ]; then
set_date
echo -e "$DT Start files restoring" >> $MAILFILE
tar xvfz $file_files
cp -aR zabbix/* /usr/share/zabbix && rm -r zabbix/* && rmdir zabbix
set_date
echo -e "$DT files restoring done" >> $MAILFILE
else
echo "Files does not exists. ZABBIX FILES IS NOT RESTORED!" >> $MAILFILE
fi
file_etc="zabbix_etc_$DAY.tar.gz"
if [ -e $file_etc ]; then
set_date
echo -e "$DT Start /etc/zabbix restoring" >> $MAILFILE
tar xvfz $file_etc
cp -aR zabbix/* /etc/zabbix && rm -r zabbix/* && rmdir zabbix
echo -e "$DT etc restoring done" >> $MAILFILE
service zabbix-server start >> $MAILFILE
else
echo "Files etc does not exists. FILES IS NOT RESTORED!" >> $MAILFILE
fi

set_date
cat $MAILFILE >> $LOGFILE
mail -aFrom:zabbix2@com.com -s "Zabbix2 restoring log $DAY" $EMAIL < $MAILFILE

После восстановления файлов базы и файлов заббикса, скрипт также отправляет отчет по почте.