巨大なスパースファイル(VMディスクイメージ)をマシン間でどのように同期しますか?


22

あるLinuxサーバーから別のLinuxサーバーに巨大でスパースなファイルを同期できるrsyncなどのコマンドはありますか?

宛先ファイルがまばらであることは非常に重要です。それを含むドライブよりも長い(ただし大きくはない)場合があります。変更されたブロックのみをネットワーク経由で送信する必要があります。

私はrsyncを試しましたが、喜びはありませんでした。https://groups.google.com/forum/#!topic/mailing.unix.rsync/lPOScZgFE9M

これを行うプログラムを作成する場合、ホイールを再発明するだけですか? http://www.finalcog.com/synchronise-block-devices

おかげで、

クリス。


rsyncは、大きなファイルでは非常に非効率的です。でも--inplaceでは、まず、ターゲットホスト上のファイル全体を読んでますTHENローカルホスト上のファイルを読み込みを開始点と相違点(ただのrsyncを実行中にDSTATまたは類似を実行し、観察)を転送
ndemou

回答:


21
rsync --ignore-existing --sparse ...

スパースモードで新しいファイルを作成するには

に続く

rsync --inplace ...

すべての既存のファイル(以前に作成されたスパースファイルを含む)をその場で更新します。


3
持っている、それを逆にrsync --existing --inplaceして、rsync --ignore-existing --sparse同期の高速化持っている
マイク・

2
誰もマイクのコメントとこれが同期をどのようにスピードアップするべきかを説明できますか?
Preexo

マイクは最初のインプレース変更を意味し、次に新しいものを追加することを意味すると思います。そのため、新しいものは、最初の呼び出しと2番目の呼び出しの時間差のために再びインプレースする必要はありません。データストアから直接rsyncし、VMが実行されている場合にのみ当てはまります。彼が何か他のものを意味しない限り?

元に同意します。Stevesの2番目のコマンドは、新しいファイルを再びrsyncします。これは、Mikesコマンドシーケンスを使用して安全にできます。
ファルスタッフ

rsyncは、大きなファイルでは非常に非効率的です。質問に対する私のコメントをご覧ください。
ndemou

5

Rsyncは各ファイルに変更を転送するだけで、-inplaceを使用すると、ファイルを再作成せずに変更されたブロックのみを書き換える必要があります。機能ページから。

rsyncは、Unixシステム用のファイル転送プログラムです。rsyncは、リモートファイルを同期させる非常に高速な方法を提供する「rsyncアルゴリズム」を使用します。これは、ファイルの両方のセットがリンクの一方の端に事前に存在することを必要とせずに、ファイルの違いのみをリンクを介して送信することによってこれを行います。

--inplaceを使用するとうまくいくはずです。これにより、進行状況の表示、転送の圧縮(デフォルトの圧縮レベルでの)、ローカルストレージディレクトリの内容の再帰的な転送(最初の末尾のスラッシュが重要)が行われ、所定のファイルに変更が加えられ、トランスポートにsshが使用されます。

rsync -v -z -r --inplace --progress -e ssh /path/to/local/storage/ \
user@remote.machine:/path/to/remote/storage/ 

私はよく-aフラグも使用しますが、これはさらにいくつかのことを行います。これは-rlptgoDと同等です。正確な動作は、manページで確認してください。


1
'-S'はスパースファイル用であり、 'chops long lines'ではありません。manページから:-S、-sparseはスパースファイルを効率的に処理します。これを試してみます、ありがとう。
フェードビー

修正したおかげで-あなたが与えたリンクで言われたことから離れていました。
reconbot

いいえ、残念ながらこれで問題は解決しません。それはありません、ファイルの同期が、それは非スパースファイルに遠端でスパースファイルになります。Ubuntu 9.04に付属のssh / rsyncを使用しています。
フェードビー

上記のコメントは間違っていました。問題は、rsyncが最初のコピーで非スパースファイルを作成することでした。--inplace rsyncは、宛先ファイルが既に存在し、元の​​ファイルと同じ長さ(大きくない)であれば、正しく機能します。これで解決できましたが、ターゲットサーバーに各ファイルが既に存在するかどうかを確認する必要があります。存在する場合は--inplaceを実行し、存在しない場合は--sparseを使用します。これは理想的ではありませんが、機能します。
フェードビー

rsyncは、大きなファイルでは非常に非効率的です。質問に対する私のコメントを参照してください
ndemou

4

私はこれを行うソフトウェアを書くことになりました:

http://www.virtsync.com

これは、物理サーバーあたり49ドルかかる商用ソフトウェアです。

50GBのスパースファイル(3GBのコンテンツ)を家庭用ブロードバンドで3分未満で複製できるようになりました。

chris@server:~$ time virtsync -v /var/lib/libvirt/images/vsws.img backup.barricane.com:/home/chris/
syncing /var/lib/libvirt/images/vsws.img to backup.barricane.com:/home/chris/vsws.img (dot = 1 GiB)
[........>.........................................]
done - 53687091200 bytes compared, 4096 bytes transferred.

