2012-08-19

Простой скрипт для резервного копирования

Все знают, что данные резервировать - вещь плезная и нужная, вот только мало кто всерьёз озадачивается этой проблемой до тех пор пока сохранность данных не оказывается под угрозой, но, вот только, как правило бекапить оказывается уже нечего.

На рынке, сейчас огромное количество решений для резервного копирования, но при небольшом количестве данных, вполне можно обойтись, тем софтом, который есть в любом linux дистрибутиве.

Вот типовая задача резервного копирования. Резервировать нужно компьютеры под управлением Windows и Linux. Бекап должен делаться ежеденевно на жёсткий диск одной из рабочих станций. При этом, сперва должен делаться полный бекап, потом, в течении, скажем, двух недель, каждый день, должен делаться инкрементальный бекап. Все файлы должны сохраняться в папку для бекапов. Через определённый временной интервал файлы нужно заливать на DVD-R болванки и класть в долгий ящик. При этом, файлы должны зиповаться, чтобы занимать меньше места и чтобы можно было восстанавливать файлы не пользуясь сторонним софтом. Софт должен быть с открытым исходным кодом и работать на всех вышеназванных платформах.

В качестве возможного софта я рассматривал несколько вариантов. Bacula. Первоначально это то, что я планировал использовать - мощная и гибкая система. Единственное, что меня смущало, это формат хранения данных. Индекс храниться в MySQL базе данных и если что случится с сервером то нужно будет сначала восстанавливать базу данных а потом бекапы. Другое свойство этой программы, которое мне совершенно не понравилось - это хранение резервных копий в файлах фиксированного размера. Изначально, Bacula заточена под магнитную ленту но, что хорошо для ленты то дико неудобно для файлов. Кроме этого, восстановление файлов оказалось делом довольно долгим так как делалось через специальную консольную программу с неудобным синтаксисом. Как вытащить файл из архива в случае если сервера под рукой нет для меня так и осталось загадкой.

Backuppc наверно, замечательная штука, но мне так и не удалось его корректно настроить, так как, для его работы нужен был определенный модуль perl, который мне так и не удалось поставить на один из копьютеров, поэтому от использования также пришлось отказаться.

Хотелось, что-то простого, что не требует монструозной настройки. Оказалось, что для решения данной задачи подойдет обычный rsync в сочетании с tar.

Основным вопросом при этом было как организовать инкрементный бекап. Rsync прекрасно прекрасно умеет создавать  дифференциальные бекапы - т.е. разницу между двумя полными бекапами, но про инкрементальные бекапы в интернете я почти ничего не нашёл.

Но решение оказалось оказалось очень простым, ведь инкрементный бекап - это не что иное, как дифференциальный бекап относительно последнего бекапа. Поэтому, чтобы сделать архив содержащий изменные файлы после последнего полного или дифференциального бекапа достаточно просто сделать полный бекап а затем сравнить два последних бекапа и разница как раз и будет инкрементным бекапом. Но хранить полные бекапы за каждый день очень накладно, ведь каждая копия будет занимать много места. К счастью, хранить копии отдельно не обязательно - ведь rsync умеет использовать жесткие ссылки на одинаковые файлы. В том случе если файл не изменен то будет использована не копия а ссылка на файл, таким образом архив из n полных копий размером m будет в случае неизменных файлов будет занимать не n*m а всего лишь 1*m.

В результате получился вот такой скрипт.

Скрипт запускается через cron каждый день в определенноё время, когда компьютер простаивает, копирует данные в папку для резервного копирования и зипует её в именем кодирующим текущую дату и тип архива - полный или дифференциальный. Rsync умеет делать копии с нескольких серверов по ssh, что очень удобно. При этом для востановления достаточно распаковать сначала полный архив, затем последовательно накотить поверх все дифференциальные бекапы.

Скрипт не умеет отлеживать удаленные файлы, но задача резервного копирования, прежде всего, это - недопустить пропажи информации, поэтому задачи отслеживать удаление файлов у меня не стояло.

Таким образом, в системе сохраняется полная резервная копия за последние n дней, при этом места эти копии, благодаря использованию жёстких ссылок, занимают как одна копия. На компьютере с windows rsync, также, легко запускается для этого нужно поставить cygwin.

 

Оставить комментарий

 
  2010-03-30

Как удалить все пустые директории

Делаю инкрементальный бекап в ходе которого rsync выдает множество пустых папочек - мне пустые папочки не интересны - их нужно как то удалить. В bash это можно сделать следуюшим образом:

find . -type d | tac | xargs rmdir 2> /dev/null
 

Оставить комментарий