Bacula ile VMware vSphere Sanal Makine Yedekleme Entegrasyonu

VMware vSphere ortamlarında sanal makineleri yedeklemek, geleneksel fiziksel sunucu yedeklemelerinden oldukça farklı bir yaklaşım gerektiriyor. Bacula’yı vSphere ile entegre ettiğinizde, hem snapshot tabanlı tutarlı yedekler alabilir hem de merkezi yönetim avantajından faydalanabilirsiniz. Bu yazıda sıfırdan kurulumu, yapılandırmayı ve gerçek dünya senaryolarını ele alacağız.

Neden Bacula ve vSphere Birlikte?

Kurumsal ortamlarda sıkça karşılaştığım bir durum şu: Onlarca, hatta yüzlerce sanal makine var, her birinin ayrı bir yedekleme ajanı var ve yönetim tam anlamıyla kabus. Bacula’nın vSphere entegrasyonu bu soruna şöyle bir çözüm sunuyor: VADP (vStorage APIs for Data Protection) sayesinde sanal makineleri VMware katmanından, yani hypervisor seviyesinden yedekleyebiliyorsunuz. Bu yaklaşımın avantajları şunlar:

  • Sanal makine içine ajan kurmanıza gerek kalmıyor (agentless yedekleme)
  • VMware snapshot mekanizmasını kullanarak tutarlı, çalışır durumdaki yedekler alınıyor
  • vCenter üzerinden tüm VM’leri merkezi olarak yönetebiliyorsunuz
  • Changed Block Tracking (CBT) ile artımlı yedekleme destekleniyor
  • Yedekleme penceresi önemli ölçüde kısalıyor

Bacula Enterprise sürümü bu entegrasyon için native destek sunuyor. Bacula Community sürümünde ise Bacula-VMware Plugin veya üçüncü parti araçlarla entegrasyon sağlanabiliyor. Bu yazıda her iki yaklaşıma da değineceğiz.

Ortam Gereksinimleri

Kuruluma geçmeden önce ortamınızın hazır olduğundan emin olmanız gerekiyor. Bir müşteri ortamında bu adımı atladığımızda saatler kaybetmiştik.

Bacula Director ve Storage Daemon için:

  • Bacula 11.0 veya üzeri (Community) / Bacula Enterprise 14.x
  • CentOS/RHEL 8+ veya Ubuntu 20.04+
  • VMware vSphere SDK for Python (pyvmomi)
  • Bacula VMware Plugin (bacula-vmware-plugin paketi)

VMware Tarafında:

  • vCenter Server 6.7 veya üzeri
  • ESXi 6.7 veya üzeri
  • vSphere API erişimi açık olmalı
  • Dedicated yedekleme hesabı (minimum gerekli roller ile)

Ağ Gereksinimleri:

  • Bacula Storage Daemon’ın ESXi host’larına 443/TCP ile erişimi
  • vCenter’a 443/TCP erişimi
  • Yedekleme trafiği için ayrı VLAN önerilir (production ağını patlatmamak için)

vCenter’da Yedekleme Hesabı Oluşturma

En az yetki prensibini burada da uyguluyoruz. vCenter’da özel bir yedekleme rolü oluşturuyoruz:

# vSphere CLI ile rol oluşturma
govc role.create bacula-backup-role 
  Datastore.Browse 
  Datastore.FileManagement 
  Global.DisableMethods 
  Global.EnableMethods 
  VirtualMachine.Config.DiskLease 
  VirtualMachine.Interact.GuestControl 
  VirtualMachine.State.CreateSnapshot 
  VirtualMachine.State.RemoveSnapshot 
  VirtualMachine.State.RevertToSnapshot 
  VirtualMachine.Provisioning.DiskRandomAccess 
  VirtualMachine.Provisioning.GetVmFiles

Bu rolü oluşturduktan sonra vCenter GUI’den veya CLI’dan yedekleme kullanıcısına atıyoruz:

# govc ile kullanıcıya rol atama
govc permissions.set 
  -principal [email protected] 
  -role bacula-backup-role 
  -propagate=true 
  /datacenter01

Bacula VMware Plugin Kurulumu

Plugin Paketinin Yüklenmesi

Plugin’i Bacula’nın resmi deposundan veya kaynak koddan derleyerek kurabilirsiniz. CentOS 8 örneği:

# Bacula reposunu ekleyelim
cat > /etc/yum.repos.d/bacula.repo << 'EOF'
[bacula-community]
name=Bacula Community Repository
baseurl=https://www.bacula.org/packages/8622e34f6d5a2e3d6b3a8f4d9c1e7b2a/rpms/14.0/el8/x86_64/
gpgcheck=1
gpgkey=https://www.bacula.org/downloads/Bacula-4096-Distribution-Verification-key.asc
enabled=1
EOF

# Plugin paketini yükleyelim
dnf install -y bacula-vmware-plugin bacula-vmware-plugin-libs

# Python bağımlılıklarını yükleyelim
pip3 install pyvmomi requests

Plugin başarıyla kurulduktan sonra Bacula File Daemon’ın plugin dizinini kontrol edin:

# Plugin yolunu doğrulayın
ls -la /usr/lib64/bacula/plugins/ | grep vmware
# vmware-fd.so dosyasını görmelisiniz

# bacula-fd.conf içindeki plugin dizinini kontrol edin
grep -i plugindir /etc/bacula/bacula-fd.conf

VMware Plugin Yapılandırma Dosyası

Plugin’in vCenter’a bağlanabilmesi için bir yapılandırma dosyası oluşturuyoruz:

cat > /etc/bacula/vmware.conf << 'EOF'
# VMware vCenter Bağlantı Ayarları
[vmware]
vcenter_host = vcenter01.sirket.local
vcenter_port = 443
vcenter_username = [email protected]
vcenter_password = GucluBirSifre123!
ssl_verify = true
ca_cert = /etc/bacula/certs/vcenter-ca.pem

# Snapshot Ayarları
snapshot_name = Bacula_Backup
snapshot_description = Bacula tarafindan olusturulan yedekleme snapshot
snapshot_memory = false
snapshot_quiesce = true

# CBT (Changed Block Tracking) Ayarları
enable_cbt = true
cbt_reset_on_full = true

# Timeout Ayarları
connection_timeout = 30
operation_timeout = 3600
EOF

chmod 600 /etc/bacula/vmware.conf
chown bacula:bacula /etc/bacula/vmware.conf

Bacula Director Yapılandırması

FileSet Tanımı

VMware sanal makineleri için özel bir FileSet tanımlaması gerekiyor. Bu yapılandırma, hangi VM’lerin ve hangi disklerin yedekleneceğini belirliyor:

# /etc/bacula/conf.d/vmware-filesets.conf

FileSet {
  Name = "VMware-Production-VMs"
  Include {
    Options {
      signature = MD5
      compression = LZO
      # VMware plugin'e özgü seçenekler
      plugin = "vmware"
    }
    # Plugin direktifleri
    Plugin = "vmware:
      vcenter=vcenter01.sirket.local
      [email protected]
      password=GucluBirSifre123!
      vm_name=webserver01
      include_disk=Hard disk 1
      include_disk=Hard disk 2
      transport=nbdssl"

    Plugin = "vmware:
      vcenter=vcenter01.sirket.local
      [email protected]
      password=GucluBirSifre123!
      vm_folder=/Datacenter/vm/Production
      transport=nbdssl
      exclude_vm=test-.*
      exclude_vm=dev-.*"
  }
}

Burada transport=nbdssl seçeneği önemli. NBD (Network Block Device) üzerinden şifreli iletişim sağlıyor. Eğer Bacula Storage Daemon ESXi host ile aynı ağdaysa hotadd transport modunu da kullanabilirsiniz; bu çok daha hızlı.

Job Tanımları

Şimdi yedekleme işlerini tanımlayalım. Production ortamında genellikle şu yapıyı kullanıyorum:

# /etc/bacula/conf.d/vmware-jobs.conf

# Tam Yedekleme - Haftalık
Job {
  Name = "VMware-Full-Weekly"
  Type = Backup
  Level = Full
  Client = bacula-vmware-fd
  FileSet = "VMware-Production-VMs"
  Schedule = "WeeklyFullSchedule"
  Storage = VMwareStorage
  Pool = VMware-Full-Pool
  Messages = Standard
  Priority = 10
  Maximum Concurrent Jobs = 2
  SpoolData = yes
  # VM snapshot için özel yazma modu
  WriteBootstrap = "/var/lib/bacula/VMware-Full-Weekly.bsr"
}

