LVM Snapshot ile Sistem Yedeği Alma

Sistem yöneticiliğinde en kritik an, bir şeylerin bozulduğu andır. O an geldiğinde elinizin altında iyi bir yedek yoksa, gece yarısı soğuk terler dökerek production sunucusunu kurtarmaya çalışırsınız. LVM snapshot mekanizması tam da bu noktada hayat kurtarıcı oluyor. Klasik yedekleme araçlarından farklı olarak, sistemi durdurmanıza gerek kalmadan tutarlı bir anlık görüntü almanızı sağlar. Bu yazıda LVM snapshot’ın nasıl çalıştığını, nasıl kullanacağınızı ve gerçek dünya senaryolarında nasıl işinize yarayacağını pratik örneklerle ele alacağız.

LVM Snapshot Nedir ve Nasıl Çalışır?

LVM (Logical Volume Manager), Linux’ta disk yönetimini soyutlayan güçlü bir katmandır. Snapshot özelliği ise bir logical volume’ün belirli bir andaki durumunu “dondurarak” sanal bir kopya oluşturur.

Buradaki kilit nokta Copy-on-Write (CoW) mekanizmasıdır. Snapshot aldığınızda sistem tüm veriyi kopyalamaz. Bunun yerine orijinal volume üzerinde değişiklik yapılacak olan bloklar, önce snapshot alanına yazılır, sonra orijinal blok güncellenir. Bu sayede snapshot’ı aldığınız anın tam görüntüsü korunur ve bu işlem son derece hızlı gerçekleşir.

Bunu şöyle düşünebilirsiniz: Bir Word belgesini “Farklı Kaydet” ile yedeklemek yerine, sadece değişen kısımları not eden bir fark defteri tutuyorsunuz. Bu yaklaşım hem hızlı hem de başlangıçta çok az ek alan kullanıyor.

Snapshot’ın avantajları:

  • Birkaç saniye içinde alınır, sistem etkilenmez
  • Çalışan servisler durdurulmaz
  • Tutarlı bir disk görüntüsü sağlar
  • Hızlı geri alma (rollback) imkânı sunar
  • Yedekleme penceresi sıfıra yakındır

Dikkat edilmesi gerekenler:

  • Snapshot volume dolduğunda orijinal volume’e erişim bozulabilir
  • Uzun süreli tutmak performansı etkiler
  • CoW mekanizması nedeniyle yoğun yazma işlemlerinde ek I/O yükü oluşur

Ön Hazırlık: Sisteminizi Tanıyın

Snapshot almaya başlamadan önce mevcut LVM yapınızı iyi anlamanız gerekiyor.

# Mevcut fiziksel volume'leri listele
pvs

# Volume group bilgilerini göster
vgs

# Logical volume'leri detaylı listele
lvs -a -o +devices

# Daha ayrıntılı bilgi için
lvdisplay

Bu komutların çıktısına bakarak hangi volume group’ta ne kadar boş alan olduğunu öğrenin. Snapshot için o volume group içinde yeterli boş alan olması şart.

# Volume group'taki boş alanı kontrol et
vgs --units g

# Detaylı VG bilgisi
vgdisplay vg_data | grep -E "Free|Size|PE"

Örnek bir çıktı:

VG Name               vg_data
VG Size               200.00 GiB
Alloc PE / Size       150 / 150.00 GiB
Free  PE / Size       50  / 50.00 GiB

Bu çıktıda 50 GB boş alanımız var, snapshot için kullanabiliriz.

İlk Snapshot: Adım Adım

Diyelim ki /dev/vg_data/lv_web adlı bir logical volume’ünüz var ve bu üzerinde /var/www dizini mount edilmiş. Bir güncelleme yapmadan önce snapshot almak istiyorsunuz.

# Önce mount edilmiş volume'leri kontrol et
df -h
mount | grep lv_web

# Snapshot oluştur (15 GB alan ayır)
lvcreate -L 15G -s -n lv_web_snap01 /dev/vg_data/lv_web

