Rsnapshot — инкрементальное резервное копирование

Полный бэкап с помощью tar и gunzip имеет смысл, когда вы делаете одну единственную резервную копию. Например сдаёте проект заказчику и записываете файлы на болванку, которую торжественно убираете в сейф.

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

Поэтому, например, десять бэкапов будут весить как два. И если вам потребуется оперативно достать файлик из бэкапа — не нужно ничего распаковывать. В этом суть и польза инкрементального бэкапа.

Сам процесс заключается в копировании новых файлов и привязки не изменившихся файлов жёсткими ссылками (hard links).

Занимается этим rsync, о удобной надстройке над этой утилитой — rsnapshot читайте далее.

Установка #

sudo apt-get install rsnapshot
sudo pacman -S rsnapshot

Файл лога:

sudo touch /var/log/rsnapshot

Настройка #

Все настройки хранятся в /etc/rsnapshot.conf.

Внимание, редактируя этот файл не используйте пробелы, только символы табуляции.

sudoedit /etc/rsnapshot.conf

Измените папку, куда будут сохраняться бэкапы:

snapshot_root   /storage/backup/snapshots/

Раскомментируйте cp:

cmd_cp      /usr/bin/cp

Задайте количество хранимых бэкапов:

retain  hourly  6
retain  daily   7
retain  weekly  4
retain  monthly 12

Включите логирование в файл:

logfile /var/log/rsnapshot

Исключите из бэкапа нежелательные расширения и директории:

exclude *.tmp
exclude /var/cache
exclude /var/tmp

exclude /home/*/.thumbnails
exclude /home/*/.cache
exclude /home/*/.gvfs

Теперь можно задать папки для бэкапа, синтаксис:

backup  /home/  localhost/

Вместо безликой папки localhost советую использовать имя хоста. Эта папка будет создана внутри snapshot_root.

Например:

backup  /code/          laundry/
backup  /home/          laundry/
backup  /etc/           laundry/
backup  /usr/local/     laundry/
backup  /var/log/rsnapshot  laundry/

Проверка #

Проверьте конфиг на отсутствие ошибок:

sudo rsnapshot configtest

Если тест ругается на пробелы, то можно автоматически заменить их на табы используя эту команду:

sudo sed -i '/^#/!s/ /\t/g' /etc/rsnapshot.conf

Убедитесь, что на диске есть свободное место утилитами df -h или ncdu. И запускайте создание почасового снимка вручную:

sudo rsnapshot hourly

Посмотрите сколько он занимает места:

sudo rsnapshot du

В будущем, когда появится несколько бекапов, вы сможете сравнивать их этой командой:

rsnapshot diff hourly.0 hourly.1

Автоматизация #

Теперь осталось только настроить cron:

sudo crontab -e

Для сервера оптимально делать ночью:

00 */4 * * * rsnapshot hourly
45 3   * * * rsnapshot daily
15 4   * * 1 rsnapshot weekly
30 4   1 * * rsnapshot monthly

Для десктопа, который на ночь выключается, сдвигаем бэкапы на вечер:

00 */4  * * * rsnapshot hourly
45 21   * * * rsnapshot daily
15 22   * * 1 rsnapshot weekly
30 22   1 * * rsnapshot monthly

И не забывайте периодически проверять их кондиционность. Они могут сломаться по тысяче причин и вы останетесь у разбитого корыта.

Оптимизация #

Производительность #

Как уже было написано выше для бекапов используется rsync, поэтому чтобы оптимизировать использование ресурсов добавьте эту строчку в /etc/default/rsync:

RSYNC_NICE='10'

Это позволит запускать процесс копирования с малым приоритетом, иначе во время копирования на несколько минут будет сильно проседать производительность системы.

Чистка бэкапов от мусора #

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

sudo ncdu /storage/backup/

Тут уже всё зависит от конкретной системы. Например на своём десктопе я дополнил блок исключений так:

exclude *.tmp

exclude /home/*/.thumbnails
exclude /home/*/.cache
exclude /home/*/.gvfs

exclude /home/*/.mozilla/firefox/*/Cache/
exclude /home/*/.rvm

Не забудьте проверить синтаксис и результат:

sudo rsnapshot configtest
sudo rsnapshot hourly
sudo ncdu /storage/backup/

Комментарии

Андрей

Благодарю!
П.С. cmd_cp /bin/cp обычно раскомментирован.

Степан

Отличная статья! Все что нужно, к тому же интерфейс и оформление сайта приятны глазу)

Tutanhamon

Полезная статья. Вообще, видов резервного копирования достаточно много. И к ним относятся не только инкрементальные и дифференциальные. Например, в статье по адресу http://ida-freewares.ru/terminologiya-rezervnogo-kopirovaniya-chto-oznachaet-inkrementalnyj-i-differentsialnyj-i-zachem-oni-nuzhny.html приводится еще ряд интересных видов. К примеру, резервное копирование на основе жестких ссылок, поддерживаемых в системе, позволяет достаточно неплохо сэкономить на свободном месте диска, хотя и имеет ряд особенностей, как необходимость аккуратно следить за изменениями данных в местах, где хранятся бэкапы.

l0ki

Команда замены пробелов на табы делает ровно противоположное.
Даже если развернуть аргументы, страшно подумать, во что превратятся комменты в конфиге.

ksevelyar

Ага, поправил регулярку, теперь она меняет пробелы на табы как и должна, и не трогает комментарии.

D

файлы с одинаковым размером не сохраняются. лишь файлы "первой версии".

Алексей

Спасибо за статью!

А как настроить все это на удаленный сервер, который выступает в качестве backup server?

Добавить комментарий