Привет, хабровчане.
В последнее время на Хабре было несколько статей, иллюстрирующих различные способы бекапов данных. (Например, раз, два.)
Тема всегда актуальная и способов ее решения так же много, как и требований к такой системе, у каждого они свои. Есть много достойных сторонних продуктов, как платных так и бесплатных, но некоторые пытаются сделать что-то свое штатными или почти штатными средствами. Я отношусь к таким энтузиастам. Попробовав различные готовые решения, решил попытаться использовать то, что есть под руками.
Под руками оказался внешний винт на 500 Гб, протокол FTP и WinRAR. Также имеется небольшой офис с 6-ю ПК под управлением WinXP, данные с которых неплохо бы периодически сливать во внешнее хранилище.
Так как создание бекапов – моя личная инициатива и никто такую задачу передо мной не ставил, то требования я придумывал тоже сам исходя из здравого смысла и понимания того, что отдельный файловый сервер с RAID-винтами руководство не профинансирует.
На свою машину я поставил и настроил бесплатный FTP-сервер FileZilla Server.
Для периодичности задачи под виндой проще всего использовать Планировщик, который будет запускать на каждой клиентской машине батник, реализующий основные функции.
На каждой клиентской машине создана папка «backups_main», содержащая подпапку BackUpTemp для временного хранения бекапа перед заливкой по FTP и файлы-конфиги:
По заданному в Планировщике расписанию (для каждой машины – свой день недели) запускается backup.bat, который выглядит так:
В последнее время на Хабре было несколько статей, иллюстрирующих различные способы бекапов данных. (Например, раз, два.)
Тема всегда актуальная и способов ее решения так же много, как и требований к такой системе, у каждого они свои. Есть много достойных сторонних продуктов, как платных так и бесплатных, но некоторые пытаются сделать что-то свое штатными или почти штатными средствами. Я отношусь к таким энтузиастам. Попробовав различные готовые решения, решил попытаться использовать то, что есть под руками.
Под руками оказался внешний винт на 500 Гб, протокол FTP и WinRAR. Также имеется небольшой офис с 6-ю ПК под управлением WinXP, данные с которых неплохо бы периодически сливать во внешнее хранилище.
Так как создание бекапов – моя личная инициатива и никто такую задачу передо мной не ставил, то требования я придумывал тоже сам исходя из здравого смысла и понимания того, что отдельный файловый сервер с RAID-винтами руководство не профинансирует.
Система должна:
- Еженедельно бекапить определенные папки с каждой машины на мою, куда прикручен внешний винт.
- Уметь копировать открытые файлы.
- Уметь пропускать ненужные файлы или папки как по маске, так и явно заданные.
- Не выводить на экран клиентской машины никаких сообщений или окон (пользователи ПК у меня в компании не продвинутые, в возрасте, лишнее крики «А-а-а, что это у меня вылезло?» ни к чему).
- Иметь гибкую возможность настройки загрузки клиентской системы (дольше работаем, но медленнее <-> быстро, но ПК практически не отвечает). Связано требование с тем, что компы довольно старые и все разные.
- Иметь гибкую возможность настройки загрузки сети.
- Писать лог при наличии ошибок при создании бекапа.
- Дописывать к именам создаваемых бекапов текущую дату.
- Так как винт не бесконечный – через определенный период времени убивать старые бекапы.
- Быть по возможности простой, наглядной и легкой в настройке.
Реализация
На свою машину я поставил и настроил бесплатный FTP-сервер FileZilla Server.
Для периодичности задачи под виндой проще всего использовать Планировщик, который будет запускать на каждой клиентской машине батник, реализующий основные функции.
1. Формирование новых бекапов и их заливка
На каждой клиентской машине создана папка «backups_main», содержащая подпапку BackUpTemp для временного хранения бекапа перед заливкой по FTP и файлы-конфиги:
- backup.bat – реализует сам бекап на клиентской машине
- in_rar.txt – что включать в бекап
- except_rar.txt – что не включать в бекап
- ftp_param.txt – параметры FTP-соединения
- backup.log – создается сам при ошибках
По заданному в Планировщике расписанию (для каждой машины – свой день недели) запускается backup.bat, который выглядит так:
@echo off
rem Задача: заархивировать все файлы лежащие по пути, указанному в файле in_rar.txt, положить в подпапку BackUpTemp , за исключением файлов и или папок, маски или названия которых указаны в файле except_rar.txt. Приоритет процесса низкий, архивация фоновая, ошибки на экран не выводить, а писать в лог backup.log. Залить результат на FTP с параметрами, указанными в файле ftp_param.txt, временный архив удалить.
rem определим, где будут лежать все конфиги бекапа:
set place=F:\Install\backups_main
rem очистим папку хранения бекапов от прошлой копии, если она вдруг осталась:
IF EXIST %place%\BackUpTemp\*.rar del %place%\BackUpTemp\*.rar
rem настройки архиватора:
set a_opt=a -r -agDD-MM-YY -dh -esh -INUL -m0 -ri10:10 -Y -cfg- -ep2
rem - Команда A - добавить в архив
rem - Ключ -R - обрабатывать вложенные папки
rem - Ключ -AG[формат] - добавить к имени архива текущие дату и время
rem - Ключ -DH - открывать совместно используемые файлы
rem - Ключ -E[+]<атрибут> - задать исключение и включение файлов в обработку по маске атрибутов ( Не упаковывать файлы с атрибутами "системный" и "скрытый": WinRAR a -esh файлы)
rem - Ключ -INUL - не выводить сообщения об ошибках
rem - Ключ -M - выбрать метод сжатия (-m0: Без сжатия, -m5: Наилучший метод сжатия (самое лучшее, но самое медленное сжатие)
rem - Ключ -RI[:] - установить приоритет процесса и время простоя.
rem - Ключ -Y - подразумевать ответ "Да" на все запросы
rem - Ключ -CFG- - игнорировать профиль по умолчанию и переменную окружения
rem - Ключ -EP2 - сохранять полные пути файлов
rem что архивируем:
set a_files=@%place%\in_rar.txt
rem что пропускаем:
set a_not=-x@%place%\except_rar.txt
rem Ключ -X@<файл-список> - не обрабатывать файлы, указанные в файле-списке.
rem куда архивируем+имя архива:
set a_out=%place%\BackUpTemp\backup_
rem где лежит лог архивации:
set a_log=%place%\backup.log
rem запуск архиватора (Ключ -IBCK - запустить WinRAR как фоновый процесс в системном лотке)
"C:\Program Files\WinRAR\WinRAR.exe" -ibck %a_opt% %a_not% %a_out% %a_files% >%a_log%
rem зальем полученный архив на FTP:
ftp -s:ftp_param.txt -i >%a_log%
rem удалим архивный файл-оригинал
del %place%\BackUpTemp\*.rar \y
exit
Приведу то же, но без комментариев, чтобы можно было оценить компактность и наглядность решения:
@echo off
set place=F:\Install\backups_main
IF EXIST %place%\BackUpTemp\*.rar del %place%\BackUpTemp\*.rar
set a_opt=a -r -agDD-MM-YY -dh -esh -INUL -m0 -ri10:10 -Y -cfg- -ep2
set a_files=@%place%\in_rar.txt
set a_not=-x@%place%\except_rar.txt
set a_out=%place%\BackUpTemp\backup_
set a_log=%place%\backup.log
"C:\Program Files\WinRAR\WinRAR.exe" -ibck %a_opt% %a_not% %a_out% %a_files% >%a_log%
ftp -s:ftp_param.txt -i >%a_log%
del %place%\BackUpTemp\*.rar \y
exit
Остальные конфиги из папки backups_main при необходимости корректируются индивидуально для каждой клиентской машины.
Пример листинга файла «except_rar.txt» (что не включать в бекап):
*~*.*
*.~*
*.tmp
*.bak
*копия*.doc
"E:\Work\Архив"
Пример листинга файла «ftp_param.txt» (настройка FTP, 192.168.0.23 – адрес FTP-сервера в локальной сети):
open 192.168.0.23
login
password
lcd F:\Install\backups_main\BackUpTemp
mput *.*
quit
Пример листинга файла «in_rar.txt» (что бекапим):
E:\Work
Загрузка клиентской системы регулируется ключами RARа “-m”(сжатие, я ставлю «0» для снижения загрузки ПК) и “-ri” (приоритет процесса и пауза после каждого файла – эти значения я подбирал экспериментально).
Загрузка сети регулируется средствами FTP-сервера, он позволяет задавать количество разрешенных потоков для каждого клиента.
2. Удаление старых бекапов
На внешнем винте создана папка для всех бекапов: «FTPFolders»
Для каждого пользователя заведена отдельная подпапка, куда валятся именные бекапы. В каждой из них есть еще одна вложенная для старых копий.
Например, есть пользователь-папка FTPFolders\anastasia (сюда идет заливка по FTP), в которой лежит подпапка anastasia_old (сюда перемещаются старые бекапы, которые потом удаляются).
Раз в месяц тем же планировщиком уже на моей машине (FTP-сервере) тихо стартует такой батник:
IF EXIST J:\FTPFolders\anastasia\*.rar del J:\FTPFolders\anastasia\anastasia_old \*.rar
Echo т.е. если архивы есть в папке, куда заливаются бекапы по FTP, то удалить все в папке для старых бекапов...
IF EXIST J:\FTPFolders\anastasia\*.rar move J:\FTPFolders\anastasia\*.rar J:\FTPFolders\anastasia\anastasia_old
Echo ...а затем переместить все из папки для заливки в папку для старых версий, где оно будет храниться месяц до следующего запуска этого батника.
(Данные строки в батнике повторяются 6 раз для всех пользователей и их папок.
Так как бекап делается раз в неделю, то глубина хранения – 4 бекапа.)
Проверка на наличие чего-либо в папке, куда заливаются бекапы по FTP, нужна для того, чтобы избежать удаления старых бекапов, если новые по какой-то причине не создавались (например, человек болел, был в отъезде, длительные выходные и т.д. и комп не включали).
Tips&Tricks
- Если любые пути к файлам, которые описываются в батниках, содержат пробелы, то такие пути неплохо брать в кавычки для избежания возможных проблем.
- Задания для Планировщика лучше формировать под админской учеткой, точно не будет проблем с доступом к файлам, кроме того в таком случае весь процесс бекапа будет полностью невидим для пользователя (даже в трее), штатно работающем под неадмином, только в процессах появится WinRAR.
- Необходимо отключить чертов виндовый файервол, если это еще не сделано. Может молча резать ftp-коннекты. Ну и настроить сторонние файерволы соответсвующим образом – это ясно.
Недостатки данного решения, несущественные для меня, но имеющие место:
- Открытая передача логина/пароля по FTP.
Можно было повозиться и придумать что-нибудь более секьюрное с ssh или SFTP, но я посчитал это избыточным и усложнящим, достаточно того, что FTP-хранилище не расшарено по сети и имеет парольный доступ для каждого пользователя. Слово «сниффер» в этом коллективе знаю только я, да и сервер не "боевой", а локальный.
- Отсутствие инкрементальных бекапов.
Такую задачу я не ставил, хотя это возможно с помощью отслеживания атрибута «архивный» для каждого файла и манипуляций с ним, возможности у WinRAR-а для этого есть.
- Платность WinRAR.
Да, я в курсе, что есть бесплатный вариант 7ZIP. Но он, насколько я знаю, не позволит сделать все то, что я соорудил с помощью WinRAR, да и стоимость этого архиватора не так уж и велика. А можно без проблем и кряк найти, если религия позволяет.
- Нецентрализованное логирование ошибок.
Логи хранятся на локальных машинах и изменение их содержания в случае ошибок никак не сигнализируется. Тут даже не вижу способов решения, но и особой необходимости тоже, не ставил цели уведомления по мылу или еще как.
Ошибки в процессе заливки на FTP-сервер я могу видеть и на своей машине в логах сервера.
- Необходимость постоянного включения компа, на котором FTP-сервер.
Лично для меня это не проблема, он и так все рабочее время включен. Если заболею или уеду (это бывает редко) – прошу просто утром включать мой комп.
Выводы
1) Система работает уже полгода, сбоев не было. Простота настройки достигнута за счет использования нескольких внешних файлов-конфигов. Этого можно было бы избежать и все описать в батнике, но такой подход мне кажется нагляднее.
2) Некоторое время спустя после реализации и запуска наткнулся на продвинутую но условно-бесплатную надстройку над WinRAR-ом, которая делает из него полнофункциональную и самодостаточную бекап-систему с планировщиком, работой по FTP, записью на диски, отправкой по e-mail, удалением старых архивов, поддержкой русского языка и т.д.: Acritum One-click BackUp for WinRAR. Быть может, кому-то будет интересно. Опять таки, если ваша религия не против - можно найти "таблетку".
3) Я не претендую на оригинальность/уникальность решения, на Компьютерре неплохая статья есть, которую я частично использовал. Хотел лишь в очередной раз (спасибо, Кэп) обратить ваше внимание на то, что не всегда есть необходимость устанавливать нечто специализированное, порой штатных/почти штатных средств вполне достаточно. Простота - залог надежности.