rsync ile Yedekleme ve Senkronizasyon: Temel Kullanımdan İleri Düzey Senaryolara

Sistem yöneticiliğinde “yedekleme aldım” demek ile “doğru yedekleme aldım” demek arasındaki fark, genellikle bir felaket anında ortaya çıkar. rsync, bu farkı kapatan araçların başında gelir. Yıllar içinde onlarca farklı ortamda rsync kullandım; küçük bir web sunucusundan petabayt ölçekli depolama sistemlerine kadar. Her seferinde şunu gördüm: rsync’i gerçekten anlayan ile sadece kopyala-yapıştır yapan arasında dağlar kadar fark var.

rsync Nedir ve Neden Hâlâ Güncel?

rsync, 1996 yılında Andrew Tridgell tarafından geliştirilen, delta-transfer algoritmasına dayanan bir dosya senkronizasyon aracıdır. Peki neden 2024’te hâlâ konuşuyoruz? Çünkü basit bir cp veya scp komutunun yapamadığını yapıyor: sadece değişen parçaları transfer ediyor.

Bir senaryoyu düşünelim. 50 GB’lık bir veritabanı yedeğiniz var ve her gece bunu uzak sunucuya kopyalıyorsunuz. scp ile bu işlem her seferinde 50 GB transfer anlamına gelir. rsync ile, eğer sadece 200 MB değiştiyse, 200 MB transfer edersiniz. Bant genişliğiniz ve zaman açısından bu devasa bir fark.

Temel çalışma prensibi:

  • Kaynak ve hedef dosyaları checksum ile karşılaştırır
  • Sadece farklı blokları transfer eder
  • Hem yerel hem uzak (SSH üzerinden) senkronizasyonu destekler
  • Sembolik linkler, izinler, zaman damgaları korunabilir

Temel Kullanım ve Kritik Parametreler

rsync sözdizimi şu şekildedir:

rsync [seçenekler] kaynak hedef

Günlük kullanımda en çok işe yarayan parametreler:

-a (archive): Sembolik linkler, izinler, zaman damgaları, sahiplik bilgilerini korur. Aslında -rlptgoD kombinasyonunun kısaltmasıdır.

-v (verbose): Ne yapıldığını gösterir. Özellikle ilk çalıştırmada mutlaka kullanın.

-z (compress): Transfer sırasında sıkıştırma uygular. Yavaş ağlarda işe yarar ama yerel ağlarda CPU’yu gereksiz yorar.

-P: --partial --progress kombinasyonu. Yarıda kalan transferi devam ettirir ve ilerlemeyi gösterir.

–delete: Kaynakta silinmiş dosyaları hedeften de siler. Gerçek senkronizasyon için şart.

-n (–dry-run): Hiçbir şeyi değiştirmez, sadece ne yapacağını söyler. Her yeni rsync komutunu önce bununla test edin.

–exclude: Belirtilen dosya/dizinleri atlar.

-e: Kullanılacak uzak shell’i belirtir (genellikle SSH).

Şimdi pratik örneklere geçelim.

Basit Yerel Yedekleme

# /var/www dizinini /backup/www'ya yedekle
rsync -av /var/www/ /backup/www/

# UYARI: Kaynak path'in sonundaki / önemli!
# /var/www/ -> www içeriğini kopyalar
# /var/www  -> www dizininin kendisini kopyalar (hedefte /backup/www/www/ oluşur)

Bu basit görünen slash farkı, acemi sysadmin’lerin en çok düştüğü tuzaklardan biridir. Bunu bir kez yanlış yapıp prod ortamda www/www/ dizin yapısı oluşturunca bir daha unutmuyorsunuz.

SSH Üzerinden Uzak Senkronizasyon

# Yerel -> Uzak
rsync -avz -e "ssh -p 2222" /var/www/ [email protected]:/backup/www/

# Uzak -> Yerel
rsync -avz [email protected]:/var/www/ /backup/www/

