株式会社クイックのWebサービス開発blog

HAPPYなエンジニア&デザイナーのブログです

即実践できるBaculaの設定例【運用手順編】

前々回の【構築手順編その1】、前回の【構築手順編その2】 では構築部分を紹介しました。
今回は【運用手順編】として、どうBaculaを運用しているかを設定例やスクリプトを書きたいと思います。
ここおかしいよー!とかあれば、コソッと教えてもらえたらありがたいです!

ラーメンのスープが髭に付くことが最近の悩み。
matsBです。(๑•̀ㅂ•́)و✧


髭は伸ばしてる訳ではなく、単に伸びてるだけです。

運用部分は会社や規模によって大きく変わるので、一概にこれが正しいとは言えないんですがクイックではこうやってるよーって事を書いていきます。
逆に、「うちではこう運用してるよー」ってのがあれば、コメントに書いても直接連絡して頂いても嬉しいです!

前提 (前の記事からのおさらい)

前提環境

MySQLをインストール済。
iptables等のFirewallは一旦無視してます。

サーバ情報

役割 ホスト名 IPアドレス
Director quick-dir 10.0.0.1
Client quick-fd 10.0.0.2
Client(DR用) quick-dr 10.0.0.3
Storage quick-sd 10.0.0.10

bat(BaculaのGUIツール)

慣れてくると基本的にはコマンド(CUI)の方が圧倒的に早いんですが、慣れるまではGUIの方が分かりやすいです。
普段使ってるパソコンがWindowsであれば、Xming等を入れてdisplayをforwardできるようにしておいて、SSHクライアントもX11をforward出来るようにしておいて下さい。

動作環境の準備

[root@quick-dir ~]# yum install -y xorg-x11-apps
[root@quick-dir ~]# xeyes

とかでX Window Systemを使ってるアプリを起動させてちゃんと表示できれば、基本的にbatが使える環境になってます。
もしサーバ側にX11の準備をしてなくて「Error: Can’t open display:」とかで見れない場合は、

[root@quick-dir ~]# yum groupinstall "X Window System"

とかでインストールしてやれば、不要なものも入ってきますがとりあえずで動かすことは出来ます。

batのインストール

[root@quick-dir ~]# yum install -y bacula-console-bat

batの設定

[root@quick-dir ~]# cat /etc/bacula/bat.conf
Director {
  Name = quick-dir
  DIRport = 9101
  address = localhost
  Password = "dir-password"
}

Directorのサーバに入れたくなければ、自分のテスト環境等にbatとX Window Systemを入れて

address = localhost
 ↓
address = 10.0.0.1

って感じにIPアドレスをDirectorのサーバにすれば大丈夫です。

自動で古いVolume(Purged)のDELETEとファイル削除

【構築手順編】で書いた設定例だとVolumeはリサイクルされず、保存期間が過ぎたVolumeはPurgedになります。
これはデフォルトだと、「どのクライアント」の「どのレベルのバックアップ」で「何が最新なのか」が全然分からなかったので、Label Formatを全部ユニークでパッと見で全部分かるようにしたかったからです。

Label Format = "${Client}-${Level}Vol-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}_${JobId}"
quick-fd-DifferentialVol-2017-04-08_1130ってVolume名になります。

ユニークにしてるので、リサイクルさせると訳わからん状態になるからリサイクルさせてません。
ただ、bacula的にはPurgedになるだけでCatalogから削除もされないしVolumeの実体ファイルもそのまま残るので、いつかbacula-sdの容量が100%になって破綻してしまいます。
そこで、一日一回キレイに削除する作業が必要になりますが、手動はしんどいのでBaculaで自動化させます。

前提

【事実】
・quick-dirとquick-sdは別サーバ。
・quick-sdにbconsoleを入れていて、向き先はquick-dirになっている。
・bacula-sdの設定でファイルは/data/bacula-backup/に全て置かれている。
【願望】
・この削除作業は全てのバックアップが完了した後に実行したい。

purgedの数をチェック

シンプルに下記のようなシェルで、ステータスがPurgedのVolumeの数を見れます。

[root@quick-sd ~]# cat /var/spool/bacula/check_purged.sh
#!/bin/bash
echo "list volumes" | bconsole | grep "Purged" | awk {'print $4'} | wc -l

purgedの状態のVolumeのファイル削除とDELETE

PurgedをgrepしてVolume名を特定させて、ファイル削除して、BaculaからDELETEさせてます。

[root@quick-sd ~]# cat /var/spool/bacula/purged_delete.sh
#!/bin/bash
for f in `echo "list volume" | bconsole | grep "Purged" |awk -F" " '{print $4}'`; do
  rm -f /data/bacula-backup/$f;
  echo "delete volume=$f yes" | bconsole;
done

BaculaのJobにする

「・この削除作業は全てのバックアップが完了した後に実行したい。」
とあるので、cron等で定期実行してしまうとバックアップ完了時間が前後した時に対応できなくなってしまいます。
なので空のバックアップJobを作成して、シェルだけ動くようにしました。
本当はBaculaに全部やらせなくても解決出来る問題なんですが、せっかくだからBaculaで完結させてみた。って感じです。

bacula-fd(Backup Client)のインストール

[root@quick-sd ~]# yum install -y bacula-client

bacula-fd(Backup Client)の設定は前回説明したので割愛します。

bacula-dirにquick-sdのクライアントの設定configを作成

