web-dev-qa-db-ja.com

2つのリモートマシン間で巨大なファイルをコピーする-効率的に

リモートシステム間で巨大なファイル(2 GBから5 GB)をコピーし続けるシェルスクリプトがあります。キーベースの認証はエージェント転送で使用され、すべてが機能します。たとえば、シェルスクリプトがマシンAで実行されていて、マシンBからマシンCにファイルをコピーしているとします。

 "scp -Cp -i秘密鍵ssh_user @ source-IP:source-path ssh_user @ destination-IP:destination-path" 

ここで問題は、sshdが継続的にCPUの負荷をかけているプロセスです。
例:宛先マシン(つまり、machine-C)のtop -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はデータの暗号化/復号化を行うため、CPUを大量に消費していると思います。しかし、マシンBとマシンCの両方がLANにあるため、暗号化されたデータ転送は必要ありませんです。

他にどのようなオプションがありますか? 「rsync」を検討しました。しかし、rsyncのmanページにはこう書かれています:

[。 ]

編集1:ssh暗号= arcfour128をすでに使用しています。少し改善されましたが、それは私の問題を解決しません。

編集2:マシン上で実行されている他のバイナリ(メインアプリケーション)があり、平均負荷が高いため、パフォーマンスが低下しています。

7
Varun

この問題はrsyncで解決できます。少なくともこのソリューションは、パフォーマンスの面で競争力があるはずです。

まず、リモートシステムの1つからrsyncを呼び出して、2つのリモートシステム間で直接コピーできないという制限を克服できます。

次に、リモートシェルアクセスモードではなくデーモンアクセスモードでrsyncを実行することにより、暗号化/復号化を回避できます。

デーモンアクセスモードでは、rsyncはssh接続を介してトラフィックをトンネルしません。代わりに、TCPの上に独自のプロトコルを使用します。

通常は、inet.dまたはスタンドアロンからrsyncデーモンを実行します。とにかく、これにはリモートシステムの1つへの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"
11
Dmitri Chubarov

最小限の解決策はnetcatを使用することです。

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

(一部のnetcatバージョンは、ポートに「-p」フラグを必要としません)

これは、暗号化されていないデータを、認証されていない状態でネットワーク経由で1台のPCから他のPCに送信するだけです。もちろん、それが最も「快適な」方法ではありません。

他の代替手段は、ssh暗号(ssh -c)を変更するか、ftpを使用することです。

PS:rsyncはリモートマシンで正常に動作しますが、主にsshと組み合わせて使用​​されるため、ここでは高速化していません。

8
mulaz

暗号化が問題にならない場合は、CにNFSデーモンをスローし、Bにディレクトリをマウントします。 Bでrsync runを使用しますが、ローカルディレクトリパスを指定します。

Aを使用するユースケースを無視して、コマンドの前にssh user@B rsync...を追加します。

暗号化オーバーヘッドなしでデータを転送し、異なるファイルのみを転送します。

また、FTPは、プロトコル機能としてサードパーティのサーバー間転送で構築されました。

3
Jeff Ferland

低暗号化方式を使用できます:rsync --rsh="ssh -c arcfour"速度を上げます。私のテストでは、ディスクを待ち、ネットワーク接続はもうありません。そしてrsyncを使用してください、それは良いです!

1
Dom

ユニゾンを試してみてください。ファイルを同期するための最良のオプションです。

0
jordiv

たぶん、あなたは http://rightsock.com/~kjw/Ramblings/tar_v_cpio.html これが面白いと思います。

2つのホスト間のデータ転送を並列化します。ポイントnrに特に注意してください。 5、そしてあなたのニーズに応じて適応します。

0
Luis

これには少しの作業が必要であることはわかっていますが、 [〜#〜] drdb [〜#〜] は機能しますか?これはネットワークベースのRAIDのようなもので、2つのサーバーの同期を維持することは、ケースが類似している場合、少なくともサーバーAだけがサーバーBにコピーし、常にBからAにコピーする必要がない場合は、はるかに簡単です。

0