Intro
It took me a while to figure out optimal configuration for the tape library with two streamers used with Bacula backup software.
Exact model of tape library in use is Quantum Scalar i40 with two LTO5 streamers. It is hooked up directly to the main NFS server (so heavy backup traffic goes via localhost only) – server that runs bacula-sd and bacula-fd services only. Bacula director runs on separate, dedicated backup server.
Currently there are around 20 other servers connected to this system as clients, with various daily Incremental, weekly Differential and monthly Full backup level jobs scheduled for execution.
Some additional info about this setup in previous post – click here. Config files below:
Relevant config files from Backup server
/etc/bacula/bacula-dir.conf
Director {
Name = prod-backup-dir
QueryFile = "/etc/bacula/scripts/query.sql"
WorkingDirectory = "/var/lib/bacula"
PidDirectory = "/var/run/bacula"
Password = "xxxxx"
Messages = Daemon
DirAddress = prod-backup.domain.com
Maximum Concurrent Jobs = 20
}
@/etc/bacula/JobDefs/JobDefs.conf
@|"sh -c 'cat /etc/bacula/Job/*'"
@|"sh -c 'cat /etc/bacula/FileSet/*'"
@|"sh -c 'cat /etc/bacula/Schedule/*'"
@|"sh -c 'cat /etc/bacula/Clients-enabled/*'"
@|"sh -c 'cat /etc/bacula/Storage/*'"
@|"sh -c 'cat /etc/bacula/Pool/*'"
Catalog {
Name = MyCatalog
dbaddress = prod-db.domain.com ;
dbname = "bacula"; dbuser = "bacula"; dbpassword = "xxxxx"
}
Messages {
Name = Standard
mailcommand = "/usr/lib/bacula/bsmtp -h prod-mailhub.domain.com -f \"\(Bacula\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r"
operatorcommand = "/usr/lib/bacula/bsmtp -h prod-mailhub.domain.com -f \"\(Bacula\) \<%r\>\" -s \"Bacula: Intervention needed for %j\" %r"
mail = [email protected] = all, !skipped
operator = [email protected] = mount
console = all, !skipped, !saved
append = "/var/lib/bacula/log" = all, !skipped
catalog = all
}
Messages {
Name = Daemon
mailcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula client %c job %n exit code %e \" %r"
mail = [email protected] = all, !skipped
console = all, !skipped, !saved
append = "/var/lib/bacula/log" = all, !skipped
}
Console {
Name = prod-backup-mon
Password = "xxxxxxxxxxx"
CommandACL = status, .status
}
Example job definition /etc/bacula/Job/Studies2010-1.conf
#----------------------------------
Job {
Name = Studies2010-1
Type = Backup
Client = nfs-prod-fd
Schedule = MonthlyCycle
Messages = Daemon
FileSet = Studies2010-1
Level = Full
Pool = lto5-pool
Priority = 12
Max Run Time = 1555200 # default limit is 6 days, 518400sec. bumped 3x just in case
Spool Data = yes
Spool Attributes = yes
}
#----------------------------------
Example fileset, /etc/bacula/FileSet/Studies2010-1.conf
#-------------------------------------------
FileSet {
Name = "Studies2010-1"
Include {
Options {
signature = MD5
compression=GZIP5
noatime=yes
aclsupport = yes
wilddir = "/export/studies/201007*"
wilddir = "/export/studies/201008*"
}
Options {
RegexDir = ".*"
exclude = yes
}
File = "/export/studies"
}
}
Example Schedule, /etc/bacula/Schedule/MonthlyCycle3.conf
Schedule {
Name = MonthlyCycle3
Run = Level=Full Pool=lto5-pool 3rd fri at 23:30
}
Tape library, storage definition:
Storage {
Name = TapeLibrary
Address = prod-tapelib.comain.com
SDPort = 9103
Password = "xxxxxx"
Device = QuantumScalar-I40
Media Type = LTO-5
Autochanger = yes
Maximum Concurrent Jobs = 4
}
Pool of tapes defined here:
Pool {
Name = lto5-pool
Pool Type = Backup
Volume Retention = 6 months
Recycle = yes
AutoPrune = yes
Recycle = yes
Label Format = LTO5
Storage = TapeLibrary
}
Relevant config files from Tape Library server
Note that I spool data before saving to the tape – this prevents tape “shoe shine” during Incremental/Differential backups.
Storage {
Name = TapeLibrary
WorkingDirectory = "/var/spool/bacula"
Pid Directory = "/var/run"
}
Autochanger {
Name = QuantumScalar-I40
Device = Drive0
Device = Drive1
Changer Device = /dev/changer
Changer Command = "/usr/libexec/bacula/mtx-changer %c %o %S %a %d"
}
Device {
Name = Drive0
Drive Index = 0
Media Type = LTO-5
Archive Device = /dev/nst0
AutomaticMount = yes
AlwaysOpen = yes
RemovableMedia = yes
RandomAccess = no
AutoChanger = yes
Alert Command = "sh -c 'smartctl -H -l error %c'"
Maximum Changer Wait = 600
Maximum Rewind Wait = 600
Maximum Open Wait = 600
Spool Directory = /var/spool/bacula/Spool
Maximum Spool Size = 45G
Maximum Concurrent Jobs = 2
}
Device {
Name = Drive1
Drive Index = 1
Media Type = LTO-5
Archive Device = /dev/nst1
AutomaticMount = yes
AlwaysOpen = yes
RemovableMedia = yes
RandomAccess = no
AutoChanger = yes
Alert Command = "sh -c 'smartctl -H -l error %c'"
Maximum Changer Wait = 600
Maximum Rewind Wait = 600
Maximum Open Wait = 600
Spool Directory = /var/spool/bacula/Spool
Maximum Spool Size = 45G
Maximum Concurrent Jobs = 2
}
Messages {
Name = Standard
director = prod-backup-dir = all
}
Director {
Name = prod-backup-dir
Password = "xxxxxxxx"
}
Director {
Name = prod-backup-mon
Password = "xxxxxxxxxx"
Monitor = yes
}
Thoughts
Implementing Bacula driven backup solution requires some time and effort – but what you get in the end is sophisticated, enterprise grade backup system, capable of backing up TBs of data in organised and efficient manner.
Used in conjunction with Monitoring system it offers fully automated backup solution, with minimal operator effort required. Routine tasks boil down to: