Упс время
Leanpub поддерживает несколько механизмов хранения, и частный репозиторий GitHub, вероятно, является самым безопасным способом резервного копирования рабочей папки. Я выбрал Dropbox, так как не предполагал ничего плохого в механизме автоматической синхронизации.
Работая над своей книгой , мне случайно удалось стереть половину моих диаграмм, и все изменения были мгновенно синхронизированы Dropbox. Бесплатная учетная запись Dropbox не предлагает управление версиями на уровне папок, поэтому удаленные файлы просто исчезают. К счастью, IntelliJ IDEA Local History спас день, и диаграммы были правильно восстановлены.
Резервное копирование
Инциденты неизбежны, поэтому план аварийного восстановления должен быть главным приоритетом с самого начала.
Один из первых вариантов — просто заархивировать копию рабочей папки и сохранить ее в другом месте. Как бы просто это ни было, у этого подхода есть несколько основных недостатков:
- Потеряно много дискового пространства, даже если изменилась только куча файлов
- Обнаружение изменений требует некоторого внешнего инструмента
Дисковое пространство на самом деле не проблема при использовании внешнего жесткого диска. Для удаленных хранилищ лучше подходит механизм дельта-копирования .
Хотя я использую компьютер с Windows, я часто использую Cygwin . Даже если он поставляется с множеством утилит Unix, некоторые инструменты, связанные с ядром, не могут быть легко реализованы в Windows. Без inotify утилита сторожа исчезнет.
Лучшая альтернатива — следовать подходу инструментов контроля версий. Имея это в виду, я превратил свою рабочую папку в локальный репозиторий Git. Даже если хранилище не отражено на удаленной машине, я все равно могу воспользоваться механизмом контроля версий. Git предоставляет способы обнаружения ожидающих изменений, а хранилище можно копировать в нескольких местах (устраняя проблему единой точки отказа).
Мое текущее решение выглядит так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#!/bin/sh git_lock=./.git /index .lock if [ -f $git_lock ]; then echo "Git lock $git_lock exists, we must remove it." rm -f $git_lock fi git add . status=`git status --untracked-files=no --porcelain` if [ -z "$status" ]; then echo "No change detected!" else echo "Changes detected, autosave and synchronize!" git commit -m "Autosave `date`" echo "Copy backup" epoch=` date +%s` backup_file=backup-$epoch.zip 7z a -t7z /cygdrive/d/Vlad/Work/Books/high-performance-java-persistence/backups/ $backup_file . -r echo "Rsync to OneDrive" rsync .exe -r . /cygdrive/c/Users/Vlad/OneDrive/Documente/high-performance-java-persistence/manuscript/ fi |
- Если во время выполнения какого-либо действия происходит сбой в git-процессе, блокировка предотвратит дальнейшие операции, поэтому сначала необходимо удалить блокировку.
- Все изменения поставлены
- С помощью команды Git status мы проверяем, есть ли ожидающие изменения. Если ничего не изменилось, нет смысла тратить ресурсы на синхронизацию рабочих папок.
- Все изменения фиксируются автоматически, поэтому предлагается восстановление на определенный момент времени
- Архивная копия отправляется на отдельный внешний диск
- Используя rsync , хранилище Dropbox Git также отражается в OneDrive
В конце концов, рабочая папка поддерживается Dropbox и OneDrive, а управление версиями осуществляется через Git. Полная архивная копия также хранится на внешнем диске (на всякий случай).
Автоматизация процессов
Осталось только автоматизировать процесс резервного копирования. Если cron является де-факто планировщиком задач для систем Linux, при использовании Cygwin cron требует настройки административных привилегий, специальных настроек службы Windows и политики безопасности. Для простоты я выбрал гораздо более простой подход, используя бесконечный цикл, подобный следующему:
1
2
3
4
5
6
7
8
9
|
#!/bin/sh cd ` dirname "$0" ` while [ 1 ]; do . /bkp .sh test $? -gt 128 && break ; sleep 15 done |
Сценарий резервного копирования вызывается каждые 15 секунд, если терминал не получает сигнал SIGTERM от пользователя.
Для запуска этого сценария при загрузке системы пакетный сценарий запуска Windows должен открыть Cygwin следующим образом:
1
|
start /min C:\cygwin64\bin\mintty --hold never /bin/bash -l -e '/cygdrive/c/Users/Vlad/Dropbox/high-performance-java-persistence/manuscript/run-bkp.sh' |
Вывод
Стратегия резервного копирования может спасти вас от непоправимой потери данных. Зеркально отражая рабочую папку на нескольких серверах, вы можете получить доступ к своим данным, даже если какая-то внешняя служба не работает. Отслеживание всех изменений делает восстановление намного проще, поэтому репозиторий Git звучит очень привлекательно.
Ссылка: | Руководство параноика по резервному копированию рабочей папки от нашего партнера по JCG Влада Михалча в блоге Влада Михалча . |