ネットワーク上で論理ボリュームをあるサーバーから別のサーバーに直接移動しますか?


13

複数のVMを搭載したKVMホストマシンがあります。各VMは、ホスト上の論理ボリュームを使用します。LVを別のホストマシンにコピーする必要があります。

通常、次のようなものを使用します。

dd if=/the/logical-volume of=/some/path/machine.dd

LVをイメージファイルに変換し、SCPを使用して移動するには。次に、DDを使用して、新しいホスト上の新しいLVにファイルをコピーします。

この方法の問題は、両方のマシンでVMが使用するディスク容量の2倍の容量が必要なことです。すなわち。5GB LVはLVに5GBのスペースを使用し、ddコピーもイメージに追加の5GBのスペースを使用します。これは小さなLVには問題ありませんが、(私の場合のように)大きなVMに500GBのLVがある場合はどうでしょうか?それは500ギガバイトは、画像ファイルをddを保持することはできませんので、新しいホストマシンは、1TBのハードディスクドライブを持っているにコピーする500ギガバイトの論理ボリュームを持っている、ホストOSの余地持っ他の小さなゲストのための部屋を。

私がやりたいのは次のようなものです:

dd if=/dev/mygroup-mylv of=192.168.1.103/dev/newvgroup-newlv

つまり、ネットワークを介して1つの論理ボリュームから別の論理ボリュームにデータを直接コピーし、中間イメージファイルをスキップします。

これは可能ですか?


回答:


24

もちろん、それは可能です。

dd if=/dev/mygroup-mylv | ssh 192.168.1.103 dd of=/dev/newvgroup-newlv

ブーム。

とはいえ、自分自身に賛成して、デフォルトのブロックサイズよりも大きいものを使用してください。bs = 4M(4 MB単位で読み取り/書き込み)を追加することもできます。あなたはコメントでブロックサイズについていくつかの細かい点があることがわかります。これがかなり頻繁に行われていることがわかった場合は、少し時間をかけて、異なるブロックサイズで何度か試してみて、最適な転送速度が得られるものを確認してください。

コメントからの質問に答える:

pvを介して転送をパイプして、転送に関する統計を取得できます。にシグナルを送信することで得られる出力よりもはるかに優れていますdd

もちろん、netcat(または暗号化のオーバーヘッドを課さない他の何か)を使用する方が効率的ですが、通常、速度が上がると利便性が失われます。本当に大きなデータセットを移動する場合を除き、ほとんどの場合、すべてがJust Workに設定されているため、オーバーヘッドにもかかわらず、通常はsshを使い続けます。


1
bsはコピー速度にのみ影響しますか、それともデータの保存方法に影響しますか?
ニック

3
データの保存方法には影響しませんが、読み取りと書き込みにデフォルトのブロックサイズ(512バイト)を使用するよりもはるかに効率的です。
ラースク

3
@Nick:Linuxでは、ddプロセスにUSR1シグナルを送信して、転送された量を示すステータス行を表示させることができます。のddようなものでプロセスのプロセス番号を取得ps aux | grep ddし、コマンドでこのPIDを使用しますkill -USR1 $PID。メッセージは、開始した元の端末に表示されますdd
スベン

3
おそらく、sshへのパイプへの書き込みをブロックし、そのほとんどをネットワークソケットに転送し、その間ディスクがアイドル状態になるため、そのような大きなbsは使用しないでしょう。デフォルトの先読みサイズは128kなので、おそらくこれに固執したいでしょう。または、ディスクの先読みサイズを増やします。
-psusi

1
@psusi:質問の下にコメントとして配置されたリンクZoredacheは反対を示し、16Mブロックサイズで最速の結果を得ましたが、転送方法としてsshの代わりにnetcatを使用しました。
スヴェン

18

最適化されたバージョンは、pvBSを使用して進捗状況を表示し、より大きなチャンクにBSを使用gzipし、ネットワークトラフィックの削減にも使用します。

インターネットサーバーなどの低速接続間でデータを移動する場合に最適です。画面またはtmuxセッション内でコマンドを実行することをお勧めします。そうすれば、コマンドを実行するホストからのSSH接続を問題なく切断できます。

$ dd if=/dev/volumegroupname/logicalvolume bs=4096 | pv | gzip | \
    ssh root@78.46.36.22 'gzip -d | dd of=/dev/volumegroupname/logicalvolume  bs=4096'

2
ssh -C代わりに使用できますgzip。パフォーマンスに影響があるかどうかはわかりませんが、入力はずっと少なくなります。
サミュエルエドウィン区14年

1
また、gzipの代わりにpigzまたはpxz -1を使用することをお勧めします。マルチスレッド最新のサーバーで本当に役立ちます。
sCiphre

pvバイト数で問題が発生する可能性があり(私の経験では、このシステムを使用して他のサーバーに500 vpsを移動します)、この問題の後、lvmボリュームは一貫していません。仕事の進行状況の恩恵はゼロであり、ダンゲオルスです。進行状況を確認するには、iftoなどでコンソールを開きます。
abkrim

4

古い友人を使ってこれを行うのはどうですか。NetCat。

論理ボリュームタイプを失っているシステム上

  • $ dd if=/dev/[directory]/[volume-name] | nc -l [any high number port]