[root@quick-dir ~]# cat /etc/bacula/client/00_quick-sd.conf
############################
# Job Information
############################
Job {
  Name = "quick-sd-job"
  Client = quick-sd
  JobDefs = "DefaultJob"
  FileSet= "quick-sd File Set"
  Schedule = "WeeklyCycleAfterBackup"
  Full Backup Pool = etc-Pool
  Client Run After Job = "/var/spool/bacula/purged_delete.sh"
  Priority = 11
}

############################
# FileSet
############################
FileSet {
  Name = "quick-sd File Set"
}

############################
# bacula-fd Information
############################
Client {
  Name = quick-sd
  Address = 10.0.0.10
  FDPort = 9102
  Catalog = MyCatalog
  Password = "fd-password"
  File Retention = 1 days
  Job Retention = 1 days
  AutoPrune = yes
}

JobのPriorityを11にすることによって、他のバックアップ(Priority=10)が完了した後に、purged_delete.shが動くことになり「・この削除作業は全てのバックアップが完了した後に実行したい。」を満たす事になります。
FileSetが空なのでファイルは何もバックアップされず、空のVolumeだけが作成されて1日でPurgedになるようにしています。

上記ファイルを外部ファイルとして読み込む

[root@quick-dir ~]# grep "00_quick-sd.conf" /etc/bacula/bacula-dir.conf
@/etc/bacula/client/00_quick-sd.conf
[root@quick-dir ~]# /etc/init.d/bacula-dir restart
Stopping bacula-dir:                                        [  OK  ]
Starting bacula-dir:                                        [  OK  ]

これで全てBaculaが自動で古いVolume(Purged)のDELETEとファイル削除をしてくれるようになりました。

注意点

今回説明した設定だと4週間の保存期間ですが、運用してる途中で「やっぱり2ヶ月」残したいなーと思ってPoolのVolume Retentionを「28 days」から「60 days」に変更したとします。

  Volume Retention = 28 days
    ↓
  Volume Retention = 60 days

この変更して再起動させても新規で作成されたVolumeが60日の保管期間になるだけで、古いVolumeは保存期間が4週間のままです。なので4週間経つとPurgedにされてしまいます。
そんな時は、下記のように変更したいVolumeと何日保存するかを書いて、VolRetentionを一括変更すれば楽な運用ができます。

[root@quick-dir ~]# cat retention.sh
#!/bin/bash

VolumeName=quick-fd-DifferentialVol
RetentionDate=60days

for f in `echo "list volume" | bconsole | grep $VolumeName |awk -F" " '{print $4}'`; do
  echo "update volume=$f VolRetention=$RetentionDate" | bconsole

done

jenkinsでデータのRestore

クイックではjenkinsを使ってますが、jenkinsのプラグインにBaculaは存在してませんでした。
jenkinsでポチッとビルドするだけでDBの復旧とか、DEV環境にデータ復元してすぐ使えるようになったら楽なのになーと思いやってみることにしました。

jenkinsサーバにbconsoleをインストール

[root@jenkins ~]# yum install bacula-console.x86_64
[root@jenkins ~]# cat /etc/bacula/bconsole.conf
Director {
  Name = quick-dir
  DIRport = 9101
  address = 10.0.0.1
  Password = "dir-password"
}

jenkinsのJobの設定

リストア後に何かしらの作業をしたいのですが、bconsoleからリストアするとBacula側からリストアが完了したかどうかを教えてくれません。
なので、「echo “messages”| bconsole」を実行してこっちから聞きに行かないと駄目です。
とりあえず特定のdumpをリストアして、リストア完了を待って、DBに入れるところまでを書きました。

#!/bin/bash

FileDate=`date +%y%m%d`
Termination=`echo "messages" | bconsole | tail | grep Termination | awk -F" " '{print $2$3$4$5}'`
SleepCount=1

echo "messages" | bconsole
echo "restore storage=quick-sd \
      client=quick-fd \
      where=/tmp/bacula-restores \
      restoreclient=jenkins \
      file=/var/spool/bacula/quick-fd_${FileDate}db.dump \
      mark current done yes" \
| bconsole 

while [ "$Termination" != '***RestoreError***' -a "$Termination" != 'RestoreOK' ]; do
  VolumesName=`echo "messages" | bconsole | tail | grep Termination | awk -F" " '{print $2$3$4$5}'`
  sleep 30
  if [ ${SleepCount} -lt 60 ] ; then
    SleepCount=`expr 1 + $SleepCount`
  else
    exit 0
  fi
done

if [ "${Termination}" = "RestoreOK" ] ; then
  mysql -u root -p????? -h quick-fd < /tmp/bacula-restores/var/spool/bacula/quick-fd_${FileDate}db.dump
  rm -rf /tmp/bacula-restores/*
fi

なんか無理矢理感が凄いですが、とりあえずバックアップされたdumpを突っ込むまではいけました。
JobじゃないからClientRunBeforeJobとか使えないですし、RestoreClientRunBeforeJobとか定義出来たらめっちゃ楽なのになー・・・・とか思いましたが、機能追加に期待ですね!

注意点

・リストア実行する前に「echo “messages” | bconsole」をしないと溜まってるmessagesが出てきてしまいます。
・sleepとCountの値は適当です。

その他

Baculaはとにかくマニュアルが充実してて、分からない事をググればすぐに探せるのがいいですね。(英語だけど)
まだまだ認知度もユーザも、ソリューションに比べたら少ないですがBaculaが広まったら情シスの年間予算とか凄い削れるのになーって思ったりしました。
Windowsも使えますし、ファイルサーバとか容量大きなバックアップはBaseJobを使えばその後は時間を掛けずにバックアップが可能になりますし。
まだまだ調べきれてない事も多いですが、今後も色々Baculaを触っていきたいと思います。