Add limits for a volume so that it accepts only one job. On Wed, 16 Jul 2025 at 14:53, Leandro Saldivar via Bacula-users < bacula-users@lists.sourceforge.net> wrote:
> Hi Robert! Thanks for your time and input! > > What you suggested was exactly what came to my mind yesterday. I tested it > and saw something very strange: > I was able to start one Backup Job and 5 Copy Jobs in parallel, and > everything looked fine at first. However, on the remote SD, the file sizes > stopped growing independently, and a new file appeared that seems to be > aggregating all 5 Copy Jobs into a single volume: > > -rw-r----- 1 root root 4.6T Jul 16 12:35 mongodb01-2510 ← this should > be 1.5T max, seems to be merging copies > -rw-r----- 1 root root 190K Jul 15 20:05 mongodb01-2499 > -rw-r----- 1 root root 127K Jul 15 20:04 mongodb01-2495 > -rw-r----- 1 root root 64K Jul 15 20:04 mongodb01-2452 > -rw-r----- 1 root root 318 Jul 15 20:04 mongodb01-2441 > -rw-r----- 1 root root 44G Jul 15 20:03 mongodb01-2439 > -rw-r----- 1 root root 1.5T Jun 29 18:43 mongodb01-2273 ← expected > result > -rw-r----- 1 root root 1.5T Jun 29 00:55 mongodb01-2268 ← expected > result > > So it seems the volumes from the parallel Copy Jobs are being merged > unintentionally. > > I added an Autochanger with 5 Devices, declared a Storage using the > Autochanger, and pointed my Copy Jobs to this new Storage resource. > > You can find my config here: > https://gist.github.com/lean2206/54b37b8d599243f4b95e047fa4a8b47a > > Any idea what might be causing this behavior? Meanwhile, until I find a > better approach, I'll run the Restore Job using a RunAfterJob from the > Backup, and trigger the Copy Jobs via cron — both using separate Devices, > in parallel. So far, this setup would require 2 Devices. > > Thanks again! > > On Tue, Jul 15, 2025 at 2:03 PM Rob Gerber <r...@craeon.net> wrote: > >> Leandro, >> >> The following assumes you are using disk based backup, where the "drives" >> and "autochangers" are virtual. >> >> I would suggest creating multiple "drive" devices in your bacula-sd.conf >> for each SD destination, then tie them together with a single autochanger >> resource in those respective bacula-sd.conf files. In your bacula-dir.conf, >> in your storage resources, reference the respective autochanger resources. >> If your jobs are ran with the same priority, and all the various daemons >> have enough "allow simultaneous jobs" specified (not the actual option, I >> can't recall the exact wording used by Bacula), then you should see better >> parallelism. I believe you will then be limited by your disk / netwoek >> bandwidth, and single core performance on various Bacula tasks like hashing >> files. >> >> At least, unless I misunderstand something. >> >> I would provide config examples, but I am afk right now. >> >> Robert Gerber >> 402-237-8692 >> r...@craeon.net >> >> On Tue, Jul 15, 2025, 9:51 AM Leandro Saldivar via Bacula-users < >> bacula-users@lists.sourceforge.net> wrote: >> >>> 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 >>> >> _______________________________________________ > Bacula-users mailing list > Bacula-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/bacula-users >
_______________________________________________ Bacula-users mailing list Bacula-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bacula-users