# SSH key ile ve bandwidth limit uygulayarak (KB/s cinsinden)
rsync -avz --bwlimit=5000 -e "ssh -i /root/.ssh/backup_key" 
  /var/www/ kullanici@backup-server:/backup/www/

Gerçek Dünya Senaryosu 1: Web Sunucusu Yedeği

Bir e-ticaret sitesi yönetiyorsunuz. Her gece web dosyalarını ve medya içeriklerini yedeklemeniz gerekiyor. Log dosyalarını ve geçici dosyaları yedeklemeye dahil etmek istemiyorsunuz.

#!/bin/bash
# /usr/local/bin/web-backup.sh

KAYNAK="/var/www/eticaret/"
HEDEF="[email protected]:/yedekler/web/"
LOG_DOSYASI="/var/log/rsync-backup.log"
TARIH=$(date +%Y-%m-%d_%H:%M:%S)

echo "[$TARIH] Yedekleme başladı" >> $LOG_DOSYASI

rsync -avz --delete 
  --exclude='*.log' 
  --exclude='*.tmp' 
  --exclude='cache/' 
  --exclude='sessions/' 
  --exclude='.git/' 
  --log-file=$LOG_DOSYASI 
  -e "ssh -i /root/.ssh/backup_key -o StrictHostKeyChecking=no" 
  $KAYNAK $HEDEF

CIKIS_KODU=$?

if [ $CIKIS_KODU -eq 0 ]; then
    echo "[$TARIH] Yedekleme BAŞARILI" >> $LOG_DOSYASI
else
    echo "[$TARIH] Yedekleme BAŞARISIZ - Çıkış kodu: $CIKIS_KODU" >> $LOG_DOSYASI
    # Alarm gönder
    echo "Web yedeği başarısız! Çıkış kodu: $CIKIS_KODU" | mail -s "ALARM: Yedekleme Hatası" [email protected]
fi

Bu scripti crontab’a ekleyin:

# Her gece 02:00'da çalıştır
0 2 * * * /usr/local/bin/web-backup.sh

İleri Düzey: Artımlı Yedekleme (Snapshot Yöntemi)

rsync’in en güçlü kullanım senaryolarından biri, --link-dest parametresiyle yapılan artımlı snapshot yedeklemesidir. Bu yöntemde hard link kullanılır; değişmeyen dosyalar disk alanı tüketmez ama her snapshot klasörü sanki tam yedekmiş gibi görünür.

#!/bin/bash
# /usr/local/bin/snapshot-backup.sh
# Haftalık rotasyonlu snapshot yedekleme

KAYNAK="/home/"
HEDEF_DIZIN="/backup/snapshots"
TARIH=$(date +%Y-%m-%d)
ONCEKI="${HEDEF_DIZIN}/snapshot_onceki"
YENI="${HEDEF_DIZIN}/snapshot_${TARIH}"

# Önceki snapshot varsa link-dest olarak kullan
if [ -d "$ONCEKI" ]; then
    rsync -av --delete 
      --link-dest="$ONCEKI" 
      $KAYNAK "${YENI}/"
else
    # İlk çalışma, normal kopyala
    rsync -av --delete 
      $KAYNAK "${YENI}/"
fi

# Sembolik linki güncelle
rm -f "$ONCEKI"
ln -s "$YENI" "$ONCEKI"

# 30 günden eski snapshotları sil
find $HEDEF_DIZIN -maxdepth 1 -name "snapshot_*" -mtime +30 -exec rm -rf {} ;

echo "Snapshot tamamlandı: $YENI"

Bu yaklaşımın güzelliği şu: 30 günlük snapshot saklıyorsunuz ama disk kullanımı, değişen dosyalar kadar artıyor. Değişmeyen dosyalar hard link sayesinde tek kopyada tutuluyor.

Gerçek Dünya Senaryosu 2: İki Sunucu Arası Canlı Senkronizasyon

