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/

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *