Резервное копирование данных пользователей по сети. Часть 1
Спойлер: данная статья написана о первой версии программы. В настоящее время я развиваю данный проект: пофиксил баги, сделал UI, проработал документацию и собрал установщики!
Добро пожаловать на сайт: netbackup.blog.knasys.ru
Давно вынашивал идею как-то бакапить данные пользовательских компьютеров в своей организации на случай внезапного отказа жесткого диска/нападения шифровальщиков/и т.п. Сначала думал сделать каждому пользователю сетевой диск для хранения важных данных, но как-то не зашло. Потом начал копать в сторону специализированных программ для резервного копирования: есть множество решений, но либо они бесплатные и их нужно ставить на каждый комп и настраивать отдельно, либо платные. Так как ставить на каждый из 85-ти компов мне как-то не с руки, то искал серверный вариант, к тому же бесплатный. И крайне желательно чтобы под линукс. Нашел крутой оперсорсный проект Bareos — хорошо документированный развивающийся проект энтерпрайз уровня, поставил, настроил, но вот беда — уж очень медленно он тянул файлы через сеть. Чтобы бакапнуть 500 Gb — требовалось неделя. На форумах техподдержки много мусолили эту тему и так и не нашли внятного решения, списали всё на особенности виртуальных сетей Hyper-V, на котором я его поднимал (UPD: проблема оказалась во включенном VMQ). И действительно, непосредственно на железе оно работает гораздо шустрее, но я от него отказался ввиду нескольких причин: все-равно приходилось ставить клиентов на хосты, при сканировании измененных файлов сильно загружался жесткий диск хоста. Ещё не известно, сам ли жёсткий помрёт, или его убъет Bareos своими ежедневными сканированиями. Возможно это как-то исправляется, но я уже порядком потратил на Bareos времени, что мне уже хотелось тупо написать свою программу и не париться.
Имеем:
- Сеть из 85 компов под управлением Windows. В основном все подключены к домену, но есть исключения.
- К каждому компу можно подключиться по сети и получить все файлы через административные шары.
- Есть 4 жестких диска на террабайт и комп. Комп на селероне с 4Gb памяти и материнкой не поддерживающей RAID.
Задачи:
- на бакап-сервере файлы должны храниться с резервированием на двух жестких дисках.
- на клиентские хосты не нужно ничего устанавливать
- файлы на сервере должны храниться в том виде, в котором они есть на самом деле, без всяких преобразований. Структура папок должна сохраняться.
- если сдохнет железо сервера, то можно взять жесткий, подключить к другому компу и тупо в проводнике скопировать все необходимые файлы.
- для каждого хоста можно назначать правила копирования: папки источники, исключения, копируемые или игнорируемые расширения файлов.
- программа должна сканировать все имеющиеся файлы хоста (подходящие под правила бакапа). Если на сервере нет этого файла, то копировать его туда. Если есть — то игнорировать. Если есть, но он изменён, то копировать, оставляя при этом старую версию тоже.
- изменения файлов отслеживать только по размеру и дате последнего изменения. Это избавит от необходимости читать каждый файл и вычислять его хэш, тем самым, на порядок увеличится скорость работы и не будет убиваться жесткий диск хоста. Конечно, есть вариант не отследить изменившийся файл — если размер остался тот же и не изменилась дата последнего изменения, но такое поведение, наверно, редко случается и я им пренебрегу.
- программа должна уметь работать на линуксе и на винде.
- программа должна уметь многопоточно бакапить хосты.
- программа должна сама управлять стартом бакапов (без назначенных заданий или крона)
- бакапим только виндовые машины.
В общем, написание, дебаг и вот оно!
Лучше запускать через cmd/terminal командой
java -jar filescaner-1.0-SNAPSHOT.jar
В этом случае, пока открыто окно командной строки — программа работает и выводит в консоль отладочную информацию. Если Вы просто запустите filescaner-1.0-SNAPSHOT.jar, то она запустится в фоновом режиме.
Теперь про настройки. Они лежат в папке config.
mainprorps.xml содержит общие настройки для всех хостов, но в настройках конкретного хоста они могут быть переназначены. Это:
1. Учетка для подключения к удаленному хосту:
<domain>PB</domain> <user>backupuser</user> <password>password</password>
Тут приведен пример доменной учетки. Если учетка локальная, то в поле domain следует указать имя компьютера.
2. Директория для сохранения бакапов:
Для винды, например
<storage_directory>D:\backups</storage_directory>
Для линукса, например
<storage_directory>/home/user/backups</storage_directory>
Старайтесь использовать путь ближе к корню, чтобы путь для самого глубоко-лежащего файла бакапа был короче. Возможно переполнение максимальной длины пути. Если storage_directory не указан, бакапы сохранятся в папке storage — рядом с папкой config.
В папке hosts лежат настройки хостов. Бакапы каждого хоста будут сохраняться в отдельной папке, имя этой папки будет равно имени файла его настроек. Рассмотрим параметры:
1. <hostname>kostya</hostname> Обязательный параметр. Тут нужно указать имя компьютера для обращения к нему по сети. Можно указать его ip, но только если он статический, иначе, в случае смены ip, получите бакапы с разных компьютеров в одной папке.
2. domain, user, password — можете их переопределить, но по-умолчанию они берутся из файла mainprorps.xml. Не обязательные параметры.
3. storage_directory — можете его переопределить и для этого хоста бакапы будут храниться в этом месте, но по-умолчанию путь берется из файла mainprorps.xml. Не обязательный параметр.
4. <time>14:27</time> Обязательный параметр. Ежедневно в это время будет запускаться бакап данного хоста. Если Вам не надо ежедневно, можно указать параметры days_of_week и/или days_of_month
5. Не обязательные параметры. Уточняют, в какой день недели следует запускать бакап:
<days_of_week> <day>1</day> <day>4</day> </days_of_week>
В данном случае бакап будет запускаться только в понедельник и четверг. Во время указанное в параметре time.
6. Не обязательные параметры. Если Вам нужно запускать бакапы ещё реже, то используйте параметр days_of_month:
<days_of_month> <day>1</day> <day>10</day> <day>20</day> </days_of_month>
В данном примере бакап будет запускаться только 1-го, 10-го и 20-го числа каждого месяца. Если days_of_month используется совместно с days_of_week, то чтобы бакап запустился, то оба требования должны быть выполнены. Т.е., грубо говоря, 1-ое число должно быть либо понедельником, либо четвергом, тогда бакап запустится.
Например, если Вам нужно запускать бакап в 10 часов утра в первый и третий понедельник каждого месяца, то настройки будут следующие:
<days_of_month> <day>1</day> <day>2</day> <day>3</day> <day>4</day> <day>5</day> <day>6</day> <day>7</day> <day>15</day> <day>16</day> <day>17</day> <day>18</day> <day>19</day> <day>20</day> <day>21</day> </days_of_month> <days_of_week> <day>1</day> </days_of_week> <time>10:00</time>
7. <retry_on_error>true</retry_on_error> Не обязательный параметр. Если он указан и равен true, то в случае недоступности хоста попытка сделать бакап повторится через 60 минут. В противном случае, следующий бакап будет запущен согласно расписания. Если Вы желаете изменить временной промежуток в 60 минут, используйте параметр min_before_retry.
8. <min_before_retry>10</min_before_retry> Не обязательный параметр. Устанавливает временную задержку в минутах между попытками сделать бакап.
Теперь рассмотрим настройки того, что копируем. Настройки назначаются в пределах конкретного логического диска, например, D:/:
<disk name="D"> ... </disk>
Так же рядом Вы можете написать для диска C, диска E и так далее. Внутри тэга disk расположены тэги итераций. Если в пределах диска у Вас есть разные пути для копирования, или разные правила копирования этих путей, то делайте несколько итераций.
<disk name="D"> <iteration> ... </iteration> <iteration> ... </iteration> </disk>
Для каждой итерации назначается директория которую будем копировать в параметре target. Например, если <target>/</target>, то итерация справедлива для всего диска, если <target>Distrib\Спицифичные</target>, то для папки D:/Distrib/Спицифичные.
Также для итерации можно установить файлы каких расширений мы будем копировать, либо файлы каких расширений мы будем игнорировать. Это параметры backup_only_this_extensions и do_not_backup_this_extensions соответственно. Совместное использование двух этих параметров не возможно.
Можно игнорировать некоторые вложенные относительно target папки и файлы используя параметр ignore_childs, например если <target>/</target>, <disk name=»D»> и
<ignore_childs> <path>RECYCLER</path> <path>$RECYCLE.BIN</path> <path>System Volume Information</path> <path>DrWeb Archive</path> <path>DrWeb Quarantine</path> <path>msdownld.tmp</path> <path>pagefile.sys</path> <path>hiberfil.sys</path> <path>Config.Msi</path> <path>MSOCache</path> <path>Distrib</path> <path>OpenServer\modules</path> <path>OpenServer\progs</path> <path>OpenServer\userdata</path> </ignore_childs>
, то в бакап не попадут папки:
D:/RECYCLER D:/$RECYCLE.BIN D:/System Volume Information D:/DrWeb Archive D:/DrWeb Quarantine D:/Config.Msi D:/MSOCache D:/Distrib D:/OpenServer/modules D:/OpenServer/progs D:/OpenServer/userdata
и файлы:
D:/msdownld.tmp D:/pagefile.sys D:/hiberfil.sys
Вроде всё. В папке лежит несколько примеров настроек хостов, надеюсь разберетесь.