У меня есть большой каталог, который нужно синхронизировать с локального сервера на мой веб-сервер, и я ищу наиболее эффективный способ сделать это. Этот каталог содержит 113 тыс. Файлов в 14 тыс. Каталогов и имеет размер примерно 5 ГБ. Сравнение локального и удаленного каждого файла / каталога занимает несколько часов даже с небольшими изменениями.
Локальная машина - Win7, удаленная - CentOS 5.5
Мой текущий setep использует синхронизацию по сценарию с WinSCP, но, как уже говорилось, сканирование каталогов через одно соединение SCP занимает часы. Количество файлов, требующих обновления, должно быть намного меньше, чем общий набор, и я хотел бы найти способ локального сценария синхронизации, регистрации файлов, которые были изменены, и последующего обращения к веб-серверу для загрузки новых файлов. .
Какие-либо предложения?
Посмотри на Дельтакопия или Syncrify оба основаны на протоколе rsync. Они будут передавать только измененные или новые файлы и т. Д., Что более важно, они будут передавать только измененные блоки из больших файлов. Rsync, вероятно, уже установлен на вашем компьютере Centos
Если изменения происходят только локально (то есть односторонняя синхронизация), вы можете подумать об использовании архиватора (zip, tar и т. Д.) Для архивации измененных файлов для транспортировки на удаленный сервер. Предположительно, вы можете использовать дату модификации, архивный бит или, в худшем случае, сохранить вторую локальную копию, чтобы использовать ее в качестве основы для определения того, какие файлы были изменены.
Rsync и другие программы дельта-копирования хороши, но я подозреваю, что ваша проблема может быть достаточно простой, чтобы ее решить, не доходя до крайности. При большом количестве небольших файлов вы также столкнетесь с большими задержками при использовании rsync из-за задержек.
Поскольку вашим источником является машина под управлением Windows, вы можете использовать бит «Архив» как индикатор того, какие файлы были изменены (при условии, что процесс обновления переключает бит архива). Вы можете сделать что-нибудь простое, например:
@echo off
set SRC=C:\source
set STAGING=C:\staging
rem Copy all files from source to staging, including subdirectories,
rem where "Archive" bit is set.
xcopy "%SRC%\*" "%STAGING%\" /e /s /a
rem Untick archive bit on all files in source
attrib /S /D -A "%SRC%\*"
Это оставит "промежуточный" каталог заполненным только файлами, которые изменились (хотя и с пустыми подкаталогами для каждого каталога, где файлы также не изменились). Это также сбросит бит архива для всех файлов во всех подпапках. Вы можете заархивировать этот промежуточный каталог (используя вашу любимую программу ZIP в командной строке) и отправить его на удаленный сервер для распаковки.
Это не дает вам никакого дельта-сжатия, но при среднем размере 51 КБ / файл похоже, что дельта-сжатие вам не очень поможет, и «выигрыш» по задержке этого упрощенного метода может быть лучше для вас.
Унисон это еще одна возможность. Важная часть - получить что-то, что вы можете запустить на сервере через SSH, и позволить серверному процессу обрабатывать дисковый ввод-вывод на этом конце, вместо того, чтобы удаленно проходить всю файловую систему. Unison может запускаться через ssh и использует алгоритм rsync для передачи только измененных частей файлов.