İki web sunucunuz var ve dosya sistemini senkron tutmanız gerekiyor. Bu senaryoda --checksum parametresi önemli hale geliyor çünkü zaman damgasına değil, gerçek içeriğe bakarak karar vermek istiyorsunuz.

# Önce dry-run ile kontrol et
rsync -avnc --delete 
  --exclude='*.pid' 
  --exclude='tmp/' 
  /var/www/uygulama/ 
  [email protected]:/var/www/uygulama/

# Sonuçtan memnunsanız -n'yi kaldırın
rsync -avc --delete 
  --exclude='*.pid' 
  --exclude='tmp/' 
  /var/www/uygulama/ 
  [email protected]:/var/www/uygulama/

-c (–checksum): Dosya boyutu ve zaman damgası yerine MD5 checksum karşılaştırması yapar. Daha yavaş ama daha güvenilir. NFS veya zaman dilimi sorunlarının yaşandığı ortamlarda hayat kurtarır.

rsync ile Büyük Veri Transferi: Pratik İpuçları

Bir keresinde 2 TB’lık bir veri setini iki veri merkezi arasında taşımam gerekti. Düz rsync başlattım, ağ koptu, başa döndüm. İşte o zaman bazı şeyleri öğrendim:

# Büyük transferler için: partial dosyaları sakla, progress göster,
# checksum yerine boyut+zaman kullan (hız için), timeout ekle
rsync -avP 
  --partial-dir=".rsync-partial" 
  --timeout=300 
  --bwlimit=50000 
  -e "ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=10" 
  /data/buyuk-dataset/ 
  user@remote:/data/buyuk-dataset/

--partial-dir parametresi çok önemli. Yarıda kalan dosyaları gizli bir dizinde saklıyor ve transfer devam ettiğinde kaldığı yerden başlıyor. Aksi halde her kopukta o dosyayı baştan transfer eder.

Büyük transferlerde işe yarayan ek parametreler:

–inplace: Dosyaları geçici kopya oluşturmadan doğrudan günceller. Büyük dosyalarda disk alanı tasarrufu sağlar ama yazma sırasında dosya bozulabilir. Veritabanı dosyaları için kullanmayın.

–no-whole-file: rsync normalde yerel transferlerde delta transferini devre dışı bırakır. Bu seçenek bunu zorunlu kılar.

–compress-level: 1-9 arası sıkıştırma seviyesi. Genellikle 6 iyi bir denge noktasıdır.

Rsync Daemon Modu: Merkezi Yedekleme Sunucusu

SSH yerine rsync’in kendi protokolünü kullanmak istediğinizde daemon modunu kullanırsınız. Bu özellikle çok sayıda sunucudan merkezi bir yedekleme sunucusuna veri toplarken işe yarar.

Yedekleme sunucusunda /etc/rsyncd.conf oluşturun:

# /etc/rsyncd.conf
uid = rsync
gid = rsync
use chroot = yes
max connections = 10
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock

[web-yedek]
path = /backup/web
comment = Web Sunucu Yedekleri
read only = no
list = no
auth users = webbackup
secrets file = /etc/rsyncd.secrets
hosts allow = 10.0.0.0/24

[db-yedek]
path = /backup/database
comment = Veritabanı Yedekleri
read only = no
list = no
auth users = dbbackup
secrets file = /etc/rsyncd.secrets
hosts allow = 10.0.0.0/24
# /etc/rsyncd.secrets dosyası
webbackup:guvenli_sifre_123
dbbackup:baska_guvenli_sifre_456

# İzinleri mutlaka ayarlayın
chmod 600 /etc/rsyncd.secrets

# Servisi başlatın
systemctl enable rsync
systemctl start rsync

İstemci tarafında kullanım:

# rsync daemon'a bağlan (:: çift iki nokta kullanımına dikkat)
rsync -av /var/www/ rsync://[email protected]/web-yedek/

# Şifreyi environment variable olarak geç
export RSYNC_PASSWORD="guvenli_sifre_123"
rsync -av /var/www/ [email protected]::web-yedek/