# Sonucu doğrula
lvs -a | grep snap

Buradaki parametreler:

  • -L 15G: Snapshot için ayrılacak alan miktarı
  • -s: Bu bir snapshot oluştur anlamına gelir
  • -n lv_web_snap01: Snapshot’a verilecek isim
  • Son argüman kaynak volume

Snapshot başarıyla oluşturulduğunda şöyle bir çıktı görürsünüz:

LV            VG      Attr       LSize  Pool Origin   Data%
lv_web        vg_data owi-aos--- 50.00g
lv_web_snap01 vg_data swi-a-s--- 15.00g      lv_web   0.01%

swi-a-s attribute’u snapshot olduğunu gösterir. Data% değeri snapshot’ın ne kadar dolduğunu ifade eder. Bu değer %100’e ulaşırsa snapshot geçersiz hale gelir.

Snapshot’ı Mount Edip Veriye Erişmek

Snapshot aldıktan sonra içine bakabilir, belirli dosyaları kurtarabilirsiniz. Bu özellikle “az önce sildiğim dosya neredeydi?” durumlarında son derece kullanışlı.

# Mount noktası oluştur
mkdir -p /mnt/snap_web

# Snapshot'ı mount et (read-only önerilir)
mount -o ro /dev/vg_data/lv_web_snap01 /mnt/snap_web

# İçeriği kontrol et
ls -la /mnt/snap_web/

# İşiniz bitince unmount edin
umount /mnt/snap_web

XFS filesystem kullanıyorsanız biraz farklı davranır:

# XFS snapshot mount (uuid çakışmasını önlemek için nouuid kullan)
mount -o ro,nouuid /dev/vg_data/lv_web_snap01 /mnt/snap_web

Snapshot’tan Geri Dönüş (Rollback)

Bir uygulama güncellemesi berbat gitti, veritabanı migration’ı başarısız oldu ya da bir konfigürasyon değişikliği sistemi çökertmek üzere. Bu durumlarda snapshot’a geri dönmek dakikalar içinde sistemi eski haline getirir.

Önemli: Geri dönüş işlemi (merge) için volume’ün aktif olmaması gerekir. Bu yüzden önce unmount etmeniz gerekiyor.

# Volume'ü unmount et
umount /var/www

# Snapshot merge işlemini başlat
lvconvert --merge /dev/vg_data/lv_web_snap01

# Volume'ü yeniden mount et
mount /dev/vg_data/lv_web /var/www

Root filesystem gibi unmount edilemeyen volume’ler için farklı bir yaklaşım gerekir. Bu durumda --merge komutu bir sonraki boot’ta otomatik uygulanmak üzere ayarlanır:

# Root volume snapshot merge - sonraki boot'ta uygulanır
lvconvert --merge /dev/vg_rootvg/root_snap01

# Sistemi yeniden başlat
reboot

Sistem açılırken merge işlemi tamamlanır ve normal boot devam eder.

Rsync ile Snapshot’tan Yedek Alma

Snapshot’ın asıl gücü burada ortaya çıkıyor. Çalışan sistemi durdurmadan tutarlı bir yedek alabilirsiniz. Klasik yöntemde rsync çalışırken dosyalar değişmeye devam edebilir ve tutarsız bir yedek oluşabilir. Snapshot ile önce anı donduruyorsunuz, sonra rahatça kopyalıyorsunuz.

#!/bin/bash
# snapshot_backup.sh - LVM Snapshot tabanlı yedekleme scripti

set -e

# Değişkenler
VG_NAME="vg_data"
LV_NAME="lv_web"
SNAP_NAME="${LV_NAME}_backup_$(date +%Y%m%d_%H%M%S)"
SNAP_SIZE="20G"
MOUNT_POINT="/mnt/backup_snap"
BACKUP_DEST="/backup/web"
LOG_FILE="/var/log/lvm_backup.log"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

log "Yedekleme başlatılıyor..."

# Snapshot oluştur
lvcreate -L ${SNAP_SIZE} -s -n ${SNAP_NAME} /dev/${VG_NAME}/${LV_NAME}
log "Snapshot oluşturuldu: ${SNAP_NAME}"

