Hi all,

I have a client with ~2TB of data. A full backup job takes about 15 hours.
Once the backup finishes, a Copy Job is triggered (Selection Type =
PoolUncopiedJobs) to replicate the volume to a remote Storage Daemon —
which takes another 15 hours per volume in the best-case scenario. Finally,
for each backup, I run a Restore job on a replica server (same client
setup), which adds yet another 15 hours.

The trivial approach to parallelize these jobs (Backup, Copy, Restore) has
been to define a separate Storage + Device pair for each Job. The only
difference between them is the Name. All Devices share the same Archive
Device path — which I'm unsure is a good practice.

Is there a better way to parallelize Backup, Copy, and Restore jobs on the
same Pool/Volumes without defining a separate Storage/Device for each Job?
What would be considered a best-practice setup here?

TL;DR
I need to run Backup, Copy, and Restore jobs in parallel for the same
client (Restore happens on a replica server). Ideally without creating
separate Storage/Device/Pool for each job.

Bacula Version: 15.0.2 (21 March 2024)

This is the config that currently allows me to parallelize only Backup and
Restore. Following this logic, I’d need to create additional Storage +
Device just for the Copy jobs.

Client {
    Name = "mongodb01-fd"
    Address = xx.xx.xx.xx
    FDPort = 9102
    Catalog = MyCatalog
    Password = "PASSWORD"
    File Retention = 11 days
    Job Retention = 2 months
    AutoPrune = yes
    Heartbeat Interval = 1m
    TLS Require = yes
    TLS PSK Enable = yes
}

Job {
    Name = "mongodb01-Backup"
    JobDefs = "MongoDef"
    Pool = "mongodb01-baculaserver01-Pool"
    Level = Full
    Client = "mongodb01-fd"
    Storage = "mongodb01_baculaserver01_Storage"
    Schedule = "DisabledSchedule"  # This is how I disable this client so
it doesn't affect others using the same JobDef with valid Schedules. I
launch the backup manually using a bconsole command.
    @"/opt/bacula/etc/bacula-dir.conf.d/jobdefs/RunCopyToServer.jd"  # This
is how I trigger Copy Jobs for clients with small backups. It works well
within a 24-hour window. For this client, I should remove this line.
}

Pool {
    Name = "mongodb01-baculaserver01-Pool"
    Use Volume Once = yes
    Pool Type = Backup
    LabelFormat = "mongodb01-"
    AutoPrune = yes
    Recycle = yes
    VolumeRetention = 30 days
    Maximum Volumes = 365
    Maximum Volume Jobs = 1
    Recycle Oldest Volume = yes
    Next Pool = "mongodb01-baculaserver02-Pool"  # All copies go from
server01 to server02
}

Pool {
    Name = "mongodb01-baculaserver02-Pool"
    Use Volume Once = yes
    Pool Type = Backup
    LabelFormat = "mongodb01-"
    AutoPrune = yes
    Recycle = yes
    VolumeRetention = 30 days
    Maximum Volumes = 365
    Maximum Volume Jobs = 1
    Recycle Oldest Volume = yes
    Storage = "mongodb01_baculaserver02_Storage"
    Next Pool = "mongodb01-baculaserver01-Pool"  # If backup runs on
server02, the copy goes to server01. Normally, all main backups are done on
server01.
}

Storage {
  Name = "mongodb01_baculaserver01_Storage"
  Address = "baculaserver01.domain"
  SDPort = 9103
  Password = "xxxxxxxxxxxxxxxxxxxxxxx"
  Device = "mongodb01_baculaserver01_Device"
  Media Type = File1
  Maximum Concurrent Jobs = "10"
  Heartbeat Interval = 10
}

Storage {
  Name = "mongodb01_baculaserver01_Storage_2"
  Address = "baculaserver01.domain"
  SDPort = 9103
  Password = "xxxxxxxxxxxxxxxxxxxxxxxx"
  Device = "mongodb01_baculaserver01_Device_2"
  Media Type = File1
  Maximum Concurrent Jobs = "10"
  Heartbeat Interval = 10
}

Storage {
  Name = "mongodb01_baculaserver02_Storage"
  Address = "baculaserver02.domain"
  SDPort = 9103
  Password = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  Device = "mongodb01_baculaserver02_Device"
  Media Type = File1
  Maximum Concurrent Jobs = "10"
  Heartbeat Interval = 10
}

Device {
  Name = "mongodb01_baculaserver01_Device"
  Media Type = File1
  Archive Device = "/backup/bacula-storage/mongodb01/"
  Maximum Concurrent Jobs = 10
  LabelMedia = yes
  Random Access = Yes
  AutomaticMount = yes
  RemovableMedia = no
  AlwaysOpen = yes
}

Device {
  Name = "mongodb01_baculaserver01_Device_2"
  Media Type = File1
  Archive Device = "/backup/bacula-storage/mongodb01/"
  Maximum Concurrent Jobs = 10
  LabelMedia = yes
  Random Access = Yes
  AutomaticMount = yes
  RemovableMedia = no
  AlwaysOpen = yes
}

#This Device is stored in baculaserver02 where only a storage daemon is
running (not bacula-dir)
Device {
  Name = "mongodb01_baculaserver02_Device"
  Media Type = File1
  Archive Device = "/backup/bacula-storage/mongodb01/"
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
}


Backup is launched via cron every 3 days using:
echo 'run job=mongodb01-Backup storage="mongodb01_baculaserver01_Storage_2"
yes' | docker exec -i bacula-dir /opt/bacula/bin/bconsole
Restore is triggered by another cron using the default Storage defined in
the Job.

Any advice or shared experience would be greatly appreciated.

Thanks,
_______________________________________________
Bacula-users mailing list
Bacula-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bacula-users

Reply via email to