real    2m47.201s
user    0m48.821s
sys     0m43.915s 

4
TBHは、変更できるデータの量に明らかに依存するため、同期できる開始タイミングはほとんど意味がありません。より正確に言うと、ソフトウェアがどのブロックが変更されたかを把握するのに3分かかり、その速度でさえ、おそらくディスクI / Oと、おそらく利用可能なCPUサイクルに依存するということです。
リアリティエクストラクター

6
これは、ネットワーク機能に98ドル以上かかる商用ソフトウェアであることを開示する必要があります。
リード

あなたのためにうまくいったソフトウェアを私たちに教えてくれてありがとう、人々は今、彼らが必要に応じて考慮し、使用するか、使用しないことができます。他に何も新しいことに貢献してくれた他の二人に感謝しません。
フロリアンハイグル

3

ツールを介してバイナリ「rsync」を使用して「スナップショット」バックアップを実装するZumastor Linux Storage Projectご覧くださいddsnap

マンページから:

ddsnapは、複数の同時スナップショットを効率的に保持できるブロックレベルスナップショット機能を備えたブロックデバイスレプリケーションを提供します。ddsnapは、2つのスナップショット間で異なるスナップショットチャンクのリストを生成し、その差をネットワーク経由で送信できます。ダウンストリームサーバーで、更新されたデータをスナップショットブロックデバイスに書き込みます。


2

lvmsyncはこれを行います。

これが使用記録です。ソースでLVMスナップショットを作成し、論理パーティションを転送します。スナップショットの作成以降、変更の増分更新を好きなだけ転送できます。


私はそれを試してみましたが、機能せず、作者はサポートするつもりはありません
-user1007727

1
@ user1007727はサポートする意思がない、または無料でサポートする意思がないのですか?
フェードビー14

過去にlvmsyncを使用しましたが、機能しましたが、「製品グレード」のソフトウェアimoではありません。:-)
フロリアンハイグル

1

ファイルシステム全体を複製することは解決策でしょうか?DRBD?http://www.drbd.org/


ここではdrbdが良い解決策だとは思いませんが、rsyncのアイデアは、ディスクイメージファイルではなく、fs全体を置き換えることで、興味深いものです。rsyncがこれを許可するかどうかは
わかりませ

1

ここでは少し奇妙かもしれませんが、最近、NFSがこの問題を処理することがわかりました。

そのため、あるマシンのディレクトリをエクスポートし、別のマシンにマウントして、ファイルをのような基本的なユーティリティでコピーするだけcpです。(古い/古いユーティリティの中には、スパースファイルに問題がある場合があります。)

rsyncスパースファイルの転送では特に効率が悪いことがわかりました。


1

小さいファイルから中程度の違いを持つ巨大なファイルまたはブロックデバイスを同期するには、プレーンコピーを実行するか、bdsyncを使用します。rsyncはこの特定のケースにはまったく適合しません*。

bdsync私のために働いた、十分に成熟したようだ、それはバグの歴史が勇気づけられている(小さな問題、迅速な解決)。私のテストでは、速度は理論上の最大値に近かった**(つまり、ファイルを読むのに必要な時間で同期できる)。最後に、それはオープンソースであり、費用はかかりません。

bdsync両方のホストからファイルを読み取り、チェックサムを交換してそれらを比較し、違いを検出します。これらすべてを同時に。最後に、ソースホスト上に圧縮パッチファイルを作成します。次に、そのファイルを宛先ホストに移動し、bdsyncを2回実行して宛先ファイルにパッチを適用します。

かなり高速なリンク(100Mbitイーサネットなど)で使用し、小さな違いのあるファイル(VMディスクでよくあることです)で使用する場合、ファイルの読み取りに必要な時間に同期する時間を短縮します。低速リンクでは、1つのホストから別のホストに圧縮された変更をコピーする必要があるため、もう少し時間が必要です(素晴らしいトリックを使用し時間を節約できるようですがテストしていません)。


*:rsyncは巨大なファイルでは非常に非効率的です。--inplaceを使用しても、宛先ホスト上のファイル全体を最初に読み取り、その後、ソースホスト上のファイルの読み取りを開始し、最後に差分を転送します(rsyncおよびobserveの実行中にdstatなどを実行するだけです)。その結果、わずかな違いのあるファイルであっても、同期するためにファイルを読み取るのに必要な時間の約2倍の時間がかかります。

**:ファイルのどの部分が変更されたかを伝える他の方法がないという仮定の下で。LVMスナップショットはビットマップを使用して変更されたブロックを記録するため、非常に高速になります(lvmsyncのreadmeに詳細があります)。


0

私はそのようなユーティリティを知らず、それを処理できるシステムコールのみを知っているので、あなたがそのようなユーティリティを書くなら、それはかなり役立つかもしれません。

実際にできることは、qemu-img convertを使用してファイルをコピーすることですが、宛先FSがスパースファイルをサポートしている場合にのみ機能します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.