Hi Dragan! >From what I can see in each Copy Job’s log, every job is grabbing a different Volume and using a different Device to read from:
JobId 9314 --> Backup Copy JobId 9448 grabbed JobId 7565 to copy : Using Device "mongodb01_baculaserver01_Copy_Restore_1" to read Copy JobId 9450 grabbed JobId 7752 to copy : Using Device "mongodb01_baculaserver01_Copy_Restore_2" to read Copy JobId 9452 grabbed JobId 8092 to copy : Using Device "mongodb01_baculaserver01_Copy_Restore_3" to read Copy JobId 9454 grabbed JobId 8433 to copy : Using Device "mongodb01_baculaserver01_Copy_Restore_4" to read. Copy JobId 9456 grabbed JobId 8912 to copy : Using Device "mongodb01_baculaserver01_Copy_Restore_0" to read. Here’s one of the logs as an example (9456): mainbackupserver-dir JobId 9456: Copying using JobId=8912 Job=mongodb01-Backup.2025-07-11_00.20.51_46 mainbackupserver-dir JobId 9456: Start Copying JobId 9456, Job=CopyJob_mongo.2025-07-15_19.33.05_39 mainbackupserver-dir JobId 9456: Connected to Storage "mongodb01_baculaserver02_Storage" at baculaserver02:9103 with TLS mainbackupserver-dir JobId 9456: Connected to Storage "mongodb01_baculaserver01_Storage_Copy_Restore" at baculaserver01:9103 with TLS mainbackupserver-dir JobId 9456: Using Device "mongodb01_baculaserver01_Copy_Restore_0" to read. baculaserver01-sd JobId 9456: Ready to read from volume "mongodb01-2255" on File device "mongodb01_baculaserver01_Copy_Restore_0" (/backup/bacula-storage/mongodb01/). baculaserver01-sd JobId 9456: Forward spacing Volume "mongodb01-2255" to addr=318 So, at least based on the logs, it seems like the jobs are not competing over the same Volume or Device. On Wed, Jul 16, 2025 at 10:27 AM Dragan Milivojević <gali...@pkm-inc.com> wrote: > 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