Bacula ile Yedekleme Performansı Optimizasyonu
Yedekleme sisteminizi kurdunuz, çalışıyor, her gece job’lar tamamlanıyor. Güzel. Ama bir sabah fark ediyorsunuz ki full backup 6 saat sürüyor, incremental’lar bile 45 dakikayı buluyor ve tape veya disk üzerindeki alan hızla tükeniyor. İşte bu noktada “çalışıyor” ile “iyi çalışıyor” arasındaki fark ortaya çıkıyor. Bacula güçlü bir sistem ama kutudan çıktığı haliyle optimal performans sunmuyor. Bu yazıda gerçek dünya deneyimlerinden yola çıkarak Bacula performansını nasıl artıracağınızı, darboğazları nasıl tespit edeceğinizi ve production ortamında kanıtlanmış optimizasyon tekniklerini ele alacağız.
Darboğazı Tespit Etmeden Optimizasyon Yapılmaz
Körü körüne ayar değiştirmek zaman kaybıdır. Önce neyin yavaş olduğunu anlamak gerekiyor. Bacula’da performans sorunları genellikle dört noktadan birinde yaşanır: network, disk I/O, katalog veritabanı veya Bacula’nın kendi konfigürasyonu.
Önce mevcut job istatistiklerine bakın:
# bconsole ile son job'ların sürelerini ve hızlarını görün
bconsole << EOF
list jobs last=20
EOF
# Belirli bir job'ın detaylarını inceleyin
bconsole << EOF
list jobid=1234
EOF
Job çıktısında dikkat etmeniz gereken satır şu şekilde görünür:
SD Bytes Written: 125,432,891,392 (125.4 GB)
Rate: 45,231 KB/s
Bu hız network veya disk limitinizin çok altındaysa sorun Bacula konfigürasyonundadır. Eğer limitlere yakınsa darboğaz altyapıdadır.
Network durumunu gerçek zamanlı izlemek için:
# SD sunucusunda network trafiğini izleyin
iftop -i eth0 -n
# Disk I/O durumunu kontrol edin
iostat -x 2 10
# Bacula Storage Daemon süreçlerinin kaynak kullanımı
ps aux | grep bacula
top -b -n 1 | grep bacula
Bacula Director Optimizasyonu
Job Concurrent Sayısını Artırmak
Varsayılan Bacula kurulumunda aynı anda çalışabilecek job sayısı oldukça düşük tutulmuştur. Özellikle birden fazla client’a sahip ortamlarda bu ciddi bir darboğaz oluşturur.
/etc/bacula/bacula-dir.conf dosyasında Director bölümünü düzenleyin:
Director {
Name = bacula-dir
DIRport = 9101
QueryFile = "/etc/bacula/query.sql"
WorkingDirectory = "/var/lib/bacula"
PidDirectory = "/var/run/bacula"
Maximum Concurrent Jobs = 20
Password = "your-password-here"
Messages = Daemon
}
Maximum Concurrent Jobs: Director seviyesinde aynı anda kaç job çalışabileceğini belirler. Varsayılan 1 veya 2’dir, production ortamında 10-20 arası makul bir değerdir.
Storage bölümünde de bu ayarı yapmanız gerekir:
Storage {
Name = File1
Address = storage-server
SDPort = 9103
Password = "your-storage-password"
Device = FileChgr1
Media Type = File
Maximum Concurrent Jobs = 10
}
Client bazında da concurrent job sınırını kaldırmayı unutmayın. Özellikle güçlü sunuculara backup alırken bu önemlidir:
Client {
Name = webserver01-fd
Address = 192.168.1.10
FDPort = 9102
Catalog = MyCatalog
Password = "client-password"
File Retention = 60 days
Job Retention = 6 months
Maximum Concurrent Jobs = 4
AutoPrune = yes
}
Pool ve Volume Ayarları
Volume boyutunu doğru ayarlamak hem performansı hem de yönetilebilirliği etkiler. Çok küçük volume’lar katalog işlemlerini artırır, çok büyük volume’lar ise restore sürelerini uzatır.
Pool {
Name = Full-Pool
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 30 days
Maximum Volume Bytes = 50G
Maximum Volumes = 100
Label Format = "Full-"
Storage = File1
# Volume başına maximum job sayısı
Maximum Volume Jobs = 1
# Aynı anda yazılabilecek maksimum volume
Maximum Concurrent Jobs = 5
}
Maximum Volume Jobs = 1 ayarı full backup’lar için kritiktir. Her full backup kendi volume’una yazılır, bu restore işlemlerini dramatik şekilde hızlandırır.
Storage Daemon Optimizasyonu
Storage Daemon, Bacula’nın en fazla kaynak tüketen bileşenidir. Buradaki ayarlar doğrudan backup ve restore hızını etkiler.
/etc/bacula/bacula-sd.conf dosyasını düzenleyin:
Storage {
Name = Storage-Daemon
SDPort = 9103
WorkingDirectory = "/var/lib/bacula"
Pid Directory = "/var/run/bacula"
Maximum Concurrent Jobs = 20
# SD'nin kullanabileceği maksimum bant genişliği (0 = limitsiz)
Maximum Network Buffer Size = 131072
# Heartbeat intervali
Heartbeat Interval = 300
}
Device {
Name = FileStorage
Media Type = File
Archive Device = /backup/bacula
LabelMedia = yes
Random Access = yes
AutomaticMount = yes
RemovableMedia = no
AlwaysOpen = no
Maximum Concurrent Jobs = 10
# Buffer boyutunu artır (varsayılan 65536)
Maximum Block Size = 1048576
Minimum Block Size = 65536
# Sparse dosya desteği
Sparse File = yes
# Write bant genişliği limiti (0 = limitsiz)
Maximum Changer Wait = 300
}
Maximum Block Size parametresi çok önemlidir. Varsayılan 65536 byte olan blok boyutunu 1MB’a çıkarmak, özellikle büyük dosyalar yedeklenirken ciddi performans artışı sağlar. Disk bazlı storage için bu değeri 262144 ile 1048576 arasında tutun.
Compression ve Deduplication Stratejisi
Sıkıştırma Ayarları
Sıkıştırma CPU kullanımını artırır ama ağ trafiğini ve disk kullanımını azaltır. Doğru dengeyi bulmak için önce ne tür veri yedeklediğinizi bilmeniz gerekir.
# FileSet konfigürasyonunda sıkıştırma
FileSet {
Name = "LinuxFull"
Include {
Options {
# lz4 en iyi hız/sıkıştırma dengesini sunar
Compression = LZ4
# Zaten sıkıştırılmış dosyaları tekrar sıkıştırmayı atla
Drive Type = ext4
Signature = MD5
# Sparse dosyaları daha verimli yedekle
Sparse = yes
}
File = /home
File = /var/www
File = /etc
}
Exclude {
File = /proc
File = /sys
File = /dev
File = /tmp
File = /var/tmp
File = /run
# Zaten sıkıştırılmış dosyaları hariç tut veya farklı işle
File = /backup/archives
}
}
LZ4 vs GZIP karşılaştırması:
- LZ4: Düşük CPU kullanımı, yüksek hız, orta sıkıştırma oranı. Güçlü CPU’ları olmayan sistemler veya SSD storage için ideal.
- GZIP: Yüksek CPU kullanımı, düşük hız, yüksek sıkıştırma oranı. Bant genişliği kısıtlı ortamlar için tercih edilir.
- LZO: LZ4’e benzer ama biraz daha eski. Eski sistemlerde LZ4 yoksa kullanılabilir.
Zaten sıkıştırılmış dosyalar için (jpg, mp4, zip, gz, bz2) sıkıştırmayı devre dışı bırakın:
FileSet {
Name = "MediaFiles"
Include {
Options {
# Medya dosyaları için sıkıştırma kapalı
Compression = None
Signature = SHA1
}
File = /var/media
}
Include {
Options {
Compression = LZ4
Signature = SHA1
}
File = /var/www
File = /home
}
}
Katalog Veritabanı Optimizasyonu
Çok sayıda client ve uzun süredir çalışan Bacula kurulumlarında katalog veritabanı ciddi bir darboğaz haline gelebilir. Milyonlarca dosya kaydı olan bir katalog, job listesi sorgulamak bile dakikalar sürebilir.
PostgreSQL Optimizasyonu
Eğer katalog için PostgreSQL kullanıyorsanız (önerilen), postgresql.conf dosyasında şu ayarları yapın:
# /etc/postgresql/14/main/postgresql.conf
# Shared buffer'ı RAM'in %25'i olarak ayarlayın
shared_buffers = 4GB
# Effective cache size RAM'in %75'i
effective_cache_size = 12GB
# WAL buffer
wal_buffers = 64MB
# Checkpoint ayarları
checkpoint_completion_target = 0.9
checkpoint_timeout = 10min
# Paralel sorgu (PostgreSQL 9.6+)
max_parallel_workers_per_gather = 4
# Maintenance work memory (VACUUM, index rebuild için)
maintenance_work_mem = 1GB
# Autovacuum agresifliği
autovacuum_vacuum_scale_factor = 0.01
autovacuum_analyze_scale_factor = 0.005
Katalog üzerinde periyodik bakım yapmak şarttır:
#!/bin/bash
# /usr/local/sbin/bacula-catalog-maintenance.sh
# Katalog istatistiklerini güncelle
echo "Katalog istatistikleri güncelleniyor..."
psql -U bacula -d bacula -c "VACUUM ANALYZE;"
# Şişmiş indexleri yeniden oluştur
psql -U bacula -d bacula -c "REINDEX DATABASE bacula;"
# Eski job kayıtlarını temizle (bconsole üzerinden)
bconsole << EOF
prune jobs yes
prune files yes
prune stats yes
EOF
echo "Katalog bakımı tamamlandı: $(date)"
Bu scripti haftalık cron’a ekleyin:
# crontab -e
0 3 * * 0 /usr/local/sbin/bacula-catalog-maintenance.sh >> /var/log/bacula/catalog-maintenance.log 2>&1
Network Optimizasyonu
Bant Genişliği Kontrolü
Production saatlerinde backup trafiğinin network’ü doldurmasını engellemek için bant genişliği limitleri koyabilirsiniz:
Job {
Name = "WebServer-Incremental"
JobDefs = "DefaultJob"
Client = webserver01-fd
FileSet = "LinuxFull"
Schedule = "WeeklyCycle"
Storage = File1
# Mesai saatlerinde bant genişliğini kısıtla (KB/s cinsinden)
# Bu özellik Bacula 7.0+ gerektirir
Maximum Bandwidth = 50000 # 50 MB/s
}
Eğer birden fazla client’tan aynı anda backup alıyorsanız ve network daralmaya başlıyorsa, Schedule’ı düzenleyerek job’ları dağıtın:
Schedule {
Name = "StaggeredSchedule"
Run = Full 1st sun at 01:00
Run = Full 2nd sun at 01:30
Run = Full 3rd sun at 02:00
Run = Full 4th sun at 02:30
Run = Incremental mon-sat at 03:00
Run = Incremental mon-sat at 03:15 client=webserver02-fd
Run = Incremental mon-sat at 03:30 client=dbserver01-fd
}
File Daemon Optimizasyonu
Client tarafında da bazı önemli ayarlar var. /etc/bacula/bacula-fd.conf dosyasında:
FileDaemon {
Name = webserver01-fd
FDport = 9102
WorkingDirectory = /var/lib/bacula
Pid Directory = /var/run/bacula
Maximum Concurrent Jobs = 4
# Heartbeat, uzun süren backup'larda bağlantının kopmamasını sağlar
Heartbeat Interval = 300
# FD'nin kullanabileceği maximum memory
# Büyük FileSet'lerde bu değeri artırmak gerekebilir
Maximum Network Buffer Size = 131072
}
Incremental ve Differential Backup Stratejisi
Performans optimizasyonunun en etkili yöntemlerinden biri doğru backup tipini doğru sıklıkta çalıştırmaktır.
# Kurumsal ortam için optimize edilmiş schedule örneği
Schedule {
Name = "EnterpriseSchedule"
# Ayın ilk pazarı: Full backup
Run = Level=Full 1st mon at 22:00
# Her pazar: Differential (full'dan bu yana değişenler)
Run = Level=Differential sun at 22:00
# Her gün: Incremental (son backup'tan bu yana değişenler)
Run = Level=Incremental mon-sat at 02:00
}
# Her backup tipi için ayrı pool kullanın
Job {
Name = "FileServer-Backup"
Client = fileserver01-fd
FileSet = "LinuxFull"
Schedule = "EnterpriseSchedule"
Storage = File1
# Full backup için farklı pool
Full Backup Pool = Full-Pool
# Differential için ayrı pool
Differential Backup Pool = Diff-Pool
# Incremental için ayrı pool
Incremental Backup Pool = Inc-Pool
Write Bootstrap = "/var/lib/bacula/fileserver01.bsr"
Priority = 10
}
Backup Performansını İzleme ve Raporlama
Optimizasyonun sürdürülebilir olması için düzenli izleme şarttır. Bir monitoring scripti hazırlayın:
#!/bin/bash
# /usr/local/sbin/bacula-performance-report.sh
REPORT_FILE="/var/log/bacula/performance-$(date +%Y%m%d).log"
THRESHOLD_SPEED=30000 # KB/s cinsinden minimum kabul edilebilir hız
echo "=== Bacula Performans Raporu ===" > $REPORT_FILE
echo "Tarih: $(date)" >> $REPORT_FILE
echo "" >> $REPORT_FILE
# Son 24 saatin job'larını listele ve yavaş olanları işaretle
bconsole << 'EOF' | grep -A5 "JobId" >> $REPORT_FILE
list jobs last=50
EOF
# Tamamlanan job'ların ortalama hızını hesapla
psql -U bacula -d bacula -t -c "
SELECT
Name,
Level,
ROUND(JobBytes / 1024.0 / NULLIF(JobTDate - SchedTime, 0), 2) as speed_kbs,
JobBytes / 1024 / 1024 as size_mb,
StartTime,
EndTime
FROM Job
WHERE JobStatus = 'T'
AND StartTime > NOW() - INTERVAL '24 hours'
ORDER BY speed_kbs ASC;
" >> $REPORT_FILE
echo "" >> $REPORT_FILE
echo "=== Katalog Boyutu ===" >> $REPORT_FILE
psql -U bacula -d bacula -t -c "
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC
LIMIT 10;
" >> $REPORT_FILE
cat $REPORT_FILE | mail -s "Bacula Günlük Performans Raporu" [email protected]
Gerçek Dünya Senaryosu: 500GB Nightly Backup Optimizasyonu
Bir e-ticaret müşterisinde karşılaştığım senaryoyu paylaşayım. 15 sunucu, toplam 500GB günlük incremental backup, gece 02:00’de başlıyor ve sabah 07:30’da bitmesi gerekiyor. İlk kurulumda 10 saati aşıyordu.
Tespit edilen sorunlar:
- Maximum Concurrent Jobs = 2 (varsayılan)
- Block Size = 65536 (varsayılan)
- GZIP compression (yüksek CPU, düşük hız)
- Katalog üzerinde hiç bakım yapılmamış, 18 aylık veri birikmiş
- Tüm job’lar aynı anda başlatılmış, network saturasyonu
Uygulanan çözümler:
# Director'da concurrent job limitini kaldır
# Maximum Concurrent Jobs = 20
# Storage block size artırımı
# Maximum Block Size = 524288
# Compression değişikliği
# Compression = LZ4 (GZIP'ten geçiş)
# Job'ları 10'ar dakika arayla başlat
# Schedule'da stagger uygula
# Katalog temizliği
bconsole << EOF
prune jobs yes
prune files yes
delete volume=OldVolume001 yes
EOF
# PostgreSQL VACUUM
psql -U bacula -d bacula -c "VACUUM FULL ANALYZE;"
Bu değişikliklerden sonra toplam süre 10 saatten 4.5 saate düştü. Compression değişikliği tek başına %40 hız artışı sağladı.
Tape Library Ortamında Ek Optimizasyonlar
Eğer hala tape kullanıyorsanız (büyük arşivler için hala mantıklı), birkaç ek ayar daha var:
Device {
Name = TapeLibrary
Media Type = LTO8
Archive Device = /dev/nst0
AutomaticMount = yes
AlwaysOpen = yes
RemovableMedia = yes
RandomAccess = no
# Tape için büyük blok boyutu kritik
Maximum Block Size = 2097152 # 2MB
Minimum Block Size = 65536
# Hardware sıkıştırma varsa yazılım sıkıştırmayı kapat
# Drive Crypto = yes
# Tape dolmadan önce ne kadar alan bırakılacak
Maximum Volume Files = 10000
# Alert komutları
Alert Command = "tapeinfo -f %c"
}
Tape ortamında altın kural: Hardware sıkıştırma destekleyen modern LTO sürücülerde yazılım sıkıştırması (GZIP, LZ4) kapatılmalıdır. İkili sıkıştırma hem CPU yiyor hem de veriyi genişletebiliyor.
Sonuç
Bacula performans optimizasyonu tek seferlik bir iş değil, sürekli izleme ve ayarlama gerektiren bir süreçtir. Özetlemek gerekirse, önce darboğazı tespit edin, sonra sırayla Director’daki concurrent job limitlerini artırın, Storage Daemon’da block size’ı yükseltin, compression algoritmasını iş yüküne göre seçin (çoğu durumda LZ4 kazanır), katalog veritabanını düzenli bakıma alın ve son olarak job’larınızı schedule üzerinde dağıtarak network satürasyonunu önleyin. Bu adımları uyguladıktan sonra çoğu ortamda %50 ile %70 arasında bir performans artışı görmek mümkün. Ölçmeden iyileştirme olmaz, bu yüzden her değişiklikten önce ve sonra job sürelerini kaydedin ve karşılaştırın.
