【構築手順編その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に集約させとけばとりあえずは迷わないですし、後々別の方法を取るにしろスケールするにしろ見れば分かる状態にしています。