Я пытался написать "идеальную" программу резервного копирования (ниже), но столкнулся с проблемами (также ниже). Есть ли эффективная / рабочая версия этого ?:
Предположения: вы выполняете резервное копирование с «локального», которым вы владеете и на котором ограничено дисковое пространство, до «удаленного», которое имеет бесконечное дисковое пространство и принадлежит кому-то другому, поэтому вам необходимо шифрование. Пропускная способность сети конечна.
'local' хранит базу данных резервных копий файлов с этими данными для каждого файла:
имя файла, включая полный путь
время последнего изменения файла (mtime)
sha1sum из незашифрованного содержимого файла
sha1sum зашифрованного содержимого файла
Учитывая список файлов для резервного копирования (некоторые, возможно, уже были зарезервированы), программа запускает 'find' и получает полный путь /mtime для каждого файла (это довольно эффективно; наоборот, вычисление sha1sum каждого файла НЕ будет эффективным)
Программа отбрасывает файлы, имена файлов и mtime которых находятся в «локальной» базе данных.
Теперь программа вычисляет sha1sum (незашифрованное содержимое каждого оставшегося файла).
Если sha1sum соответствует единице в «локальной» базе данных, мы создаем специальную запись в «локальной» базе данных, которая указывает этот файл /mtime на файл /mtime существующей записи. По сути, мы говорим: «у нас есть резервная копия содержимого этого файла, но под другим именем файла, поэтому нет необходимости делать ее снова».
Для каждого оставшегося файла мы зашифровываем файл, берем sha1sum содержимого зашифрованного файла, rsync файл до его sha1sum. Пример: если зашифрованный файл sha1sum был da39a3ee5e6b4b0d3255bfef95601890afd80709, мы бы rsync его в /some /path /da / 39 / a3 /da39a3ee5e6b4b0d3255bfef95601890afd80709 на «удаленном».
Как только вышеуказанный шаг завершится успешно, мы добавляем файл в локальную базу данных.
Обратите внимание, что мы эффективно избегаем вычислений sha1sums и шифрования, за исключением случаев, когда это абсолютно необходимо.
Примечание: я не указываю метод шифрования: это будет выбор пользователя.
Проблемы:
Мы должны регулярно шифровать и делать резервные копии локальных БД. Однако «локальная» база данных быстро растет, и rsync'-шифрование зашифрованных файлов неэффективно, так как небольшое изменение в «локальной» базе данных означает большие изменения в зашифрованной версии «локальной» базы данных.
Мы создаем файл в «remote» для каждого файла в «local», что уродливо и излишне.
Мы часто запрашиваем «локальные» базы данных. Даже с индексами эти запросы медленные, так как мы часто делаем один запрос для каждого файла. Было бы неплохо ускорить это, группируя запросы или что-то.
Наверное, другие проблемы, которые я сейчас забыл.