Резервное копирование при помощи rdiff-backup






Способов резервного копирования файлов несчётное количество, как, впрочем. и инструментов для его осуществления. Сегодняшней заметкой я хочу обратить ваше внимание на довольно популярную утилиту инкрементного копирования под названием rdiff-backup.




rdiff-backup — приложение написанное на Python, обладает большой гибкостью и довольно простое в обращении. Может работать как локально, так и поверх rsync/ssh, предоставляя возможность оптимально использовать каналы передачи данных в случае удалённых бекапов. Среди основных плюшек rdiff-backup можно выделить следующие возможности.

  • Инкрементное копирование, позволяющее восстановить любой файл, удалённый до последней операции бэкапа. То есть, вы можете восстановить файл, который был удалён хоть год назад, при том что резервное копирование у вас выполняется, скажем, два раза в день.
  • Сохранение всей информации о файлах. Восстанавливая файл из архива rdiff-backup, вы получите его в таком виде, в каком он был на момент занесения в архив, включая таймштампы, права доступа, владельцев и т. п. Помимо всего прочего, rdiff-backup корректно управляется с жёсткими и символическими ссылками, файлами устройств и FIFO. При этом утилита корректно будет вести себя в различных операционных системах, использующих разные типы файловых систем.
  • Эффективное использование дискового пространства. Используя алгоритм rsync, утилита rdiff-backup сохраняет только изменения файлов, а не все файлы целиком. То есть, ваша БД весом в пару десятков гигабайт не будет каждый раз копироваться целиком, съедая пространство на диске. Будут копироваться только изменения.
  • Эффективное использование каналов передачи данных в случае сетевых бэкапов само-собой вытекает из предыдущего пункта.
  • «Прозрачное» хранение данных. rdiff-backup хранит бэкапы в точно таком же виде, в каком файлы находились на диске, не прибегая ни к каким хитроумным форматам. То есть, например, если вам понадобиться восстановить последний бэкап, не используя при этом rdiff-backup, вы сможете просто скопировать нужные файлы обратно на место.
  • Автоматическое определение типов файловых систем позволяет утилите избавить вас от полного понимания всех тонкостей её настройки в зависимости от типа используемых ФС и ОС.

Установка

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

Локальное резервное копирование

Под «локальным» или «удалённым» здесь и далее понимается получатель резервной копии. Сперва давайте рассмотрим самый простой способ запуска утилиты:

Эта команда, как понятно из описания, выполнит резервное копирование из <источник> в <получатель>.  Обратите внимание, что в качестве получателя необходимо указывать либо пустой, либо несуществующий каталог, иначе rdiff-backup вежливо вам откажет, что правильно.

В режиме по умолчанию rdiff-backup довольно молчалива, и не надоедает диагностическими сообщениями до тех пор, пока не столкнётся с ошибкой. Регулировать разговорчивость утилиты можно при помощи короткой опции '-v' или её длинного аналога '--verbosity'. Значение опции может принимать значения от 0 до 9 (по умолчанию оно равно 3). Например, уровень 4 перед началом процедуры копирования выведет вам сводку опций работы утилиты:

В то время как девятый уровень будет сообщать о каждом шаге:

Удалённое резервное копирование

Этот тип копирования выполнить настолько же просто, как и локальное. Всё, что меняется — это формат указания источника/получателя. Также на удалённой системе должна быть установлена rdiff-backup и работать SSH-сервер. Например следующая команда:

  1. установит соединение с сервером my-server.com при помощи SSH;
  2. запустит на сервере rdiff-backup в режиме --server;
  3. выполнит передачу файлов с локальной системы серверу my-server.com в каталог /var/backups/log.host123

То же самое будет работать и в обратном направлении, т. е., если вам необходимо выполнить копирование удалённых файлов в локальную систему, просто поменяйте местами источник с получателем в опциях утилиты:

Получение информации о результатах копирования

Обычно многословный вывод команд требуется в период отладки и написания сценариев, не более. Для ежедневного мониторинга результатов работы утилиты желательно иметь лишь краткую сводку. Для этого rdiff-backup предлагает отдельную опцию '--print-statistics':

Включение исключение файлов

«Не все йогурты одинаково полезны» — гласит народная пословица. Это же касается и файлов при резервном копировании. Часто-густо в копируемых каталогах попадаются файлы, размер которых весьма немаленький, а смысла включать их в бэкап нет. Здесь у rdiff-backup (как, впрочем и у всех остальных утилит подобного рода) предусмотрены свои возможности. Используя опцию '--exlude', вы можете исключать отдельные файлы и каталоги:

Эту опцию можно использовать сколько угодно раз:

Иногда проще указать то, что нужно скопировать, вместо того, что НЕ нужно. Следующая команда скопирует, например, /usr/local/bin, пропустив при этом /usr/bin:

Обратите внимание, что при множественном использовании опций '--include' / '--exclude' их приоритет зависит от порядка появления в команде.

rdiff-backup позволяет использовать шаблоны подобные тем, которые используются в rsync: '**' эквивалентны любому пути, а '*' — любому пути без завершающего слеша. Так, например, следующая команда скопирует /usr/local и /var, но пропустит всё остальное:

Обратите внимание на кавычки. Они нужны, поскольку большинство оболочек обрабатывают звёздочки как спецсимволы, превращая их в маски.

Пример чуть посложнее:

Эта команда скопирует все файлы, имена которых заканчиваются суффиксом 'txt'. Обратите внимание: будут скопированы также все txt-файлы также из каталогов, /usr/local и /backup, поскольку первый --include имеет более высокий приоритет.

Вообще, утилита rdif--backup предлагает довольно богатый набор опция для фильтрации файлов, перечислять который в полном объёме нет смысла, поскольку всё «уже украдено до нас» в man-странице приложения. Тем, кто ещё туда не заглядывал, скажу что вы можете фильтровать файлы на основе регулярных выражений, типе самих файлов (символически/жесткие ссылки, сокеты, устройства, FIFO и т. п.), а также на основе файловых списков включений/исключений, при чём сами файловые списки можно передавать через stdin.




Резервное копирование при помощи rdiff-backup: 3 комментария

  1. испытал ее на локальной машине. Понравилось. Решил использовать на серверах (с одного на другой сохранять пару каталогов, объемом ~12 G).

    1-й раз команда отрабатывала долго (минут 10). Ну это нормально

    2-й раз дал ту же команду (на 1-м сервере ничего не менялось) — процесс завис на 5 мин. (я просто прервал его). Это НЕНОРМАЛЬНО — rsync отрабатывает в этой ситуации менее, чем за 1с.

    1. konst, у меня бэкапы делаются по ночам в автоматическом режиме. Честно говоря, не смотрел сколько времени это занимает, поскольку ночью я обычно никуда не тороплюсь ;)

  2. прежде чем запускать все по крону - я тестирую в реале (из командной строки) :).

    прочитав у Вас про rdiff-backup - решил воспользоваться. Давно назревало - /etc/ и еще кое-какой каталог следовало сохранять. Но 2 последовательных запуска rdiff-backup (без ключей) меня удивили своим долговремением.

    Т.к. все уже было готово (ssh по ключам) - воспользовался rsync - все (кроме конечно 1-го запуска) отработало влет.

    Т.е. : м.б. «гибкость» rdiff-backup — это хорошо, но что-то там недоработано

Комментарии запрещены.