1

Я пытался написать "идеальную" программу резервного копирования (ниже), но столкнулся с проблемами (также ниже). Есть ли эффективная / рабочая версия этого ?:

  • Предположения: вы выполняете резервное копирование с «локального», которым вы владеете и на котором ограничено дисковое пространство, до «удаленного», которое имеет бесконечное дисковое пространство и принадлежит кому-то другому, поэтому вам необходимо шифрование. Пропускная способность сети конечна.

  • '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», что уродливо и излишне.

  • Мы часто запрашиваем «локальные» базы данных. Даже с индексами эти запросы медленные, так как мы часто делаем один запрос для каждого файла. Было бы неплохо ускорить это, группируя запросы или что-то.

  • Наверное, другие проблемы, которые я сейчас забыл.

0