次に、受信システムで。タイプ

  • $ nc -w 10 [ip or name] [port] | dd of=/dev/[directory/[volume name]

翻訳し、このファイルを元のボックスにddし、このポートをリッスンするnc(netcat)にパイプします。受信システムでは、netcatが[port]で[ipまたはname]を閉じる前にデータを受け取らない場合は10秒待機し、そのデータをddにパイプして書き込みます。


2
NetcatはこれらのオプションでUDPを使用しません。
サミュエルエドウィン区14年

3

まず、lvのスナップショットを取得します。

lvcreate --snapshot --name my_shot --size <thesize> /dev/<name of vg>/<name of lv>

その後、同じサイズで新しいホストに新しいlvを作成する必要があります(lvcreateを使用するなど)。その後、データを新しいホストに直接コピーできます。copyコマンドの私の例を次に示します。

dd if=/dev/vg0/my_shot bs=4096 | pv | ssh root@some_host -C 'dd of=/dev/vg1/<created lv> bs=4096'

この手順を使用して、proxmox pveが管理するVMを別のホストにコピーしました。論理ボリュームには、VM自体によって管理される追加のLVがいくつか含まれていました。


2

最初に、論理ボリュームがマウントされていないことを確認してください。それがあり、「ホットコピー」を作成する場合は、最初にスナップショットを作成し、代わりにこれを使用します。 lvcreate --snapshot --name transfer_snap --size 1G

2つの1Gbit接続サーバー間で大量のデータ(7TB)を転送する必要があるため、そのために可能な限り高速な方法が必要でした。

SSHを使用する必要がありますか?

sshの使用は、暗号化のためではなく(AES-NIをサポートするCPUを使用している場合、それほど害はありません)、ネットワークバッファーのためです。それらはうまくスケーリングされていません。この問題に対処するパッチが適用されたSshバージョンがありますが、プリコンパイルされたパッケージがないため、あまり便利ではありません。

圧縮を使用する

生のディスクイメージを転送するときは、常に圧縮を使用することをお勧めします。ただし、圧縮がボトルネックになることは望ましくありません。gzipのようなほとんどのUNIX圧縮ツールはシングルスレッドであるため、圧縮が1つのCPUを飽和させると、ボトルネックになります。そのため、すべてのCPUコアを圧縮に使用するgzipバリアントであるpigzを常に使用します。そして、これはGBit以上の速度にしたいのに必要です。

暗号化を使用する

前に言ったように、sshは遅いです。AES-NI CPUを使用している場合、これがボトルネックになることはありません。したがって、sshを使用する代わりに、opensslを直接使用できます。

スピード

コンポーネントの速度への影響のアイデアを提供するために、ここに私の結果があります。これらは、メモリの読み取りと書き込みを行う2つのプロダクションシステム間の転送速度です。実際の結果は、ネットワーク速度、HDD速度、ソースCPU速度に依存します!少なくともパフォーマンスの大幅な低下がないことを示すためにこれを行っています。 Simple nc dd: 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 47.3576 s, 106 MB/s +pigz compression level 1 (speed gain depends on actual data): network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 38.8045 s, 130 MB/s +pigz compression level 5: network traffic: 2.43GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 44.4623 s, 113 MB/s +compression level 1 + openssl encryption: network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 43.1163 s, 117 MB/s 結論:圧縮を使用すると、データサイズが大幅に削減されるため、顕著な高速化が得られます。ネットワーク速度が遅い場合、これはさらに重要です。圧縮を使用する場合は、CPUの使用状況を確認してください。使用量が上限に達した場合は、使用せずに試すことができます。AES-NIシステムへのわずかな影響として圧縮を使用すると、圧縮から30〜40%のCPUを盗むためだけに私見されます。

画面を使用する

私のような大量のデータを転送している場合、sshクライアントのネットワーク切断によって中断されたくないので、両側の画面から開始した方がよいでしょう。これは単なるメモであり、ここではスクリーンチュートリアルを作成しません。

コピーしましょう

いくつかの依存関係をインストールします(ソースと宛先に): apt install pigz pv netcat-openbsd

次に、ソースと同じサイズのボリュームを宛先に作成します。不明な場合は、ソースでlvdisplayを使用してサイズを取得し、ターゲットを作成します。例: lvcreate -n lvname vgname -L 50G

次に、データを受信するための宛先を準備します。

nc -l -p 444 | openssl aes-256-cbc -d -salt -pass pass:asdkjn2hb | pigz -d | dd bs=16M of=/dev/vgname/lvname

そして準備ができたら、ソースで転送を開始します。

pv -r -t -b -p -e /dev/vgname/lvname | pigz -1 | openssl aes-256-cbc -salt -pass pass:asdkjn2hb | nc <destip/host> 444 -q 1

注:データをローカルに転送する場合、または暗号化を気にしない場合は、両側からOpenssl部分を削除するだけです。気になる場合は、asdkjn2hbが暗号化キーであるため、変更する必要があります。


PROXMOXサーバーでこれを絶対にしないでください:apt install netcat-openbsd netcat-openbsdをインストールすると、サーバーからProxMoxが完全に消去され、5時間以上のダウンタイムと作業が発生しました!!!
ゾルタン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.