Допустим, у меня есть данные порядка терабайт, в файлах порядка мегабайт, чтобы отойти от сервера, который находится на расстоянии более 500 мс.

Из-за особенностей TCP команда, представленная ниже, работает, но только на части доступной полосы пропускания, будь то домашнее ADSL-соединение со скоростью 4 Мбит / с или толстая гигабитная линия.

rsync -avP --remove-source-files source.host:path/to/source/ path/to/dest

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

Будет ли безопасно и эффективно запускать несколько экземпляров команды выше одновременно?

2 ответа2

3

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

Однако, хитрое использование --include и --exclude может быть удобно здесь:

rsync -avP \
    --include '*/' --include '[a-g]*' --exclude '*' \
    source.host:path/to/source/ path/to/dest/

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

Наконец, когда все передачи завершены, вы должны снова запустить исходную команду rsync (обратите внимание, что я оставил --remove-source-files вне моей команды), чтобы убедиться, что любая странность, которая произошла, сглаживается, и любые файлы оригинальные фильтры пропущены (точечные файлы, возможно?) переданы также.

Кстати, всегда ставьте последнюю косую черту в каталогах источника и назначения (например, path/to/dest/), иначе rsync может не выполнить то, что вы ожидаете!


Однако rsync - не самый эффективный способ репликации файлов в первый раз, особенно когда задержка высока (в основном это предназначено для последующих этапов обновления).

Вам было бы гораздо лучше использовать tar для потоковой передачи данных в ssh:

ssh source.host tar -C path/to/source/ cfj - . | tar -C path/to/dest/ xfj -

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

Недостатком является то, что это не легко восстановить, если соединение обрывается.

Tar также имеет опцию --exclude (но не --include), поэтому при необходимости вы можете паралелизировать потоки аналогичным образом. Опять же, вы, вероятно, должны закончить с rsync, чтобы проверить передачу.


За исключением: "природа TCP" не является проблемой здесь. TCP использует схему скользящего окна, которая должна насыщать канал с любой нормальной задержкой, и есть ручки, которые можно переключать, если это не так.

Природа rsync, однако, заключается в том, что он должен переписываться о каждом файле, перед тем как передать его, и задержка здесь будет вредной (хотя реализация использует конвейеризацию для минимизации этого).

Если вы не насыщаете свою ссылку, то первое, что нужно попробовать, это убрать rsync из уравнения (scp из достаточно большого файла). Если это все еще не делает, то проверьте использование вашего процессора: сжатие и шифрование могут быть узким местом. Если передача простых данных через Netcat (или устаревший FTP) не может этого сделать, возможно, вам нужно настроить TCP. Также проверьте ping на потерю пакетов, так как это действительно испортит TCP. Наконец, возможно, самое медленное звено в цепочке не ваше.

0

Краткий ответ: Нет.

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .