クイック エンジニアリングブログ

株式会社クイック Web事業企画開発本部のエンジニアリングチームが運営する技術ブログです。

Baculaデータを別サーバに退避してリストア【運用手順編その2】

【構築手順編その1】【構築手順編その2】【運用手順編】 と連続して書きましたが、そのほかにもやってる事を書きたいと思います。
【運用手順編】にまとめて書こうとしたのですが、長くなってしまったので分けました。


マフラーを外すタイミングが分かりません。
matsBです。(๑•̀ㅂ•́)و✧


なんならヒートテックも、どのタイミングから着なくていいのか分かりません。

Baculaを使ってると、DR(Disaster Recovery)どうしようとか、Directorが壊れたらどうしようとか、Catalogが消えたらどうしようとか、Volumeデータ消えたらどうしようとかとかとか・・・・思ったりしたことはありませんか?
後で説明しますが、BaculaはVolumeデータさえあればどこでもリストアできます。Catalog無くても大丈夫です。
その使い方&設定等の説明を含めて、簡単なDR的な事をBaculaでやってみたので紹介します。

前提

サーバ情報

役割 ホスト名 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

Baculaデータを別サーバに退避してリストア

Baculaを使って簡単なDR(Disaster Recovery)的な意味で、他の拠点や他のサーバに一部データを退避させたいなーって方用の説明です。

前提

【事実】
・ホスト名はquick-dr
・quick-drにはMySQLが入ってる
【願望】
・2週間だけ別サーバに退避させたい
・DBのCatalogは最新が望ましい
・いつでも別サーバに移行出来るようにしたい

bacula-dir のインストール

【構築手順編その1】でやってるので説明は省きますが、とりあえずquick-dirと同じようなものにしていきます。

[root@quick-dr ~]# yum install -y bacula-client bacula-common bacula-console bacula-console-bat bacula-debuginfo bacula-devel bacula-director bacula-docs bacula-libs bacula-libs-sql bacula-traymonitor
[root@quick-dr ~]# /bin/sh /usr/libexec/bacula/create_mysql_database -u root -p
[root@quick-dr ~]# /bin/sh /usr/libexec/bacula/make_mysql_tables -u root -p
[root@quick-dr ~]# egrep "^db_password=" /usr/libexec/bacula/grant_mysql_privileges
db_password=bacula_quick
[root@quick-dir ~]# /bin/sh /usr/libexec/bacula/grant_mysql_privileges -u root -p

bacula-dir のconfigをコピーとVolumeデータのコピー

って言っても、やりたい事を箇条書きしただけです。

[root@quick-dr ~]# cat /var/spool/bacula/config-rsync.sh
#!/bin/bash

# Directorのconfigを全てコピー
rsync -avz --delete -e ssh root@10.0.0.1:/etc/bacula/ /etc/bacula/
# Storage Daemonのconfigをコピー
rsync -avz --delete -e ssh root@10.0.0.10:/etc/bacula/bacula-sd.conf /etc/bacula/
# Storage Daemonの設定のIPアドレスを置換
sed -i -e 's/10.0.0.10/127.0.0.1/g'  /etc/bacula/bacula-dir.conf
# スケジュールを消す
sed -i -e 's/  Run /#  Run /g'  /etc/bacula/bacula-dir.conf
# File Daemonを自分のホスト名に置換
sed -i -e 's/quick-dir/quick-dr/g'  /etc/bacula/bacula-fd.conf

Catalogとデータが無いので何も出来ませんが、まぁこれで一応動くようにはなってるはずです。 そして、欲しいデータを雑にコピーしてきます。

・quick-fdのバックアップファイル
[root@quick-dr ~]# rsync -avz -e ssh root@10.0.0.10:/data/bacula-backup/quick-fd-* /data/bacula-backup/
・Catalogの最新バックアップファイル
[root@quick-dr ~]# rsync -avz -e ssh root@10.0.0.10:/data/bacula-backup/localhost-FullVol-2017-04-13_1150 /data/bacula-backup/

Catalogのデータについては、基本的に最新のバックアップファイルだけで大丈夫です。

Catalogのリストア

Catalogに何も無い状態なので、Volumeデータだけ持ってきてもリストアが出来ない事はないのですが・・・このあと説明しますが面倒です。
Catalogのリストアはmysqldumpしか方法が無いとか思われがちですが、Baculaにはbextractとblsというコマンドがあって、組み合わせて使えばリストアが出来るようになっています。

[root@quick-dr ~]# cat /var/spool/bacula/catalog_restore.sh
#!/bin/bash

BaseDir=/var/spool/bacula

#過去分をリストアしたい場合はここで日付を指定
#FileNameDate=`date --date '7 days ago' +%Y-%m-%d`
FileNameDate=`date +%Y-%m-%d`

#Catalogのファイル名を取得
CatalogFileName=`ls /data/bacula-backup/localhost-FullVol-${FileNameDate}_* | awk -F"/" '{print $4}'`

#Bootstrapファイルを作成
touch ${BaseDir}/restore-bacula-catalog.bsr

