Ubuntuでバックアップサーバーを作る
Ubuntu 22を搭載した汎用サーバーを使用し、効率的かつ安全なバックアップシステムを構築する
システムの概要
ローカルおよびリモートネットワーク上の複数のサーバーで構成され、主に以下の特徴を持つ。
- 暗号化によるデータ保護
- アクセス権限制御によるデータの改変防止
- RAIDを用いたデータの冗長化
- 定期的なバックアップとデータの整合性チェック
ハードウェア設定
バックアップサーバー
拡張性を考慮して選択。ドライブベイが多く、冗長電源とハードウェアRAIDコントローラを備えたものが理想的。
RAID構成
RAID 6を採用し、2台のドライブが故障してもデータが保護されるようにする。
ネットワーク
アクセスの高速化と冗長性のため、デュアルギガビットまたは10ギガビットイーサネットアダプターを装備。QoS設定を使用し、バックアップトラフィックが本番環境の帯域幅を消費しないようにする。
バックアッププロセス
ファイルシステム
ZFSやBtrfsなど、スナップショットと暗号化をサポートするファイルシステムを使用。
Rsynの利用
SSH経由でrsync
を用いて安全な差分バックアップを実行。bwlimit
オプションを用いてバックアップ中の帯域幅を制限する。
スケジューリング
cron
ジョブを使用して、毎晩午前3時にバックアップを自動的に実行。
スナップショット
各バックアップの後、読み取り専用のスナップショットを作成し、データの改変や削除を防止。
バックアップの保持期間
特定の期間(例: 3ヶ月)保持された後に自動的に削除されるよう設定。
暗号化
静止状態のデータ保護のため、dm-crypt
を使ったLUKSによる暗号化を行う。
メールによる報告
バックアップの完了後、そのステータスをメールで自動報告するスクリプトを使用。
整合性チェック
バックアップデータのチェックサムやハッシュを定期的に実行し、以前の値と比較して整合性を確認。
実装例
バックアップスクリプト
dbサーバーに以下のスクリプトを配置することで差分バックアップを行い、その結果をログに記録しメールで通知する。
#!/bin/bash # Configuration BACKUP_SERVER="backupuser@backupserver" BACKUP_PATH="/mnt/backup_drive/db_backups" DB_DATA_PATH="/path/to/db/data" LOG_FILE="/var/log/db_backup.log" BWLIMIT=10000 # Bandwidth limit in KBytes per second # Function to send email notification send_email () { echo "$1" | mail -s "$2" admin@example.com } # Perform differential backup rsync -avz --bwlimit=$BWLIMIT --delete --delete-excluded \ --exclude 'excluded_files_pattern' \ $DB_DATA_PATH $BACKUP_SERVER:$BACKUP_PATH >> $LOG_FILE 2>&1 # Check if rsync was successful if [ $? -ne 0 ]; then send_email "Backup failed. See $LOG_FILE for details." "Backup Failure" exit 1 else send_email "Backup succeeded." "Backup Success" fi # Create an immutable snapshot (Assuming Btrfs) ssh $BACKUP_SERVER "sudo btrfs subvolume snapshot -r $BACKUP_PATH ${BACKUP_PATH}_$(date +%F)" # Report integrity check CHECKSUM_FILE="/tmp/backup_checksums.sha256" find $DB_DATA_PATH -type f -exec sha256sum {} \; > $CHECKSUM_FILE scp $CHECKSUM_FILE $BACKUP_SERVER:$BACKUP_PATH ssh $BACKUP_SERVER "cd $BACKUP_PATH && sha256sum -c $(basename $CHECKSUM_FILE)" >> $LOG_FILE 2>&1 # Send the checksum results if [ $? -ne 0 ]; then send_email "Backup integrity check failed. See $LOG_FILE for details." "Backup Integrity Failure" else send_email "Backup integrity check succeeded." "Backup Integrity Success" fi # Cleanup rm $CHECKSUM_FILE
スクリプトを実行可能にする
sudo chmod +x /usr/local/bin/backup_script.sh
クロンジョブの設定
以下のコマンドで毎晩定刻にバックアップスクリプトを実行。
0 3 * * * /usr/local/bin/backup_script.sh
スナップショット保持スクリプト
バックアップサーバーに以下のスクリプトを配置し、古いスナップショットを定期的に削除。
#!/bin/bash # Configuration SNAPSHOT_PATH="/mnt/backup_drive/db_backups" RETENTION_DAYS=90 # Delete snapshots older than retention period find $SNAPSHOT_PATH -maxdepth 1 -type d -name "*_snapshot" -mtime +$RETENTION_DAYS -exec rm -rf {} \;
リモートバックアップの設定
リモートネットワークへのバックアップも同様の手順で設定する。VPNまたはSSHトンネルを使用して安全にデータを転送し、帯域幅の制限と暗号化を行う。
検討事項
ハードウェアの選択
将来的なデータの成長を考慮し十分なストレージ容量を確保する。RAID 6またはRAID 10を推奨。ドキュメンテーション
バックアッププロセスとポリシーを文書化し随時更新する。テストと監視
バックアップシステムのテストと監視を定期的に行い、予期せぬ障害を防ぐ。