Резервное копирование при помощи 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 вежливо вам откажет, что правильно.

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

$ rdiff-backup -v 4 /var/log ~/log.backup
Using rdiff-backup version 1.2.8
Unable to import win32security module. Windows ACLs
not supported by filesystem at /var/log
escape_dos_devices not required by filesystem at /var/log
-----------------------------------------------------------------
Detected abilities for source (read only) file system:
  Access control lists                         On
  Extended attributes                          On
  Windows access control lists                 Off
  Case sensitivity                             On
  Escape DOS devices                           Off
  Escape trailing spaces                       Off
  Mac OS X style resource forks                Off
  Mac OS X Finder information                  Off
-----------------------------------------------------------------
Unable to import win32security module. Windows ACLs
not supported by filesystem at log.backup/rdiff-backup-data/rdiff-backup.tmp.0
escape_dos_devices not required by filesystem at log.backup/rdiff-backup-data/rdiff-backup.tmp.0
-----------------------------------------------------------------
Detected abilities for destination (read/write) file system:
  Ownership changing                           On
  Hard linking                                 On
  fsync() directories                          On
  Directory inc permissions                    On
  High-bit permissions                         On
  Symlink permissions                          Off
  Extended filenames                           On
  Windows reserved filenames                   Off
  Access control lists                         On
  Extended attributes                          On
  Windows access control lists                 Off
  Case sensitivity                             On
  Escape DOS devices                           Off
  Escape trailing spaces                       Off
  Mac OS X style resource forks                Off
  Mac OS X Finder information                  Off
-----------------------------------------------------------------
Backup: must_escape_dos_devices = 0
Starting mirror /var/log to log.backup

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

$ rdiff-backup -v 9 /var/log ~/log.backup
...
Tue Mar  6 04:50:07 2012  Processing changed file wtmp.1
Tue Mar  6 04:50:07 2012  Regular copying ('wtmp.1',) to log.backup/rdiff-backup.tmp.121
Tue Mar  6 04:50:07 2012  Writing file object to log.backup/rdiff-backup.tmp.121
Tue Mar  6 04:50:07 2012  Copying attributes from ('wtmp.1',) to log.backup/rdiff-backup.tmp.121
Tue Mar  6 04:50:07 2012  Setting time of log.backup/rdiff-backup.tmp.121 to 1330553626
Tue Mar  6 04:50:07 2012  Renaming log.backup/rdiff-backup.tmp.121 to log.backup/wtmp.1
Tue Mar  6 04:50:07 2012  Copying attributes from () to log.backup
Tue Mar  6 04:50:07 2012  Setting time of log.backup to 1330980760
Tue Mar  6 04:50:07 2012  Touching log.backup/rdiff-backup-data/extended_attributes.2012-03-06T04:50:07+02:00.snapshot
Tue Mar  6 04:50:07 2012  Touching log.backup/rdiff-backup-data/access_control_lists.2012-03-06T04:50:07+02:00.snapshot
Tue Mar  6 04:50:08 2012  Writing mirror marker log.backup/rdiff-backup-data/current_mirror.2012-03-06T04:50:07+02:00.data
Tue Mar  6 04:50:08 2012  Cleaning up
Tue Mar  6 04:50:08 2012  Touching log.backup/rdiff-backup-data/error_log.2012-03-06T04:50:07+02:00.data
...

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

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

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

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

$ rdiff-backup -v 5 backup@my-server.com::/var/log /var/backups/logs-my-server.com

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

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

$ rdiff-backup --print-statistics /var/log ~/log.backup
Warning: Access Control List file not found
--------------[ Session statistics ]--------------
StartTime 1331003360.00 (Tue Mar  6 05:09:20 2012)
EndTime 1331003385.71 (Tue Mar  6 05:09:45 2012)
ElapsedTime 25.71 (25.71 seconds)
SourceFiles 139
SourceFileSize 7006201 (6.68 MB)
MirrorFiles 339
MirrorFileSize 16991862 (16.2 MB)
NewFiles 65
NewFileSize 1504824 (1.44 MB)
DeletedFiles 265
DeletedFileSize 12116918 (11.6 MB)
ChangedFiles 74
ChangedSourceSize 5501377 (5.25 MB)
ChangedMirrorSize 4874944 (4.65 MB)
IncrementFiles 404
IncrementFileSize 2136990 (2.04 MB)
TotalDestinationSizeChange -7848671 (-7.49 MB)
Errors 0
--------------------------------------------------

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

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

$ rdiff-backup --exclude /proc / backup@my-server.com::/var/backups

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

$ rdiff-backup --exclude /proc --exclude /mnt --exclude /tmp / backup@my-server.com::/var/backups

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

$ rdiff-backup --include /usr/local --exclude /usr / backup@my-server.com::/var/backups

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

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

$ rdiff-backup --include /usr/local --include /var --exclude '**' / /backup

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

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

$ rdiff-backup --include '**txt' --exclude /usr/local/games --include /usr/local --exclude /usr --exclude /backup --exclude /proc / /backup

Эта команда скопирует все файлы, имена которых заканчиваются суффиксом '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 — это хорошо, но что-то там недоработано

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