# Artımlı Yedekleme - Günlük
Job {
  Name = "VMware-Incremental-Daily"
  Type = Backup
  Level = Incremental
  Client = bacula-vmware-fd
  FileSet = "VMware-Production-VMs"
  Schedule = "DailyIncrementalSchedule"
  Storage = VMwareStorage
  Pool = VMware-Incremental-Pool
  Messages = Standard
  Priority = 10
  Maximum Concurrent Jobs = 3
  SpoolData = yes
  WriteBootstrap = "/var/lib/bacula/VMware-Incremental.bsr"
}

# Schedule Tanımları
Schedule {
  Name = "WeeklyFullSchedule"
  Run = Level=Full sun at 02:00
}

Schedule {
  Name = "DailyIncrementalSchedule"
  Run = Level=Incremental mon-sat at 23:00
}

Storage ve Pool Yapılandırması

VMware yedeklemeleri için ayrı bir storage ve pool tanımlamak yönetimi kolaylaştırıyor:

# /etc/bacula/conf.d/vmware-storage.conf

Storage {
  Name = VMwareStorage
  Address = backup-server01.sirket.local
  SDPort = 9103
  Password = "StoragePassword123"
  Device = VMware-AutoChanger
  Media Type = VMwareTape
  Maximum Concurrent Jobs = 4
}

Pool {
  Name = VMware-Full-Pool
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 4 weeks
  Maximum Volume Bytes = 500G
  Maximum Volumes = 20
  Label Format = "VMware-Full-"
  Next Pool = VMware-Offsite-Pool
}

Pool {
  Name = VMware-Incremental-Pool
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 2 weeks
  Maximum Volume Bytes = 200G
  Maximum Volumes = 50
  Label Format = "VMware-Inc-"
}

Changed Block Tracking (CBT) Yapılandırması

CBT, VMware’in sunduğu en değerli özelliklerden biri. Bir önceki yedekten sonra değişen blokları takip ediyor ve sadece değişen kısımları yedeklemenize izin veriyor. Büyük disk boyutlarında inanılmaz fark yaratıyor.

CBT’yi etkinleştirmek için:

# CBT durumunu kontrol eden script
cat > /usr/local/bin/check-vm-cbt.sh << 'SCRIPT'
#!/bin/bash
# govc ile tüm VM'lerde CBT durumunu kontrol et

VCENTER="vcenter01.sirket.local"
export GOVC_URL="https://[email protected]:GucluBirSifre123!@${VCENTER}"
export GOVC_INSECURE=0
export GOVC_TLS_CA_CERTS="/etc/bacula/certs/vcenter-ca.pem"

echo "VM CBT Durum Raporu - $(date)"
echo "================================"

