リモートシステム間で巨大なファイル(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:マシン上で実行されている他のバイナリ(メインアプリケーション)があり、平均負荷が高いため、パフォーマンスが低下しています。
この問題は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"
最小限の解決策は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と組み合わせて使用されるため、ここでは高速化していません。
暗号化が問題にならない場合は、C
にNFSデーモンをスローし、B
にディレクトリをマウントします。 B
でrsync runを使用しますが、ローカルディレクトリパスを指定します。
A
を使用するユースケースを無視して、コマンドの前にssh user@B rsync...
を追加します。
暗号化オーバーヘッドなしでデータを転送し、異なるファイルのみを転送します。
また、FTPは、プロトコル機能としてサードパーティのサーバー間転送で構築されました。
低暗号化方式を使用できます:rsync --rsh="ssh -c arcfour"
速度を上げます。私のテストでは、ディスクを待ち、ネットワーク接続はもうありません。そしてrsyncを使用してください、それは良いです!
ユニゾンを試してみてください。ファイルを同期するための最良のオプションです。
たぶん、あなたは http://rightsock.com/~kjw/Ramblings/tar_v_cpio.html これが面白いと思います。
2つのホスト間のデータ転送を並列化します。ポイントnrに特に注意してください。 5、そしてあなたのニーズに応じて適応します。
これには少しの作業が必要であることはわかっていますが、 [〜#〜] drdb [〜#〜] は機能しますか?これはネットワークベースのRAIDのようなもので、2つのサーバーの同期を維持することは、ケースが類似している場合、少なくともサーバーAだけがサーバーBにコピーし、常にBからAにコピーする必要がない場合は、はるかに簡単です。