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

Копирование огромных файлов между двумя удаленными машинами - эффективно

У меня есть сценарий оболочки, который продолжает копировать огромные файлы (от 2 ГБ до 5 ГБ) между удаленными системами. Аутентификация на основе ключей используется с пересылкой агента, и все работает. Например: предположим, что сценарий оболочки запущен на машине A и копирует файлы с машины B на машину C.

"scp -Cp -i private-key ssh_user@source-IP:source-path ssh_user@destination-IP:destination-path"

Теперь проблема в том, что процесс sshd постоянно загружает процессор.
Например: top -c на целевой машине (то есть машине-C) показывает

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                         
14580 ssh_user  20   0 99336 3064  772 R 85.8  0.0   0:05.39 sshd: ssh_user@notty                                                            
14581 ssh_user  20   0 55164 1984 1460 S  6.0  0.0   0:00.51 scp -p -d -t /home/binary/instances/instance-1/user-2993/

Это приводит к высокой средней нагрузке.

Я считаю, что scp занимает так много процессора из-за шифрования / дешифрования данных. Но Мне не нужна зашифрованная передача данных поскольку и машина-B, и машина-C находятся в локальной сети.

Какие еще у меня есть варианты? Я подумал о rsync. Но на странице руководства rsync говорится:

GENERAL
       Rsync  copies files either to or from a remote host, or locally on the current host (it does not support copying files between two
       remote hosts).

Изменить 1: я уже использую ssh cipher = arcfour128. Небольшое улучшение, но это не решает мою проблему.

Изменить 2: есть другие двоичные файлы (мое основное приложение), работающие на машинах, и высокая средняя нагрузка, из-за которой они плохо работают.

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

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

Во-вторых, шифрования / дешифрования можно избежать, запустив rsync в режиме Daemon Access вместо режима удаленного доступа к оболочке.

В режиме доступа к демону rsync не туннелирует трафик через ssh-соединение. Вместо этого он использует свой собственный протокол поверх TCP.

Обычно демон rsync запускается из inet.d или автономно. В любом случае для этого требуется root-доступ к одной из удаленных систем. Предполагая, что root-доступ недоступен, демон все же можно запустить.

Начало rsync демон как непривилегированный пользователь на конечном компьютере

ssh -i private_key ssh_user@destination-IP \
       "echo -e 'pid file = /tmp/rsyncd.pid\nport = 1873' > /tmp/rsyncd.conf

ssh -i private_key ssh_user@destination-IP \
       rsync --config=/tmp/rsyncd.conf --daemon

Собственно скопируйте файлы

ssh -i private_key ssh_user@source_ip \
       "rsync [OPTIONS] source-path \
              rsync://ssh_user@destination-IP:1873:destination-path"

Наилучшим решением будет использование netcat:

destination$ nc -l -p 12345 > /path/destinationfile
source$ cat /path/sourcfile | nc desti.nation.ip.address 12345

(некоторые версии netcat не нуждаются в флаге "-p" для порта)

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

Другой альтернативой может быть попытка изменить шифр ssh (ssh -c) или использование ftp.

PS: rsync отлично работает с удаленными машинами, но в основном используется в сочетании с ssh, поэтому здесь нет ускорения.

Если шифрование не важно, запустите демон NFS на C и смонтируйте каталог на B. Используйте rsync для запуска B, но укажите пути к локальным каталогам.

Игнорирование любого вашего варианта использования для привлечения A есть, просто добавьте ssh user@B rsync... к команде.

Передает данные без накладных расходов на шифрование и передает только разные файлы.

Кроме того, FTP был построен с передачей данных с сервера на сервер от сторонних производителей в качестве функции протокола.

Вы можете использовать метод низкого шифрования: вы можете использовать rsync --rsh="ssh -c arcfour" для увеличения скорости. Я свои тесты, я жду диски и больше нет подключения к сети. И пользуйтесь rsync, это хорошо!

Попробуйте унисон. Самый лучший вариант для синхронизации файлов.

Может ты найдешь http://rightsock.com/~kjw/Ramblings/tar_v_cpio.html это интересно.

Он распараллеливает передачу данных между двумя хостами. Обратите особое внимание на пункт № 5 и адаптироваться к вашим потребностям.

Я знаю, что нужно немного поработать, но DRDB работать на вас? Это похоже на сетевой RAID, и поддерживать синхронизацию двух серверов с ним намного проще, если случай похож на ваш, по крайней мере, если вам просто нужен сервер A для копирования на сервер B, а не также с B на A все время.