#Bootstrap内に必要情報を記述
echo Volume=${CatalogFileName} > ${BaseDir}/restore-bacula-catalog.bsr
bls -j -V ${CatalogFileName} /data/bacula-backup | sed -n 3p | awk '{print $4"\n"$5}' | sed -e "s/SessId/VolSessionId/g" | sed -e "s/SessTime/VolSessionTime/g" >> ${BaseDir}/restore-bacula-catalog.bsr

#BaculaのCatalogを直接リストア
bextract -b ${BaseDir}/restore-bacula-catalog.bsr -V /data/bacula-backup/${CatalogFileName} /data/bacula-backup /data/catalog

#リストアしたファイルをMySQLに突っ込む
mysql -u bacula -pbacula_quick bacula  < /data/catalog/var/spool/bacula/bacula.sql

#不要ファイルを削除
rm -rf /data/catalog/* ${BaseDir}/restore-bacula-catalog.bsr

#configのIPアドレスの書き換え
sed -i -e 's/10.0.0.10/127.0.0.1/g'  /etc/bacula/bacula-dir.conf

#bacula 関連を再起動
/etc/init.d/bacula-sd restart
/etc/init.d/bacula-dir restart

blsでバックアップされた時の情報を抽出して、Bootstrap内に必要情報(Volume/VolSessionId/VolSessionTime)を入れて、bextractでリストアしてます。
これはCatalogに限らず、bextractとblsを使えばVolumeデータだけでリストアが出来ます。
なので最悪Directorが入ったサーバが壊れて使えなくなっても復旧は可能なので、VolumeデータとConfigだけ退避させておけば心強いです。

必要期間分のVolumeデータのコピー

まぁこの辺は取りたいVolumeデータを書いてるだけなので、大したことは書いてないですが晒します。

[root@shoukai-dr ~]# cat /var/spool/bacula/data-rsync.sh
#! /bin/bash -x

TODAY=`date +%Y-%m-%d`
ONEWEEKAGO=`date --date '7 days ago' +%Y-%m-%d`
TWOWEEKAGO=`date --date '14 days ago' +%Y-%m-%d`
DAYOFWEEK=`date -d $TODAY '+%w'`

rsync -avz -e ssh root@10.0.0.10:/data/bacula-backup/localhost-FullVol-${TODAY}_* /data/bacula-backup/ && rm -f /data/bacula-backup/localhost-FullVol-${ONEWEEKAGO}_*

    if [ ${DAYOFWEEK} -eq 0 ] ; then      # if文で判定に使用している値'0'は日曜日を指す。
        echo 'today is Sunday.'
        rsync -avz -e ssh root@10.0.0.10:/data/bacula-backup/quick-fd-FullVol-${TODAY}_* /data/bacula-backup/ && rm -f /data/bacula-backup/scat-FullVol-${TWOWEEKAGO}_*
        else
        echo 'today is not Sunday.'
        rsync -avz -e ssh root@10.0.0.10:/data/bacula-backup/quick-fd-DifferentialVol-${TODAY}_* /data/bacula-backup/ && rm -f /data/bacula-backup/scat-DifferentialVol-${ONEWEEKAGO}_*
    fi

exit 0

rsync && rm -f」と直列にしてるのはrsync出来なかった時(quick-sdが死んでる時)にquick-drのデータを消してくなかったからです。
って言うのも、東京に災害があってquick-sdが死んだ2週間後に「事業を再開させましょう!」→「保存期間2週間で、データありません!」じゃ話にならないですよね。
もっとマシな書き方あると思うんですが、面倒になっただけでした。笑

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

必要なスクリプトは揃ったので、これをBaculaで自動化させます。

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

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

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

全てのJobが完全に終わった後じゃないと意味が無いので、JobのPriorityを13にして一番最後にJobが走るようにしています。
00_quick-sd.confと一緒で何もバックアップされず、空のVolumeだけが作成されます。

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

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

これで設定が完了です。
Directorのステータスを見るとこんな感じの順序でjobが走ってくれます。

*status Director
bacula-dir Version: 7.4.4 (20 September 2016) x86_64-redhat-linux-gnu redhat
Daemon started 06-Apr-17 19:04, conf reloaded 06-Apr-2017 19:04:40
 Jobs: run=78, running=0 mode=0
 Heap: heap=385,024 smbytes=543,712 max_bytes=628,117 bufs=976 max_bufs=1,243

Scheduled Jobs:
Level          Type     Pri  Scheduled          Job Name           Volume
===================================================================================
Differential   Backup    10  13-Apr-17 02:05    quick-fd-job       *unknown*
Full           Backup    11  13-Apr-17 02:10    quick-sd-job       *unknown*
Full           Backup    12  13-Apr-17 02:10    BackupCatalog      *unknown*
Full           Backup    13  13-Apr-17 02:10    quick-dr-job       *unknown*
====

MySQLのReplication使えよーとかDRDBでいいじゃん!とかあると思いますが、quick-drはBaculaの検証にも使ってたりしていて、MySQLに書込みしたいのでこんな形になりました。


ってまぁ、クイックではこんな感じでBaculaを運用しています。 無理矢理使ってる感はありますが、、、Baculaに集約させとけばとりあえずは迷わないですし、後々別の方法を取るにしろスケールするにしろ見れば分かる状態にしています。