大規模なMySQLデータベースのLVMスナップショットの毎日のバックアップを最適化しようとしています。ファイル(ローカルRAIDから他のローカルRAIDへ)をcp
するだけで、平均速度が最大100MB /秒で問題なく動作します。しかし、データベースファイル(600GB、350GBと250GBの2つのファイルのほとんど)は1日であまり変化しないので、変化したブロックだけをコピーする方が効率的だと思いました。
使っています
rsync --safe-links --inplace -crptogx -B 8388608 /source/ /destination/
それは機能し、単純なコピーよりも遅く、ターゲットディスクで読み取りアクティビティは見られませんでした。私の考えでは、rsyncはソースとの宛先から(8MB)ブロックを読み取り、チェックサムを比較して、ソースブロックをターゲットファイルにコピーするのは次の場合のみです。変更されました。私はここで間違っていますか?ブロックが変更されたかどうかを判断するために、ターゲットからrsyncが読み取られないのはなぜですか?
ここにいくつかのグラフがあります:
ディスク使用量:rsync --inplace(大きい方に対してのみ実行)最終日のファイル)は、/ mnt/backupのディスク使用量の「へこみ」を減らしました。つまり、既存のファイルを実際に更新しました。
IO統計:バックアップはsdaからsdbに作成されます。どういうわけか、ソースからの読み取りに大きなピークがあり、その後に「通常の」読み取り(ソース)+書き込み(ターゲット)アクティビティが続きます。書き込みアクティビティがほとんどない両方のデバイスからの同時読み取りを期待していましたターゲットに。
おそらく表示されているのは、ファイルがどのように変更され、rsyncがチェックサムをどのように計算しているかによるものです。 --inplaceに関するrsyncのmanページには、基本的な説明があります。
o The efficiency of rsync's delta-transfer algorithm may be reduced if some data in the destination file is overwrit- ten before it can be copied to a position later in the file. This does not apply if you use `--backup`, since rsync is smart enough to use the backup file as the basis file for the transfer.
したがって、ファイルの古いコピーを保持するために、-inplaceを使用したり、-backupを使用したりしないでください。そうは言っても、rsyncは大きなファイルをかなり非効率的に処理しているように見えるので、この仕事に最適なツールではないかもしれません。
LVMを使用していて、スナップショットデータを本当に転送したい場合は、両側で非常に計算とI/Oを集中的に使用するrsyncを実行したくないが、 lvmsyncを使用してスナップショットのCoWデータを宛先マシンにコピーする) 代わりに-これにより、おそらくより大きな転送サイズを犠牲にして、I/OとCPUサイクルを節約できます。
この問題への別のアプローチは、「ダム」ブロックデバイスチェックサム(MD5など)を実行し、 ServerFaultでのこの回答 または blocksync.pyスクリプト のように差別化ブロックを転送します。 (最近アクティブなフォークをリンクしました)。スナップショットにはまったく依存しませんが、データの一貫性が維持されるように、コピー時にスナップショットを作成することをお勧めします。
アクティブなスナップショットを使用したデータベースの書き込みパフォーマンスが心配な場合は、スナップショットとボリュームレプリケーションの最適化がいくつか含まれている ddsnap を確認して、問題を効果的に回避することもできます。
私はあなたが欲しいと信じています--inplace --no-whole-file
。ローカルファイルシステムの場合、--whole-file
が想定されます(rsyncのmanページを参照)。 nix.SEでのちょっとしたテスト を参照してください。コメントに注意してください。