Назад | Перейти на главную страницу

rsync много маленьких файлов с длинными именами требует большой пропускной способности

У меня есть сервер хранения файлов, который хранит файлы на диске, используя хэш файла sha256 в качестве имени файла вместе с расширением файла и в трех уровнях каталогов, например файл PDF с хешем sha256 AABB1F1C6FC86DB2DCA6FB0167DE8CF7288798271EA24B68D857CBC5CF8DC66A будет храниться в таком подкаталоге:

<root>/AA/BB/AABB1F1C6FC86DB2DCA6FB0167DE8CF7288798271EA24B68D857CBC5CF8DC66A.pdf

Файлы будут добавлены в структуру каталогов, но никогда не будут удалены или изменены.

Я храню живую копию этой файловой структуры, используя задание cron, выполняющееся каждые 10 минут, которое использует rsync для отправки файлов на удаленный сервер. Поскольку файлы никогда не удаляются и не изменяются после добавления, на практике он отправляет только новые файлы.

Я обнаружил, что полоса пропускания, используемая rsync только для сравнения двух каталогов (т.е. изменений не было), составляет около 11 МБ и увеличивается по мере роста общего количества файлов (148 207 на данный момент). Это имеет смысл - rsync фактически должен отправить список всех имен файлов на удаленный сервер, чтобы выяснить, какие из них отсутствуют на удаленном сервере.

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

Есть другие предложения?

В большинстве случаев это не рекомендуется, но, учитывая, что ваша цель - уменьшить пропускную способность вычисления разницы, это уместно. Рассмотрим следующий поток сценария:

  1. прикоснитесь к файлу, чтобы он стал вашей «верхней полосой», он должен иметь систематическое имя и не перезаписывать ваш последний «высокий столбец», который теперь является вашей «нижней полосой». Сценарий будет передавать все, что есть mtime между этими двумя датами файла. Обратите внимание: вы не должны переименовывать или иным образом изменять отметки даты в этих файлах.
  2. использовать найти с -newer <lowbarfile> ! -newer <highbarfile> чтобы выбрать файлы для передачи, подключитесь к rsync, как ваш справочный вопрос.
  3. каждую неделю (или каждую ночь) повторно синхронизируйте весь каталог, чтобы убедиться, что ничего не было упущено. Получите по электронной почте журнал файлов, переданных таким образом, чтобы вы могли видеть, возникают ли проблемы с предыдущими шагами.

Это не такое замечательное решение, как inotifywatch, но оно также не ломается после 8000 каталогов, и ваша иерархия, похоже, использует до 256 + 65536 каталогов.

Вы можете запустить rsync с -e "ssh -C", тем самым сжимая туннель ssh, а не только данные, как при работе с -z. Или подключение к vpn, которое сжимает трафик (openvpn может это сделать).

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

Вы не упомянули, что такое ОС файлового сервера, но в Linux вы можете использовать что-то вроде inotofywatch для генерации предупреждения о каждом событии файловой системы, которое создает или изменяет файл, и использовать это событие в качестве входных данных для копирования новых файлов. Ваша многоуровневая структура каталогов делает inotifywatch несколько дороговато.

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