50 万以上のファイルを毎日バックアップする最も速い方法は何ですか?

50 万以上のファイルを毎日バックアップする最も速い方法は何ですか?

これまでに 54 万枚を超える画像を生成したアプリケーションがあります。画像はツリー構造で保存されており、これまでに 500 万個の Inode を使用しています。

リモートのオフサイト サーバーにデータを毎日バックアップしたいと考えています。rsync の使用を検討しましたが、これが最速の方法かどうかはわかりません。

効率的なバックアップ戦略について何かお勧めはありますか?

答え1

ああ、変更されたファイルを見つけるために毎日 5,000,000 個の inode をスキャンするのは、とても時間がかかります。

前回のバックアップ以降の変更のみをバックアップする方法があったらどうでしょうか?

ええ、できますよ…スナップショット

スナップショットの最大の障害は、スナップショットをサポートするファイル システムに切り替えることです。

Linux では、次の 2 つのよく知られたスナップショット ファイル システムがあります。

  • Btrfs– Linux向けに設計されており、実戦テストは少ない
  • ZFS– Linuxに移植されており、長く利用されている

どちらもコピーオンライトファイルシステム実際には、最後のスナップショット以降の変更が追跡されるため、最新のスナップショットをバックアップ サーバーに送信すると、変更のみが送信されますが、保持することにしたすべての毎日のバックアップの完全なコピーが保持されます。

つまり、ボーナスとして、余分なスペースをほとんど使用せずに (毎日の変更によって使用されるディスク スペースのみ) 1 日分以上のバックアップを保持できる可能性があり、必要に応じて週ごと、月ごと、または年ごとのバックアップを保持しながら、バックアップを柔軟に削除できます。

Btrfs 増分バックアップ

これは、増分バックアップを作成してバックアップ サーバーに送信するために実行できるコマンドの例です。

# Make a snapshot
btrfs subvolume snapshot -r /app/data /backup/app-data-$(date "+%Y%m%dT%H%M%S%Z")

# Ensure the snapshot is saved
sync

# Find your latest snapshot, referred to as `/backup/app-data-THIS_BACKUP_TIMESTAMP` below
ls -lhtr /backup/

# Send the snapshot since the previous snapshot to the backup server
btrfs send -p /backup/app-data-LAST_BACKUP_TIMESTAMP /backup/app-data-THIS_BACKUP_TIMESTAMP | ssh BACKUP_USER@BACKUP_SERVER "btrfs receive /backup/app-data"

注記:-p /backup/app-data-LAST_BACKUP_TIMESTAMPこれが最初のバックアップである場合は、最後のコマンドから除外します。

ZFS 増分バックアップ

これは、増分バックアップを作成してバックアップ サーバーに送信するために実行できるコマンドの例です。

# Create a snapshot of the "data" dataset in your "app-pool" zpool
zfs snapshot app-pool/data@$(date "+%Y%m%dT%H%M%S%Z")

# Find your latest snapshot, referred to as `app-pool/data@THIS_BACKUP_TIMESTAMP` below
zfs list -rt snapshot app-pool/data

# Send the snapshot since the previous snapshot to the backup server
zfs send -i app-pool/data@LAST_BACKUP_TIMESTAMP app-pool/data@THIS_BACKUP_TIMESTAMP | ssh BACKUP_USER@BACKUP_SERVER "zfs receive backup-pool/app-data"

注記:-i app-pool/data@LAST_BACKUP_TIMESTAMPこれが最初のバックアップである場合は、最後のコマンドから除外します。

関連情報