前回の構築編に続いて設定編。
書き始めたら非常に長くなったため、今回はbacula-dirのみを対象とし、bacula-sd、bacula-fd、bconsoleは別途記載する。
環境については以下の通りとする。
環境
- バックアップ対象サイズ:約1TB
- FullBackup:毎月1回、最初の月曜日
- DifferentialBackup(差分バックアップ):週1回、月曜日(FullBackup時は除く)
- IncrementalBackup(増分バックアップ):毎日(Full,DiffBackup時は除く)
- バックアップ実行時間は4:05とする。
- Backup用Storageのサイズ:3TB
- Backup用Storageは別のサーバからNFSマウントしている
フルバックアップが毎月1回実行しての2世代保存とする。
ただし1ヶ月前の状態まで戻せることを目標とする。
2世代としている理由としては、フルバックアップ処理時に失敗した時、
前回分のフルバックアップデータを消さないために2世代保管としている。
Baculaのいいところは(というか最近のバックアップソフトはどれも同じだが)リストア時、
どのようなバックアップからリストアするか?を意識する必要はない。
何時取ったバックアップデータを戻すか?を指定するのみで、リストアができる。(操作編で説明)
Full,Diff,Incの設定はバックアップ時間の短縮とバックアップデータ量抑えるために指定していると思っとけば良い。
bacula-dirの設定
バックアップ方式の設定は主に以下のファイルで行う。
/etc/bacula/bacula-dir.conf
各リソースについて、順に説明する。
リソースとは{}で囲まれた区画のことを指す。
最後に設定ファイルをまるまる貼り付けておくため設定ファイルだけ見たい場合は最後に飛ぶと良い。
バックアップ対象はowncloudのサーバとしている。
したがってowncloudの名前をバックアップ設定に使っている。
Director
Director {
Name = bacula-dir
DIRport = 9101
QueryFile = "/etc/bacula/query.sql"
WorkingDirectory = "/var/spool/bacula"
PidDirectory = "/var/run"
Maximum Concurrent Jobs = 20
Password = "パスワード"
Messages = Daemon
}
基本的にデフォルトの設定で良い。ただしパスワードを設定する必要がある。
bacula-dirのサービスで使用するポートを変えたければDIRportを変更する。
Job
JobDefs {
Name = "DefaultJob"
Type = Backup
Level = Incremental
Client = bacula-fd
FileSet = "Full Set"
Schedule = "WeeklyCycle"
Storage = File1
Messages = Standard
Pool = File1
Write Bootstrap = "/var/spool/bacula/%c.bsr"
}
Job {
Name = "owncloud"
Type = Backup
Client = owncloud
FileSet = "owncloud"
Schedule = "owncloudCycle"
Storage = owncloud
Messages = Standard
Full Backup Pool = owncloud-Full
Incremental Backup Pool = owncloud-Inc
Differential Backup Pool = owncloud-Diff
Pool = File1
SpoolAttributes = yes
Priority = 10
Write Bootstrap = "/var/spool/bacula/%c.bsr"
}
バックアップジョブの取りまとめを行っているのがこのリソース。
JobDefsで全Job共通のデフォルト設定を記載する。
そしてJobDefsをベースとして、Jobごとに別々の設定を記載する。
Jobでの設定値はJobDefsに上書きされることになる。
後の各リソースに設定されている名前を指定しているのがこのリソース。
Client,FileSet,Schedule,Storage等のリソースが後に出てくるが、
そこのName部分とこのJobリソースに記載しているNameを同じにすること。
Nameはバックアップ対象で共通化しておいたほうがわかりやすい。
今回の例でいえばowncloudで共通化している。
リストアの設定もJobリソースにて行う
Job {
Name = "Restoreowncloud"
Type = Restore
Client=owncloud
Storage = owncloud
FileSet="owncloud"
Full Backup Pool = owncloud-Full
Incremental Backup Pool = owncloud-Inc
Differential Backup Pool = owncloud-Diff
Pool = File1
Messages = Standard
Where = /tmp/bacula-restores
}
リストア自体はbconsoleで行う。(操作編にて記載予定)
Type = Restore はリストアの設定となる。
Client,Storage,Pool等、バックアップJobと共通の設定を行う。
Whereはリストアを行う先のパスの指定となる。
リストアを行った場合、クライアント上(上記の例だと/tmp/bacula-restores)にリストアされる。
FileSet
FileSet {
Name = "owncloud"
Include {
Options {
signature = MD5
compression = GZIP
}
File = /exstorage/owncloud
File = /var/lib/pgsql/9.4/basebackup
File = /var/lib/pgsql/9.4/wal
File = /exstorage2/samba
}
}
バックアップを行うファイルの指定。
NameはJobリソースのFileSetと同じにする必要がある。
Include{}にて、バックアップファイルの指定を行う。
File = "バックアップするパス"
を書けば良い。
バックアップを除外したい場合は
Exclude{}の中に、
File = "バックアップを除外したいパス"
を書けば良い。
Optionsについてはバックアップ取得時の圧縮方式等を指定することができる。
上記の例ではGZIP圧縮している。
Schedule
Schedule {
Name = "owncloudCycle"
Run = Full 1st mon at 04:05
Run = Differential 2nd-5th mon at 04:05
Run = Incremental tue-sun at 04:05
}
バックアップ実行スケジュールの設定。
NameはJobリソースで設定したものと同じものを設定する。
フル、差分、増分のバックアップ日程をここで設定できる。
上記の設定は以下の通り
- Full 1st mon at 04:05 は、毎月最初の月曜日、4:05からバックアップ開始(フルバックアップ)
- Differential 2nd-5th mon at 04:05 は、毎月2,5週目の月曜日、4:05からバックアップ開始(差分バックアップ)
- Incremental tue-sun at 04:05 は、毎週火曜日〜日曜日、4:05からバックアップ開始(増分バックアップ)
1st,2nd,3rd,4th,5thで毎月の何週目にやるかを指定できる。
sun,mon,tue,wed,thu,fri,sat で曜日が指定できる。
Client
Client {
Name = owncloud
Address = クライアントのIPアドレス
FDPort = 9102
Catalog = MyCatalog
Password = "パスワード"
File Retention = 35 days
Job Retention = 6 months
AutoPrune = yes
}
バックアップ先情報を記載する。
NameはJobリソースと同じものを記載。
AddressはクライアントのIPアドレスを記載するか、名前解決できればホスト名、FQDNで良い。
Catalogはバックアップ実行情報等を記録するバックアップカタログを指定する設定。デフォルトで良い。
Passwordはパスワード。
File RetentionはCatalogのデータベース保持期間であり、上記で35日間は保持する設定となっている。
Job Retentionはジョブの実行記録であり、上記だと6ヶ月前までのジョブ実行履歴が確認できる。
AutoPruneは保持期間を過ぎたものを自動的に削除する設定となる。
Clientリソースの場合、Catalogの情報を自動削除、となる。
Storage
Storage {
Name = owncloud
Address = bacula-sdの入っているサーバのIPアドレス
SDPort = 9103
Password = "パスワード"
Device = owncloud
Media Type = File
Maximum Concurrent Jobs = 10
}
バックアップ保存先のストレージ設定を行う。
NameはJobで記載したものと同一とする。
★Addressの設定は注意。(ここでつまずいた経験あり)
Addressはlocalhostと指定してはならない。
バックアップのクライアント側から見ての接続先をここに書く必要がある。
(クライアントが接続先情報としてこの設定値を使う)
localhostと書いてしまうと、クライアントがサーバに接続しようとした時に、
接続先はlocalhost=クライアント自身となってしまい、バックアップデータを送ることができない。
バックアップサーバのIPアドレスを記載するか、クライアントが名前解決できればホスト名等でも良い。
なお、bacula-sdはbacula-dirのサーバとは分散できる。今回は同一サーバなため、
バックアップサーバのIPアドレスとなっている。
SDPortはbacula-sdのポート番号で9103。これはデフォルトのままで良い。
Deviceの設定はbacula-sd.confの設定に関わる。
bacula-sd.confのDeviceリソースと名前を同一にする必要がある。
bacula-sd.confの説明は別途行う。
Media TypeはFileとしている。HDD等のストレージ上(ファイルシステム上)に
ファイルを生成し、バックアップを行う。
テープバックアップなどにも対応しており、その場合はTapeと記載する。
Maximum Concurrent Jobsはバックアップ処理の最大同時実行数となる。
あまり同時に動かすものもないのでデフォルトで問題ない。
Pool
# owncloudがフルバックアップ時に使うPool★
Pool {
Name = owncloud-Full
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 1 months
Label Format = "owncloud-Full-"
Maximum Volume Bytes = 800G
Maximum Volumes = 3
}
# owncloudが差分バックアップ時に使うPool★
Pool {
Name = owncloud-Diff
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 62 days
Label Format = "owncloud-Diff-"
Maximum Volume Bytes = 200G
Maximum Volumes = 5
}
# owncloudが増分バックアップ時に使うPool★
Pool {
Name = owncloud-Inc
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 62 days
Label Format = "owncloud-Inc-"
Maximum Volume Bytes = 50G
Maximum Volumes = 10
}
このPoolの設定がバックアップ世代の管理の肝となる。
PoolはStorage上に生成される。
なお、StorageリソースのDeviceでbacula-sd.confの設定を参照しており、
実際のファイル配置先はbacula-sd.confに記載することになる。(bacula-sd編で記載)
NameはJobのものと同一に設定する必要がある。
上記は3つのPoolをバックアップ方式ごとに分散している。
もちろん一つのPoolのみで済ませることもできる。
その場合はJobリソースにて以下のように書けば良い。
Pool = "プール名"
(Full Backup Pool,Incremental Backup Pool, Differential Backup Poolを書く必要がない)
自身の場合、分けたほうが管理しやすいと考え分けることにした。
Recycle、AutoPruneは名前の通りリサイクルをする、自動削除をする設定となる。
どちらもyesに設定されると、古いデータを削除してくれるようになる。
その削除対象となるのはVolume Retentionで指定した日付を超えたものとなる。
Label Formatはバックアップ用のファイルを生成するときのファイルの命名ルールとなる。
ファイル生成時、勝手に番号を追記してくれる。
Maximum Volume Bytesはバックアップ用ファイルの1ファイルの最大容量となる。
1つファイルを生成し、そこにバックアップデータを追記していくのだが、
この設定値を超えると新しいバックアップ用ファイルを生成する。
Maximum Volumesは最大何個のバックアップ用ファイルを生成するか、の設定となる。
この値を超えると古いものが削除される。
上記の例でいえばowncloud-Fullについて、以下の通りとなる。
- 1ヶ月を超えた古いバックアップ用ファイルは削除する
- バックアップ用ファイルの1ファイルは最大800GBとする
- バックアップ用ファイルは最大3つまで生成する
実際にバックアップを運用すると以下のようにファイルが生成される(2018/3/22時点)
合計 2.1T
-rw-r-----. 1 bacula tape 55G 3月 19 04:06 owncloud-Diff-0007
-rw-r-----. 1 bacula tape 800G 3月 5 12:03 owncloud-Full-0020
-rw-r-----. 1 bacula tape 425G 3月 5 17:36 owncloud-Full-0021
-rw-r-----. 1 bacula tape 800G 2月 5 12:58 owncloud-Full-0022
-rw-r-----. 1 bacula tape 15G 3月 22 04:05 owncloud-Inc-0005
フルバックアップを行うと1TB以上あるため、毎回800GBを超えて新しいファイルが生成される。
次回のフルバックアップ時(上記の例だと4月)、まずは800GBに達していない"owncloud-Full-0021"にデータを追記し、
800GBを超えると保存期間を過ぎた"owncloud-Full-0022"を削除し、新しいバックアップ用ファイルを
生成し、そこにバックアップを行っていく。
4月のバックアップでは3月バックアップデータを残しつつ2月のデータを削除する。
バックアップストレージサイズが3TBしかなかったため、このようにバックアップを回していくと
うまく動かすことができた。
大体必要な設定は以上となる。
最後にまるまる設定ファイルを貼り付けておく。
# bacula-dir全体の設定
# パスワード以外はデフォルトのままで基本良い。
Director {
Name = bacula-dir
DIRport = 9101
QueryFile = "/etc/bacula/query.sql"
WorkingDirectory = "/var/spool/bacula"
PidDirectory = "/var/run"
Maximum Concurrent Jobs = 20
Password = "パスワード"
Messages = Daemon
}
# デフォルトのジョブ設定★
# 下記のJobリソースで設定を入れないものはこのDefsの設定が適用される
JobDefs {
Name = "DefaultJob"
Type = Backup
Level = Incremental
Client = bacula-fd
FileSet = "Full Set"
Schedule = "WeeklyCycle"
Storage = File1
Messages = Standard
Pool = File1
Write Bootstrap = "/var/spool/bacula/%c.bsr"
}
# ジョブごとのバックアップ設定★
# owncloudのバックアップ設定
# バックアップ対象ごとに設定する。
Job {
Name = "owncloud"
Type = Backup
Client = owncloud
FileSet = "owncloud"
Schedule = "owncloudCycle"
Storage = owncloud
Messages = Standard
Full Backup Pool = owncloud-Full
Incremental Backup Pool = owncloud-Inc
Differential Backup Pool = owncloud-Diff
Pool = File1
SpoolAttributes = yes
Priority = 10
Write Bootstrap = "/var/spool/bacula/%c.bsr"
}
# バックアップカタログのバックアップ。
# 基本デフォルトのままで良い
# バックアップカタログとは、バックアップの実行記録等を保存しているデータベース。
# リストア時にこちらも必要となる。
Job {
Name = "BackupCatalog"
JobDefs = "DefaultJob"
Level = Full
FileSet="Catalog"
Schedule = "WeeklyCycleAfterBackup"
RunBeforeJob = "/usr/libexec/bacula/make_catalog_backup.pl MyCatalog"
RunAfterJob = "/usr/libexec/bacula/delete_catalog_backup"
Write Bootstrap = "/var/spool/bacula/%n.bsr"
Priority = 11
}
# リストアのための設定
# こちらは最初から記載されているもので変更する必要は特に無い
Job {
Name = "RestoreFiles"
Type = Restore
Client=bacula-fd
Storage = File1
FileSet="Full Set"
Pool = File1
Messages = Standard
Where = /tmp/bacula-restores
}
# owncloudのバックアップのリストア設定★
Job {
Name = "Restoreowncloud"
Type = Restore
Client=owncloud
Storage = owncloud
FileSet="owncloud"
Full Backup Pool = owncloud-Full
Incremental Backup Pool = owncloud-Inc
Differential Backup Pool = owncloud-Diff
Pool = File1
Messages = Standard
Where = /tmp/bacula-restores
}
# バックアップ対象の指定
# こちらはデフォルトの設定
FileSet {
Name = "Full Set"
Include {
Options {
signature = MD5
}
File = /
}
Exclude {
File = /var/spool/bacula
File = /tmp
File = /proc
File = /sys
File = /.journal
File = /.fsck
}
}
# owncloudのバックアップ対象の指定★
FileSet {
Name = "owncloud"
Include {
Options {
signature = MD5
compression = GZIP
}
File = /exstorage/owncloud
File = /var/lib/pgsql/9.4/basebackup
File = /var/lib/pgsql/9.4/wal
File = /exstorage2/samba
}
}
# バックアップカタログのバックアップ対象の指定
FileSet {
Name = "Catalog"
Include {
Options {
signature = MD5
}
File = "/var/spool/bacula/bacula.sql"
}
}
# ジョブ実行スケジュール
Schedule {
Name = "WeeklyCycle"
Run = Full 1st sun at 23:05
Run = Differential 2nd-5th sun at 23:05
Run = Incremental mon-sat at 23:05
}
# owncloudのバックアップジョブの実行スケジュール★
Schedule {
Name = "owncloudCycle"
Run = Full 1st mon at 04:05
Run = Differential 2nd-5th mon at 04:05
Run = Incremental tue-sat at 04:05
}
# バックアップカタログのバックアップのジョブ実行スケジュール
Schedule {
Name = "WeeklyCycleAfterBackup"
Run = Full sun-sat at 23:10
}
# バックアップ先の設定
# サーバ自身のバックアップカタログのバックアップも行うので
# こちらはサーバ自身の接続先の設定となる。基本デフォルトで良い。
Client {
Name = bacula-fd
Address = localhost
FDPort = 9102
Catalog = MyCatalog
Password = "パスワード"
File Retention = 60 days
Job Retention = 6 months
AutoPrune = yes
}
# owncloudのバックアップ先情報★
Client {
Name = owncloud
Address = クライアントのIPアドレス
FDPort = 9102
Catalog = MyCatalog
Password = "パスワード"
File Retention = 30 days
Job Retention = 6 months
AutoPrune = yes
}
# bacula-sdの動いているサーバの情報
# 今回はbacula-dirとbacula-sdは同じサーバとなる。
# Addressにlocalhostを指定してはならない(ここポイント)
Storage {
Name = File1
Address = bacula-sdの動いているサーバのIPアドレス
SDPort = 9103
Password = "パスワード"
Device = File1
Media Type = File
Maximum Concurrent Jobs = 10
}
# owncloudのジョブのストレージ情報★
Storage {
Name = owncloud
Address = bacula-sdの入っているサーバのIPアドレス
SDPort = 9103
Password = "パスワード"
Device = owncloud
Media Type = File
Maximum Concurrent Jobs = 10
}
# カタログに関する情報。デフォルトのままで良い。
Catalog {
Name = MyCatalog
dbname = "bacula"; dbuser = "bacula"; dbpassword = "パスワード"
}
# ログ出力先に関する設定。基本デフォルトのままで良い。
# ログ出力先を変えたり、メール送信設定を変えるならここ。
Messages {
Name = Standard
mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r"
operatorcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: Intervention needed for %j\" %r"
mail = root@localhost = all, !skipped
operator = root@localhost = mount
console = all, !skipped, !saved
append = "/var/log/bacula/bacula.log" = all, !skipped
catalog = all
}
Messages {
Name = Daemon
mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r"
mail = root@localhost = all, !skipped
console = all, !skipped, !saved
append = "/var/log/bacula/bacula.log" = all, !skipped
}
# バックアップ保存先のPool情報。
# バックアップ世代管理等はこちらに設定する
# 今回だとDefaultのPoolは使用していないが、
# こちらの設定は消さずに残してある。(特に理由はない)
Pool {
Name = Default
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 365 days
Maximum Volume Bytes = 50G
Maximum Volumes = 100
}
# バックアップカタログが使用しているPool
Pool {
Name = File1
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 365 days
Maximum Volume Bytes = 50G
Maximum Volumes = 10
Label Format = "Vol-"
}
# owncloudが使用しているPool★
# こちらはFullBackupが使用
# Full,Diff,IncでPoolを分ける必要もないが、理由あって分けている(後述)
# こちらのほうがPool管理しやすいので個人的には分けたほうがいいと考えている。
Pool {
Name = owncloud-Full
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 1 months
Label Format = "owncloud-Full-"
Maximum Volume Bytes = 800G
Maximum Volumes = 3
}
# owncloudが差分バックアップ時に使うPool★
Pool {
Name = owncloud-Diff
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 62 days
Label Format = "owncloud-Diff-"
Maximum Volume Bytes = 200G
Maximum Volumes = 5
}
# owncloudが増分バックアップ時に使うPool★
Pool {
Name = owncloud-Inc
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 62 days
Label Format = "owncloud-Inc-"
Maximum Volume Bytes = 50G
Maximum Volumes = 10
}
# デフォルトのままで良い設定
Pool {
Name = Scratch
Pool Type = Backup
}
# Consoleに関する設定と思われるが、パスワードを設定する以外は
# デフォルトのままで良い。
Console {
Name = bacula-mon
Password = "パスワード"
CommandACL = status, .status
}