BunaML’s diary

機械学習、音声・自然言語、Machine Learning, NLP, Audio, Software Development

Ubuntuでバックアップサーバーを作る

効率的で堅牢なバックアップサーバーをLinuxで作りたい
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トンネルを使用して安全にデータを転送し、帯域幅の制限と暗号化を行う。

検討事項

  1. ハードウェアの選択
    将来的なデータの成長を考慮し十分なストレージ容量を確保する。RAID 6またはRAID 10を推奨。

  2. ネットワーク設定
    バックアップトラフィックが本番環境に影響を与えないようQoS設定を行う。

  3. ドキュメンテーション
    バックアッププロセスとポリシーを文書化し随時更新する。

  4. テストと監視
    バックアップシステムのテストと監視を定期的に行い、予期せぬ障害を防ぐ。