# Mount et
mkdir -p ${MOUNT_POINT}
mount -o ro,noatime /dev/${VG_NAME}/${SNAP_NAME} ${MOUNT_POINT}
log "Snapshot mount edildi: ${MOUNT_POINT}"

# Rsync ile yedekle
rsync -avz --delete 
    --exclude="*.tmp" 
    --exclude="cache/*" 
    ${MOUNT_POINT}/ ${BACKUP_DEST}/
log "Rsync tamamlandı"

# Temizlik
umount ${MOUNT_POINT}
lvremove -f /dev/${VG_NAME}/${SNAP_NAME}
log "Snapshot silindi, yedekleme tamamlandı"

Bu scripti crontab’a ekleyebilirsiniz:

# Her gece 02:00'de çalıştır
0 2 * * * /usr/local/bin/snapshot_backup.sh

Snapshot Boyutunu Doğru Hesaplamak

En sık yapılan hata, snapshot için yeterli alan ayırmamak. Snapshot dolduğunda lvs çıktısında INVALID ibaresi görünür ve veriye erişemezsiniz.

# Snapshot doluluk oranını anlık izle
watch -n 5 'lvs -a | grep snap'

# Daha detaylı bilgi
lvdisplay /dev/vg_data/lv_web_snap01 | grep -E "snapshot|allocated"

Snapshot boyutu için pratik kural: Yedekleme penceresi boyunca o volume’de ne kadar değişiklik olacağını tahmin edin. Yoğun veritabanı sunucularında bu çok yüksek olabilir. Genel kural olarak:

  • Düşük yazma yoğunluklu sistemler (web sunucusu statik dosyalar): Volume boyutunun %15-20’si yeterli
  • Orta yoğunluklu sistemler (uygulama sunucusu): Volume boyutunun %30-40’ı
  • Yüksek yazma yoğunluklu sistemler (veritabanı): Volume boyutunun %50-60’ı veya daha fazlası

Snapshot’ı dolmadan önce otomatik genişletmek için lvm.conf dosyasında ayar yapabilirsiniz:

# /etc/lvm/lvm.conf içindeki snapshot_autoextend ayarları
# Bu satırları bulup aktive edin
snapshot_autoextend_threshold = 70
snapshot_autoextend_percent = 20

Bu ayar, snapshot %70 dolduğunda otomatik olarak %20 daha alan ekler.

Veritabanı Tutarlılığı: Gerçek Dünya Senaryosu

Dosya sistemi tutarlılığı ile veritabanı tutarlılığı farklı şeylerdir. MySQL/MariaDB çalışırken snapshot almak, dosya sistemi açısından tutarlı olsa da veritabanı transaction’ları ortada kalabilir.

Bu durumu çözmek için veritabanını kısa süreliğine “flush ve lock” yapabilirsiniz:

#!/bin/bash
# mysql_consistent_snapshot.sh

VG_NAME="vg_data"
LV_NAME="lv_mysql"
SNAP_NAME="lv_mysql_snap_$(date +%Y%m%d)"
SNAP_SIZE="30G"
MYSQL_USER="backup_user"
MYSQL_PASS="guclu_sifre"

# MySQL bağlantısı aç ve kilitle
mysql -u${MYSQL_USER} -p${MYSQL_PASS} -e "FLUSH TABLES WITH READ LOCK; SYSTEM lvcreate -L ${SNAP_SIZE} -s -n ${SNAP_NAME} /dev/${VG_NAME}/${LV_NAME}; UNLOCK TABLES;"

echo "MySQL consistent snapshot alındı: ${SNAP_NAME}"

Bu yaklaşımda FLUSH TABLES WITH READ LOCK tüm tablolara read lock koyar, snapshot alınır ve lock hemen serbest bırakılır. Lock süresi saniyeler içinde kalır.

Percona XtraBackup gibi araçları kullanamadığınız veya hafif bir çözüm aradığınız durumlarda bu yöntem oldukça işe yarar.

