💾

Borgbackupを導入してMinecraftサーバーのバックアップを劇的に改善してみた

に公開

こんにちは!
現在、友人数人と遊ぶ小規模なMinecraftサーバーを、自宅のサーバーで運用しています。今回は、バックアップに関する悩みをborgbackupというツールで解消したので、その体験談を書いておこうと思います。

抱えていた問題

ゲームが進むにつれてワールドデータは徐々に大きくなり2.4GB程度になっていました。
従来のバックアップは、一定時間ごとにワールドデータを丸ごと圧縮して保存するというものでした。
当初は30分ごとのバックアップ24時間分と1日ごとのバックアップを1週間分だけ保持するようにしていましたが、容量は70GBほどになってしまいました。

Borgbackupとの出会い

バックアップツールを色々調べていたところ、Borgbackupというツールを見つけました。特に惹かれた機能は:

  • 重複排除:同じデータは1度だけ保存する
  • 増分バックアップ:変更された部分だけを保存
  • 圧縮機能:データを効率よく圧縮
  • 柔軟な保持ポリシー:複数のバックアップポイントを管理しやすい

良さそうだったので、実際に使ってみることにしました。

検証

次のような比較テストを実施しました:

  1. 同じワールドデータ(2.4GB)に対して、zip方式とBorg方式でバックアップを実行
  2. 小さな変更(テキストファイル追加)を加えて、2回目のバックアップを実行
  3. 時間とサイズを比較

結果:

| 項目 | zip方式 | Borg方式 |
|------|--------|----------|
| 初回バックアップサイズ | 1.8GB | 1.8GB |
| 初回バックアップ時間 | 70秒 | 25秒 |
| 2回目サイズ増加分 | 1.8GB | 656バイト |
| 2回目バックアップ時間 | 70秒 | 0.17秒 |
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:                2.53 GB              1.92 GB                670 B
All archives:                5.07 GB              3.83 GB              1.92 GB
------------------------------------------------------------------------------

2回目のバックアップが0.17秒で完了し、容量も増分のみなので容量がとても小さくなりました。

実装:バックアップスクリプト

さっそく本番環境用のスクリプトを作成しました。基本的な機能だけ紹介します:

#!/bin/bash
# 設定変数
TARGET_DIR="/home/user/minecraft/world"
BORG_REPO="/home/user/minecraft/borg_backup"
TIMESTAMP=$(date +%Y-%m-%d_%H:%M:%S)
LOG_FILE="/home/user/logs/mc_borg_backup_log"

# ログ用関数
log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# バックアップ実行
backup() {
  log "バックアップを開始します..."
  
  # バックアップ前にリポジトリ初期化(初回のみ実行される)
  if [ ! -d "$BORG_REPO/data" ]; then
    mkdir -p "$BORG_REPO"
    log "リポジトリを初期化します..."
    borg init --encryption=none "$BORG_REPO"
  fi
  
  # バックアップ実行
  log "バックアップを実行中..."
  borg create --stats --compression lz4 \
    "$BORG_REPO::$TIMESTAMP" \
    "$TARGET_DIR" \
    --exclude "*/session.lock"
    
  # 古いバックアップの整理
  log "古いバックアップを整理しています..."
  borg prune --stats \
    --keep-within=48H \
    --keep-daily=7 \
    --keep-weekly=4 \
    --keep-monthly=12 \
    "$BORG_REPO"
    
  log "バックアップが完了しました"
}

# メイン処理
backup

解説:

  • 自動初期化:初回実行時はリポジトリを自動作成
  • セッションファイル除外:Minecraftのsession.lockを除外
  • 多層保持ポリシー
    • 48時間以内はすべて保持
    • 7日分の日次バックアップ
    • 4週間分の週次バックアップ
    • 12ヶ月分の月次バックアップ

段階的な移行

いきなり完全移行は不安だったので、従来のzipバックアップの末尾にBorgを追加して並行運用しました:

# 既存のバックアップスクリプトの末尾に追加
echo "============ Borgバックアップを実行 ============"
/home/user/scripts/minecraft/borg_backup.sh

3日ほど両方の方式を実行して問題ないことを確認したあと、完全にBorgのみに切り替えました。

まとめ

Borgbackupを導入して改善された点をまとめると:

  • バックアップ時間: 70秒 → 0.17秒(2回目以降)
  • ストレージ効率: 少ない容量で大量のバックアップを保持可能
  • 安心感: 30分おきのバックアップで、データ損失のリスクが大幅に減少
  • サーバー負荷: 実行時間が少なくなったことでサーバーのパフォーマンスも改善されました

Minecraftサーバーに限らず、定期的なバックアップが必要な環境ならどこでも恩恵を受けられると思います。

詳しい情報は以下のリソースを参照してください:

この記事が誰かのサーバー運用の助けになれば嬉しいです。質問やフィードバックがあればコメントください!

Discussion