Exclude Dosyası ile Temiz Yapılandırma

Hariç tutulacak dosya sayısı arttığında komut satırı karmaşıklaşır. Bu durumda exclude dosyası kullanın:

# /etc/rsync-excludes/web-uygulama.txt
*.log
*.tmp
*.swp
.git/
.gitignore
node_modules/
vendor/
cache/
sessions/
uploads/thumbs/
*.bak
.DS_Store
Thumbs.db
rsync -av --delete 
  --exclude-from='/etc/rsync-excludes/web-uygulama.txt' 
  /var/www/uygulama/ 
  [email protected]:/backup/uygulama/

Yaygın Hatalar ve Çözümleri

1. “rsync error: some files could not be transferred (code 23)”

Bu hata genellikle izin sorunlarından kaynaklanır. Hangi dosyaların atlandığını görmek için:

rsync -av --log-file=/tmp/rsync-debug.log kaynak/ hedef/
grep "Permission denied|failed" /tmp/rsync-debug.log

2. Büyük dizin ağaçlarında yavaşlama

rsync, dosya listesini başlangıçta RAM’e alır. Milyonlarca dosya varsa bu bellek sorununa yol açar. --no-inc-recursive yerine --inc-recursive (zaten varsayılan) kullanıldığından emin olun. Alternatif olarak dizini parçalara bölün:

# Her bir alt dizini ayrı ayrı senkronize et
for dir in /data/*/; do
    rsync -av --delete "$dir" "backup@sunucu:/backup/$(basename $dir)/"
done

3. Zaman dilimi kaynaklı gereksiz transferler

Sunucular farklı zaman dilimindeyse rsync sürekli dosyaları “değişmiş” sanabilir. --modify-window=1 parametresi küçük zaman farklarını tolere eder:

rsync -av --modify-window=2 kaynak/ hedef/

Performans Optimizasyonu

rsync’in çıkış kodları hakkında bir not: 0 başarı, 23 kısmi başarı, 24 bazı dosyalar transfer sırasında kayboldu, 255 açıklanamayan hata anlamına gelir. Scripting yaparken bu kodları kullanın.

Büyük ortamlarda rsync performansını artırmak için:

# Daha hızlı checksum algoritması (rsync 3.x ile)
rsync -av --checksum-choice=xxh64 kaynak/ hedef/

# Paralel rsync için GNU parallel kullanımı
ls /data/ | parallel -j4 rsync -av /data/{}/ backup@sunucu:/backup/{}/

# Sıkıştırma gereksizse kapatın (yerel ağ veya zaten sıkıştırılmış dosyalar)
rsync -a --no-compress kaynak/ hedef/

Sonuç

rsync, doğru kullanıldığında hem basit hem de son derece güçlü bir araçtır. Temel prensipleri kavradıktan sonra, --link-dest ile disk alanı verimli snapshot yedeklemeleri, daemon modu ile merkezi yedekleme mimarileri ve script entegrasyonuyla tam otomatik yedekleme sistemleri kurabilirsiniz.

Birkaç pratik önerimi şöyle özetleyeyim: Her yeni rsync komutunu önce -n ile test edin, slash kullanımına dikkat edin, yedekleme scriptlerinize her zaman çıkış kodu kontrolü ve alarm mekanizması ekleyin. Yedekleme aldığınızı değil, doğru yedekleme aldığınızı kanıtlamak için de düzenli restore testleri yapın.

Son olarak, rsync tek başına bir yedekleme stratejisi değildir. Veritabanlarını önce dump alıp sonra rsync’leyin, kritik verileri en az iki farklı konumda saklayın ve 3-2-1 yedekleme kuralını (3 kopya, 2 farklı medya, 1 off-site) aklınızdan çıkarmayın. rsync bu stratejinin en güvenilir transfer katmanlarından biridir, ama stratejinin tamamı değil.

Bir yanıt yazın

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