Snapshot’ı dd ile Tam Disk Görüntüsüne Dönüştürmek

Bazen rsync yeterli değildir, volume’ün birebir kopyasını almak isteyebilirsiniz. Özellikle bare-metal recovery için bu yaklaşım değerlidir.

# Snapshot'tan sıkıştırılmış disk görüntüsü oluştur
dd if=/dev/vg_data/lv_web_snap01 bs=4M status=progress | 
    gzip -9 > /backup/lv_web_$(date +%Y%m%d).img.gz

# Daha hızlı sıkıştırma için lz4 kullan
dd if=/dev/vg_data/lv_web_snap01 bs=4M status=progress | 
    lz4 -9 > /backup/lv_web_$(date +%Y%m%d).img.lz4

# Boyutu kontrol et
ls -lh /backup/lv_web_*.img.gz

Bu görüntüden geri yükleme yapmak için:

# Sıkıştırılmış görüntüden geri yükle
gunzip -c /backup/lv_web_20240115.img.gz | 
    dd of=/dev/vg_data/lv_web_restored bs=4M status=progress

Thin Provisioning ile Snapshot Yönetimi

Modern LVM kurulumlarında thin provisioning kullanıyorsanız, snapshot mekanizması biraz farklı çalışır ama çok daha esnek sonuçlar verir.

# Thin pool oluştur (eğer henüz yoksa)
lvcreate -L 100G --thinpool tp_data vg_data

# Thin volume oluştur
lvcreate -V 50G --thin -n lv_thin_web vg_data/tp_data

# Thin snapshot al (neredeyse anlık, alan harcamaz başlangıçta)
lvcreate -s --name lv_thin_web_snap vg_data/lv_thin_web

# Tüm thin snapshot'ları listele
lvs -a -o name,origin,data_percent,pool_lv vg_data

Thin snapshot’ların klasik snapshot’tan farkı, başlangıçta sıfır alan kullanması ve sadece gerçekten değişen bloklar için alan tüketmesidir. Bu özellik özellikle çok sayıda snapshot tutmanız gerektiğinde büyük avantaj sağlar.

Snapshot Rotasyonu ve Eski Snapshot’ları Temizlemek

Snapshot’ları sonsuza kadar tutamazsınız, hem alan hem de performans açısından sorun çıkarır. Akıllı bir rotasyon politikası şart.

#!/bin/bash
# snapshot_cleanup.sh - Eski snapshot'ları temizle

VG_NAME="vg_data"
LV_NAME="lv_web"
MAX_SNAPSHOTS=3

# Mevcut snapshot'ları isme göre listele ve sırala
SNAPSHOTS=$(lvs --noheadings -o lv_name ${VG_NAME} | 
    grep "^  ${LV_NAME}_backup_" | 
    sort)

SNAP_COUNT=$(echo "$SNAPSHOTS" | grep -c "backup" || true)

echo "Mevcut snapshot sayısı: ${SNAP_COUNT}"

# Limit aşılmışsa en eskisini sil
if [ "${SNAP_COUNT}" -gt "${MAX_SNAPSHOTS}" ]; then
    DELETE_COUNT=$((SNAP_COUNT - MAX_SNAPSHOTS))
    echo "Silinecek snapshot sayısı: ${DELETE_COUNT}"
    
    echo "$SNAPSHOTS" | head -n ${DELETE_COUNT} | while read snap; do
        snap=$(echo $snap | xargs)  # whitespace temizle
        echo "Siliniyor: ${VG_NAME}/${snap}"
        lvremove -f "/dev/${VG_NAME}/${snap}"
    done
fi

Monitoring: Snapshot Sağlığını İzlemek

Snapshot’ların sessiz sedasiz dolup geçersiz hale gelmesini engellemek için monitoring kurmalısınız.

#!/bin/bash
# check_snapshots.sh - Nagios/Zabbix uyumlu snapshot kontrol scripti

