У меня есть сценарий оболочки, который продолжает копировать огромные файлы (от 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 все время.