Резервное копирование корпоративного файлового хранилища

Ноя 8th, 2013 | Posted by | Filed under Debian, Linux, PC, Software

Резервное копирование сделано таким образом, что все директории подразделений сжимаются в свои .7z архивы с непрерывным сжатием в режиме добавления инкрементальных бэкапов. При этом, даже имея дубликаты файлов в разных директориях, результирующий архив не увеличивается существенно, а если бОльшая часть файлов в директории неизменна, а меняется или добавляется только небольшая часть, инкрементальное приращение архива имеет не существенный размер. Внутри архива информация представлена в виде директорий, содержащих даты, время бэкапов и имя резервируемых директорий отделов.

Настройка скрипта резервного копирования.

$base — базовый путь к директориям отделов;
$bk_to — путь к месту хранения бэкапов;
$path — путь к месту хранения скрипта (рекомендуется хранить и бэкапить скрипт аналогично директориям отделов);
$excl_file — файл с масками исключений, которые считаются неважными и резервироваться в архивы не будут ;
$excl_path — фрагмент bash-скрипта, описывающий исключаемые из архивирования директории одного уровня с директориями отделов (в данном случае — файлопомойка common, директория с бэкапами и tmp-диск;
$tmp_path — временная рабочая директория скрипта (надо создать её).
В данной настройке скрипт делает бэкап всех директорий отделов, расположенных в /shares/user кроме common, bk и disk_t в файлы {ИМЯ_ДИРЕКТОРИИ_ОТДЕЛА}.7z. Внутри архива будут директории с именами в формате ГГГГ-ММ-ДД-ЧЧ-ММ-СС-ИМЯ_ДИРЕКТОРИИ_ОТДЕЛА, где ГГГГ-ММ-ДД-ЧЧ-ММ-СС — время начала создания архива.
Скрипт имеет защиту от повторного запуска (по расписанию), если предыдущая копия ещё не отработала.
Чтобы архивирование не пожирало 100% ресурсов процессора, приоритет запуска архиватора снижен до +17.

/shares/user/backup/backup.pl:

#!/usr/bin/perl
if (`ps ax|grep 7z|grep -v grep` eq ""){
$base="/shares/user";
$bk_to="$base/bk";
$path="/shares/user/backup";
$excl_file="$path/exclude.ext";
$excl_path="|grep -v common|grep -v bk|grep -v disk_t";
$tmp_path="$path/bk";
# Отмонтируем директории, если остались примонтированные при падении/прерывании предыдущих архиваций
$a=`ls $tmp_path/`;
@b=split /\n/,$a;
foreach $name(@b){
`umount -f $tmp_path/$name`;
`rmdir $tmp_path/$name`;
}
# Читаем список архивируемых директорий
$a=`ls $base/$excl_path`;
@b=split /\n/,$a;
foreach $name(@b){
# Читаем текущую дату
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
$year+=1900;
$min="0".$min if $min<10;
$hour="0".$hour if $hour<10;
$mday="0".$mday if $mday<10;
$mon="0".$mon if $mon<10;
$current="$year-$mon-$mday-$hour-$min";
print "\nСегодня $current\n";
$newname="$current-$name";
`mkdir $tmp_path/$newname`;
`mount -o bind $base/$name $tmp_path/$newname`;
`rm -f $bk_to/*.tmp`;
print "Делается архив: $name\n";
`nice --adjustment=17 7z a $bk_to/$name.7z -ms=on -ssc -mx=5 -w$bk_to/ -y -x\@$excl_file $tmp_path/*>$bk_to/$name.log`;
`umount -f $tmp_path/$newname`;
`rmdir $tmp_path/$newname`;
}
}

Замечания, комментарии?

No comments yet.