У меня есть сервер хранения файлов, который хранит файлы на диске, используя хэш файла sha256 в качестве имени файла вместе с расширением файла и в трех уровнях каталогов, например файл PDF с хешем sha256 AABB1F1C6FC86DB2DCA6FB0167DE8CF7288798271EA24B68D857CBC5CF8DC66A
будет храниться в таком подкаталоге:
<root>/AA/BB/AABB1F1C6FC86DB2DCA6FB0167DE8CF7288798271EA24B68D857CBC5CF8DC66A.pdf
Файлы будут добавлены в структуру каталогов, но никогда не будут удалены или изменены.
Я храню живую копию этой файловой структуры, используя задание cron, выполняющееся каждые 10 минут, которое использует rsync для отправки файлов на удаленный сервер. Поскольку файлы никогда не удаляются и не изменяются после добавления, на практике он отправляет только новые файлы.
Я обнаружил, что полоса пропускания, используемая rsync только для сравнения двух каталогов (т.е. изменений не было), составляет около 11 МБ и увеличивается по мере роста общего количества файлов (148 207 на данный момент). Это имеет смысл - rsync фактически должен отправить список всех имен файлов на удаленный сервер, чтобы выяснить, какие из них отсутствуют на удаленном сервере.
Итак, мой вопрос: есть ли способ уменьшить используемую полосу пропускания? Это не обязательно должно быть решение на основе rsync, но это было бы предпочтительнее. Я думал об ограничении файлов, которые rsync просматривает, только недавно измененными файлами, то есть измененными после последней синхронизации, но, похоже, это не рекомендуется: rsync только файлы, созданные или измененные после даты и времени
Есть другие предложения?
В большинстве случаев это не рекомендуется, но, учитывая, что ваша цель - уменьшить пропускную способность вычисления разницы, это уместно. Рассмотрим следующий поток сценария:
-newer <lowbarfile> ! -newer <highbarfile>
чтобы выбрать файлы для передачи, подключитесь к rsync, как ваш справочный вопрос.Это не такое замечательное решение, как inotifywatch, но оно также не ломается после 8000 каталогов, и ваша иерархия, похоже, использует до 256 + 65536 каталогов.
Вы можете запустить rsync с -e "ssh -C", тем самым сжимая туннель ssh, а не только данные, как при работе с -z. Или подключение к vpn, которое сжимает трафик (openvpn может это сделать).
За каждый запуск rsync
необходимо составить полный список как локальной, так и удаленной структуры каталогов и вычислить различия, прежде чем он определит, какие файлы были вновь созданы и отправят эти новые файлы. Вот что такое «дорогое».
Вы не упомянули, что такое ОС файлового сервера, но в Linux вы можете использовать что-то вроде inotofywatch
для генерации предупреждения о каждом событии файловой системы, которое создает или изменяет файл, и использовать это событие в качестве входных данных для копирования новых файлов. Ваша многоуровневая структура каталогов делает inotifywatch
несколько дороговато.
В Windows у вас есть DFSR который примерно соответствует имени, он также подключается к слою файловой системы и еще более интеллектуален в том отношении, что реплицируется только измененная часть файла, а не весь файл.