WARN_THRESHOLD=70
CRIT_THRESHOLD=85
EXIT_OK=0
EXIT_WARN=1
EXIT_CRIT=2

while IFS= read -r line; do
    lv_name=$(echo "$line" | awk '{print $1}')
    data_percent=$(echo "$line" | awk '{print $2}' | tr -d '%')
    
    if (( $(echo "$data_percent >= $CRIT_THRESHOLD" | bc -l) )); then
        echo "CRITICAL: Snapshot ${lv_name} %${data_percent} dolu!"
        exit $EXIT_CRIT
    elif (( $(echo "$data_percent >= $WARN_THRESHOLD" | bc -l) )); then
        echo "WARNING: Snapshot ${lv_name} %${data_percent} dolu"
        exit $EXIT_WARN
    fi
done < <(lvs --noheadings -o lv_name,data_percent --select "lv_attr =~ ^s" 2>/dev/null)

echo "OK: Tüm snapshot'lar normal seviyelerde"
exit $EXIT_OK

Bu scripti crontab’a ekleyip çıktısını mail ile göndermek basit ama etkili bir çözüm:

# Her 30 dakikada bir kontrol et
*/30 * * * * /usr/local/bin/check_snapshots.sh || mail -s "UYARI: LVM Snapshot Sorunu" [email protected]

Yaygın Sorunlar ve Çözümleri

Snapshot invalid oldu:

# Invalid snapshot'ı tespit et
lvs -a | grep -i "invalid|Iv"

# Invalid snapshot'ı kaldır
lvremove -f /dev/vg_data/lv_web_snap01

# Sebebini anlamak için sistem loglarına bak
journalctl -u lvm2-monitor --since "1 hour ago"
dmesg | grep -i "lvm|snapshot"

Volume group’ta yeterli alan yok:

# Mevcut boş alanı kontrol et
vgs -o vg_name,vg_free

# Kullanılmayan eski snapshot'ları bul ve temizle
lvs --noheadings -o lv_name,lv_attr vg_data | grep "^.*s"

# Gerekirse mevcut bir snapshot'ı küçült (thin pool dışında pek mümkün değil)
# Bunun yerine eski snapshot'ı sil ve daha küçük yeni bir tane al

Mount sırasında “already mounted” hatası:

# Snapshot aktif ama mount edilmemiş olabilir
dmsetup ls | grep snap

# Önce deactivate et
lvchange -an /dev/vg_data/lv_web_snap01

# Sonra tekrar aktive edip mount et
lvchange -ay /dev/vg_data/lv_web_snap01
mount -o ro /dev/vg_data/lv_web_snap01 /mnt/snap_web

Sonuç

LVM snapshot, sistem yöneticisinin araç kutusundaki en değerli araçlardan biri. Özellikle production ortamında yapılacak riskli işlemler öncesinde alınan hızlı bir snapshot, saatlik hatta günlük downtime’ı birkaç dakikaya indirebilir.

Pratik bir özet olarak şunu söyleyebilirim: Her büyük değişiklik öncesinde (kernel güncellemesi, büyük paket yükseltmeleri, veritabanı migration’ları) mutlaka bir snapshot alın. İşlem başarıyla tamamlandıktan sonra snapshot’ı silin. Eğer bir şeyler ters giderse, dakikalar içinde eski halinize dönersiniz.

Bununla birlikte snapshot’ı gerçek yedeklemenin yerini tutan bir araç olarak değil, tamamlayıcı bir katman olarak kullanın. Uzun süreli veri koruması için snapshot’tan aldığınız tutarlı kopyaları Bacula, Amanda, Restic veya Borgbackup gibi araçlarla offsite konuma gönderin. Snapshot size hız ve esneklik kazandırır, ama disk arızasına karşı korumaz.

Son olarak şunu vurgulayayım: En iyi yedekleme, geri yüklemeyi test ettiğiniz yedeklemedir. Ayda bir snapshot’tan geri yükleme pratiği yapın. Gerçek bir felaket anında doğru adımları ezberden biliyor olmak paha biçilemez.

Bir yanıt yazın

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