for vm in $(govc ls /Datacenter/vm/Production/); do
    vm_name=$(basename "$vm")
    cbt_status=$(govc vm.info -json "$vm" | python3 -c "
import json,sys
data=json.load(sys.stdin)
config=data['VirtualMachines'][0]['Config']
print(config.get('ChangeTrackingEnabled', False))
")
    echo "VM: $vm_name | CBT: $cbt_status"
done
SCRIPT

chmod +x /usr/local/bin/check-vm-cbt.sh

Geri Yükleme Senaryoları

Tam VM Geri Yükleme

Gerçek dünyada en çok ihtiyaç duyduğunuz senaryo bu. Bir VM’nin tamamen bozulduğunu düşünün:

# bconsole üzerinden restore işlemi
bconsole << 'EOF'
restore
# Menüden "Select the most recent backup for a client" seçeneğini seçin (5)
5
# Client'ı belirtin
mark all
done
# Restore hedefini belirtin - orijinal lokasyon veya farklı datastore
# Restore type: 1=Full VM, 2=Specific files
EOF

Komut satırından otomatik restore için:

# Otomatik VM restore scripti
cat > /usr/local/bin/restore-vm.sh << 'SCRIPT'
#!/bin/bash

VM_NAME="${1}"
RESTORE_DATE="${2:-latest}"
TARGET_DATASTORE="${3:-datastore01}"

if [ -z "$VM_NAME" ]; then
    echo "Kullanim: $0 <vm_name> [restore_date] [target_datastore]"
    exit 1
fi

echo "VM restore basliyor: $VM_NAME"
echo "Hedef Datastore: $TARGET_DATASTORE"

bconsole << BCONSOLE
restore client=bacula-vmware-fd
where=/vmfs/volumes/${TARGET_DATASTORE}/restored_${VM_NAME}
select
2
${VM_NAME}
done
yes
BCONSOLE

echo "Restore tamamlandi. Sonucu kontrol edin."
SCRIPT

chmod +x /usr/local/bin/restore-vm.sh

Dosya Seviyesinde Geri Yükleme (FLR)

Bazen tüm VM’yi değil, sadece bir dosyayı geri yüklemeniz gerekiyor. VMware plugin bu durumda sanal diski mount ediyor:

# Dosya seviyesi geri yükleme için plugin mount komutu
cat > /etc/bacula/conf.d/flr-restore.conf << 'EOF'
Job {
  Name = "VMware-FLR-Restore"
  Type = Restore
  Client = bacula-vmware-fd
  FileSet = "VMware-Production-VMs"
  Storage = VMwareStorage
  Pool = VMware-Full-Pool
  Messages = Standard
  # Dosya seviyesi restore için mount noktası
  Where = /mnt/bacula-restore
  # VMware plugin FLR modu
  Plugin Options = "vmware:flr_mode=true:mount_point=/mnt/vm-disks"
}
EOF

İzleme ve Alerting

Yedekleme işlerinin başarılı olup olmadığını takip etmek kritik. Basit ama etkili bir izleme scripti:

#!/bin/bash
# /usr/local/bin/bacula-vmware-monitor.sh
# Crontab: 0 8 * * * /usr/local/bin/bacula-vmware-monitor.sh

MAIL_TO="[email protected]"
BACULA_HOST="backup-server01.sirket.local"
FAILED_JOBS=""
WARNING_JOBS=""

# Son 24 saatteki job durumlarını çek
JOB_STATUS=$(echo "list jobs last 24hours" | bconsole | grep -E "VMware")

# Başarısız jobları tespit et
while IFS= read -r line; do
    if echo "$line" | grep -qE "E|f"; then
        FAILED_JOBS="${FAILED_JOBS}n${line}"
    elif echo "$line" | grep -qE "W"; then
        WARNING_JOBS="${WARNING_JOBS}n${line}"
    fi
done <<< "$JOB_STATUS"

# Alert gönder
if [ -n "$FAILED_JOBS" ]; then
    echo -e "KRITIK: VMware yedekleme hatalari tespit edildi!nnBasarisiz Joblar:n${FAILED_JOBS}" | 
    mail -s "[KRITIK] Bacula VMware Yedekleme Hatasi - ${BACULA_HOST}" "$MAIL_TO"
fi

# Snapshot temizliği kontrolü - asılı kalan snapshotları tespit et
export GOVC_URL="https://[email protected]:[email protected]"
STALE_SNAPSHOTS=$(govc snapshot.tree -vm "*" 2>/dev/null | grep "Bacula_Backup" | 
    awk -v date="$(date -d '2 hours ago' +%Y-%m-%dT%H:%M)" '$0 < date')

if [ -n "$STALE_SNAPSHOTS" ]; then
    echo -e "UYARI: Asili kalan Bacula snapshotlari bulundu!n${STALE_SNAPSHOTS}" | 
    mail -s "[UYARI] Asili VMware Snapshot - ${BACULA_HOST}" "$MAIL_TO"
fi

Sık Karşılaşılan Sorunlar ve Çözümleri

Snapshot Temizlenmeme Sorunu

Yedekleme ortasında bir hata oluşursa snapshot silinmeyebilir. Bu hem disk dolmasına hem de VM performansının düşmesine yol açar. Düzenli temizlik zorunlu:

# Asılı kalan Bacula snapshot'larını temizle
cat > /usr/local/bin/cleanup-bacula-snapshots.sh << 'SCRIPT'
#!/bin/bash
export GOVC_URL="https://[email protected]:[email protected]"
export GOVC_TLS_CA_CERTS="/etc/bacula/certs/vcenter-ca.pem"

# 4 saatten eski Bacula snapshotlarını bul ve sil
govc find / -type m | while read vm; do
    govc snapshot.tree -vm "$vm" 2>/dev/null | while read snapshot_info; do
        if echo "$snapshot_info" | grep -q "Bacula_Backup"; then
            snap_time=$(echo "$snapshot_info" | grep -oP 'd{4}-d{2}-d{2}Td{2}:d{2}')
            current_time=$(date +%s)
            snap_timestamp=$(date -d "$snap_time" +%s 2>/dev/null)
            age_hours=$(( (current_time - snap_timestamp) / 3600 ))
            
            if [ "$age_hours" -gt 4 ]; then
                echo "Eski snapshot siliniyor: $vm - $snap_time (${age_hours} saat)"
                govc snapshot.remove -vm "$vm" "Bacula_Backup"
            fi
        fi
    done
done
SCRIPT
chmod +x /usr/local/bin/cleanup-bacula-snapshots.sh

CBT Bozulması

Bazen CBT veritabanı bozulabiliyor ve artımlı yedekler beklenenden büyük geliyor. Çözüm şu:

  • VMware host’unu bakım moduna alın
  • Storage vMotion ile VM’yi başka bir datastore’a taşıyın ve geri getirin
  • Bu işlem CBT’yi sıfırlıyor
  • Bir sonraki yedekleme Full alınarak CBT yeniden başlatılıyor

SSL Sertifika Sorunları

vCenter sertifikasını Bacula’nın güvendiği certificate store’a eklemeyi unutmayın:

# vCenter CA sertifikasını indir ve ekle
openssl s_client -connect vcenter01.sirket.local:443 -showcerts 2>/dev/null | 
  openssl x509 -outform PEM > /etc/bacula/certs/vcenter-ca.pem

# Sistem sertifika deposuna da ekleyelim
cp /etc/bacula/certs/vcenter-ca.pem /etc/pki/ca-trust/source/anchors/
update-ca-trust extract

Performans Optimizasyonu

Büyük ortamlarda yedekleme penceresini küçültmek için şu ayarları yapın:

  • Maximum Concurrent Jobs: Director ve Storage Daemon’da eş zamanlı job sayısını artırın, ancak ESXi host başına maksimum 4 eş zamanlı VADP bağlantısına dikkat edin
  • Transport Mode Seçimi: Bacula ve ESXi aynı ağdaysa nbdssl yerine hotadd kullanın, okuma hızı 3-5 kat artıyor
  • Compression: LZO kullanın, LZ4 kadar hızlı değil ama sıkıştırma oranı daha iyi
  • SpoolData: Disk boyutunuz yeterliyse açın, bant/disk yazmasını optimize ediyor
  • CBT’yi mutlaka aktif tutun: 100 GB diskli bir VM’de sadece 2 GB değişiklik olduysa sadece 2 GB yedekleniyor

Sonuç

Bacula ile vSphere entegrasyonu ilk kurulumda biraz karmaşık görünebilir, ancak doğru kurulduktan sonra son derece güvenilir ve ölçeklenebilir bir yapı oluşturuyor. Bu yazıda ele aldığımız noktaları özetleyecek olursak:

  • vCenter’da minimum yetki prensibine uygun servis hesabı oluşturun
  • CBT’yi mutlaka aktif tutun, hem zaman hem bant genişliği tasarrufu sağlıyor
  • Asılı kalan snapshot’lar için otomatik temizlik scriptini crontab’a ekleyin
  • Transport modunu ağ topolojinize göre seçin
  • Yedekleme başarı durumunu günlük mail ile takip edin

Gerçek bir DR tatbikatı yapmadan yedekleme sistemine güvenmek tehlikeli. Her 3 ayda bir en az bir kritik VM’yi test ortamına restore edip uygulamanın çalışıp çalışmadığını doğrulayın. Yedek aldığınızı sanmak ile yedek aldığınızı bilmek arasındaki fark, tam da en kötü anda ortaya çıkıyor.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir