Автор оригинала: Vlad Mihalcea.
Leanpub поддерживает несколько механизмов хранения, а частное хранилище GitHub , вероятно, является самым безопасным способом резервного копирования вашей рабочей папки. Я выбрал Dropbox, так как не видел ничего плохого в механизме автоматической синхронизации.
Во время работы над моей книгой мне случайно удалось стереть половину моих диаграмм , и все изменения были мгновенно синхронизированы Dropbox. Бесплатная учетная запись Dropbox не предлагает управление версиями на уровне папок, поэтому удаленные файлы просто исчезают. К счастью, ИДЕЯ IntelliJ Местная история спасла день, и диаграммы были должным образом восстановлены.
Инциденты неизбежны, поэтому план аварийного восстановления должен быть главным приоритетом с самого начала.
Один из первых вариантов-просто заархивировать копию рабочей папки и сохранить ее в другом месте. Как бы просто это ни было, у этого подхода есть некоторые серьезные недостатки:
- Много дискового пространства тратится впустую, даже если изменилась всего лишь куча файлов
- Для обнаружения изменений требуется какой-либо внешний инструмент
Дисковое пространство на самом деле не является проблемой при использовании внешнего жесткого диска. Для удаленных хранилищ более подходит механизм дельта-копирования .
Хотя я использую машину с Windows, мне посчастливилось широко использовать Cygwin . Даже если он поставляется с множеством утилит Unix, некоторые инструменты, связанные с ядром, нелегко реализовать в Windows. Без inotify , утилита сторож отсутствует.
Лучшей альтернативой является использование инструментов контроля версий. Имея это в виду, я превратил свою рабочую папку в локальный репозиторий Git. Даже если репозиторий не зеркально отображен на удаленной машине, я все равно могу воспользоваться механизмом контроля версий. Git предоставляет способы обнаружения ожидающих изменений, и хранилище может быть скопировано в нескольких местах (решение проблемы с одной точкой отказа).
Мое текущее решение выглядит следующим образом:
#!/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
, репозиторий Git Dropbox также зеркально отображается в OneDrive
В конце концов, рабочая папка поддерживается Dropbox и OneDrive, а управление версиями осуществляется с помощью Git. Полная архивная копия также хранится на внешнем диске (на всякий случай).
Единственное, что осталось сделать, – это автоматизировать процесс резервного копирования. Если cron является де-факто планировщиком задач для систем Linux, то при использовании Cygwin cron требует установки административных привилегий, специальной службы Windows и корректировки политики безопасности. Для простоты я выбрал гораздо более простой подход, используя бесконечный цикл, подобный следующему:
#!/bin/sh cd `dirname "$0"` while [ 1 ]; do ./bkp.sh test $? -gt 128 && break; sleep 15 done
Сценарий резервного копирования вызывается каждые 15 секунд, до тех пор, пока терминал не получит сигнал SIGTERM от пользователя.
Чтобы этот сценарий запускался при загрузке системы, запускаемый пакетный сценарий Windows должен открыть Cygwin следующим образом:
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 звучит очень привлекательно.