Эффективное инкрементное резервное копирование с порциями данных - PullRequest
0 голосов
/ 12 февраля 2012

Я занимаюсь разработкой инструмента резервного копирования и не могу найти наиболее эффективный способ сделать удаленное резервное копирование. Я не хочу отправлять весь файл каждый раз, когда есть небольшие изменения, поэтому я думаю, что инкрементное резервное копирование является решением. Это все хорошо, но теперь я застрял с проблемой, как я могу разбить один файл на несколько частей.

Проблема в том, что, скажем, у меня есть простой текстовый файл, а один кусок - одна строка:

First line
Second line
Third line
Fourth line

Теперь у меня есть 4 куска. Если я обновлю вторую строку, скажем, «Вторая строка», теперь мне нужно только сделать резервную копию второго блока.

Но что, если что-то подобное произойдет:

First line
First and half line
Second line
Third line
Fourth line

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

Есть ли простое решение для этого? Сначала я подумал, что могу сделать хэш для каждого чанка, а затем просто создать «каталог», который бы указывал правильный порядок чанков. Таким образом, я мог бы легко сопоставить, если фрагмент уже существует с хешем. Однако я понял, что решение для хеш-таблиц не будет работать ни с чем, кроме файлов, где фрагменты могут быть предсказаны и исправлены. Например, с бинарными файлами вы в значительной степени ограничены кусками с фиксированным байтовым размером, поэтому, если в начале было добавлено больше данных, и вы начали сокращать их, скажем, до 100 тыс. Кусков, вы получите другие данные в более поздних кусках, чем раньше.

Какие-нибудь решения?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2012

Вы можете использовать rsync для синхронизации вчерашнего резервного копирования в текущей папке, а затем запустить rysnc для синхронизации только обновленных файлов.

#!/bin/sh
# Create a Backup of Today
mkdir -p /storage/backups/`date +\%Y-\%m-\%d`-`date +\%A`/$host/$username
rsync -avz /storage/backups/`date --date=yesterday +\%Y-\%m-\%d`-`date --date=yesterday +\%A`/$host/$username/ /storage/backups/`date +\%Y-\%m-\%d`-`date +\%A`/$host/$username/
rsync -avz -e ssh --delete --exclude='logs' tim@tim.tim.net:/home/tim/ /storage/backups/`date +\%Y-\%m-\%d`-`date +\%A`/$host/$username/
0 голосов
/ 20 апреля 2012

Программы типа «diff» или «rsync» решают эту проблему по-своему.

Базовый алгоритм требует, чтобы вы выбрали «окно модификации» (его размер зависит от доступной памяти и времени, более длинные окна требуютболее длительные попытки сопоставления), и когда старый и новый хэш для одного и того же блока не совпадают, вы фактически пытаетесь сопоставить со следующими блоками в данном окне.Вам нужен более обобщенный алгоритм для обработки удалений блоков (например, вы можете попытаться найти совпадение в +/- половине окна).

Rsync (http://rsync.samba.org/) выполняет это инкрементное резервное копирование как на диске, так и на диске.эффективный способ сетевого ввода-вывода, и гораздо более сложный, чем это простое сопоставление хешей. Для разработки алгоритмов и протокола у автора, Эндрю Триджелла, потребовалось несколько лет и специальная магистерская работа.сэкономить на этом, попробуйте прочитать газеты! Веселитесь: http://samba.org/~tridge/phd_thesis.pdf

...