Snapshot Nedir: Anlık Görüntü Temelleri ve Kullanım Alanları

Bir gün production sunucunuzda kritik bir güncelleme yapıyorsunuz, her şey yolunda gidiyor, sonra bir anda sistem çöküyor. Veritabanı dosyaları bozuluyor, servisler ayağa kalkmıyor ve siz saatlerce geriye dönüp ne olduğunu anlamaya çalışıyorsunuz. İşte tam bu noktada, önceden alınmış bir snapshot hayat kurtarıcı oluyor. Ya da kurtarmıyor, çünkü snapshot almayı unuttunuz. Bu yazıda snapshot’ın ne olduğunu, nasıl çalıştığını ve neden her sysadmin’in bunu bir refleks haline getirmesi gerektiğini konuşacağız.

Snapshot Nedir, Tam Olarak Ne Yapar?

Snapshot, yani anlık görüntü, bir sistemin ya da diskin belirli bir andaki durumunu kayıt altına alan teknolojidir. Bunu bir fotoğraf gibi düşünebilirsiniz. O anki dosya sistemi durumu, disk blokları, bellek içeriği (bazı durumlarda) ve sistem konfigürasyonu dondurulur. İleride bir sorun çıktığında bu fotoğrafa dönebilirsiniz.

Ama snapshot’ı tam yedeğiyle karıştırmamak gerekiyor. Tam yedek, verinin başka bir yere kopyalanmasıdır. Snapshot ise genellikle aynı depolama alanı üzerinde, değişikliklerin izlendiği bir referans noktasıdır. Bu fark hem avantaj hem de dezavantaj yaratır.

Snapshot’ın çalışma mantığı şu şekildedir: Snapshot alındığı anda mevcut blokların bir haritası çıkarılır. Sonraki değişiklikler orijinal bloklara değil, yeni bir alana yazılır. Bu yönteme Copy-on-Write (COW) denir. Bir blok değiştirilmek istendiğinde, önce eski hali başka bir yere kopyalanır, sonra yeni veri orijinal yere yazılır. Böylece snapshot, her zaman o “an”ın görüntüsünü korur.

Bir diğer yöntem ise Redirect-on-Write (ROW)‘dur. Bu yöntemde yeni veriler doğrudan farklı bir alana yönlendirilir, orijinal bloklar hiç dokunulmaz. Bu yaklaşım yazma performansı açısından biraz daha verimlidir çünkü ekstra kopyalama işlemi yoktur.

Snapshot Türleri

Disk/Volume Snapshot

En yaygın snapshot türüdür. LVM, ZFS, Btrfs gibi dosya sistemi veya volume manager seviyesinde alınır. Fiziksel ya da sanal makinelerde kullanılabilir.

Sanal Makine Snapshot

VMware, Hyper-V, VirtualBox gibi hipervizörler, sanal makinenin tüm durumunu (disk, bellek, CPU durumu) anlık olarak kaydedebilir. Bu, bir VM’yi tam olarak o anki çalışma durumuna geri döndürmek için kullanılır.

Uygulama Snapshot

Veritabanları veya özel uygulamalar kendi snapshot mekanizmalarına sahip olabilir. PostgreSQL’in point-in-time recovery’si, MySQL binary log’ları bu kategoriye girer.

Cloud Snapshot

AWS EBS, Azure Managed Disk, Google Cloud Persistent Disk gibi bulut depolama çözümleri kendi snapshot API’lerini sunar. Bu snapshot’lar genellikle incremental (artımlı) çalışır.

LVM ile Snapshot Almak

Linux’ta en temel snapshot yöntemi LVM (Logical Volume Manager) kullanmaktır. Çoğu Linux dağıtımında hazır gelir ve production ortamlarında yaygın olarak kullanılır.

Önce mevcut volume group durumuna bakalım:

# Mevcut LVM yapısını görüntüle
sudo vgs
sudo lvs
sudo pvs

Bir logical volume’ün snapshot’ını almak için:

# /dev/vg0/lv_data adlı volume'ün snapshot'ını al
# -L: snapshot boyutu (COW alanı için)
# -s: snapshot modunda oluştur
# -n: snapshot adı
sudo lvcreate -L 10G -s -n lv_data_snap /dev/vg0/lv_data

Snapshot’ı mount edip içeriğine erişmek:

# Snapshot'ı geçici bir dizine mount et
sudo mkdir -p /mnt/snapshot_restore
sudo mount -o ro /dev/vg0/lv_data_snap /mnt/snapshot_restore

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

# Belirli bir dosyayı geri yükle
sudo cp /mnt/snapshot_restore/etc/nginx/nginx.conf /etc/nginx/nginx.conf.restored

# İşiniz bittiğinde unmount edin
sudo umount /mnt/snapshot_restore

Snapshot’ı silmek için:

# Snapshot'ı kaldır
sudo lvremove /dev/vg0/lv_data_snap

LVM snapshot’ının doluluk oranını izlemek kritik öneme sahiptir. COW alanı dolduğunda snapshot otomatik olarak geçersiz hale gelir:

# Snapshot doluluk durumunu izle
sudo lvs -a -o +snap_percent

# Snapshot dolu olup olmadığını kontrol et
sudo dmsetup status /dev/vg0/lv_data_snap

ZFS Snapshot Kullanımı

ZFS, snapshot konusunda son derece güçlü ve zarif bir araçtır. Özellikle FreeBSD ve Ubuntu/Debian sistemlerde yaygın kullanılır.

# ZFS pool ve dataset listesini görüntüle
zfs list

# Bir dataset'in snapshot'ını al
# Format: pool/dataset@snapshot_adı
zfs snapshot tank/data@2024-01-15_before_update

# Tüm snapshot'ları listele
zfs list -t snapshot

# Belirli bir dataset'in snapshot'larını listele
zfs list -t snapshot tank/data

# Snapshot'tan geri yükleme (rollback)
# Dikkat: Bu işlem snapshot'tan sonraki tüm değişiklikleri siler
zfs rollback tank/data@2024-01-15_before_update

# Snapshot içeriğine erişmek için (ZFS otomatik .zfs/snapshot dizini oluşturur)
ls /tank/data/.zfs/snapshot/2024-01-15_before_update/

# Belirli bir dosyayı snapshot'tan geri yükle
cp /tank/data/.zfs/snapshot/2024-01-15_before_update/important_file.txt /tank/data/

ZFS’in güzel yanlarından biri recursive snapshot desteğidir:

# Tüm child dataset'lerle birlikte snapshot al
zfs snapshot -r tank/data@weekly_backup

# Snapshot'ı başka bir sisteme gönder (ZFS send/receive)
zfs send tank/data@weekly_backup | ssh backup-server "zfs receive backup/data"

# Incremental snapshot gönderimi
zfs send -i tank/data@previous_snap tank/data@current_snap | 
  ssh backup-server "zfs receive backup/data"

Btrfs Snapshot Kullanımı

Btrfs, modern Linux sistemlerde (özellikle openSUSE, Fedora) giderek yaygınlaşan bir dosya sistemidir ve snapshot desteği yerleşik olarak gelir.

# Btrfs subvolume listesini görüntüle
sudo btrfs subvolume list /

# Snapshot al (read-write)
sudo btrfs subvolume snapshot /home /home_snapshots/home_$(date +%Y%m%d)

# Read-only snapshot (yedekleme için önerilen)
sudo btrfs subvolume snapshot -r /home /home_snapshots/home_ro_$(date +%Y%m%d)

# Snapshot'ları listele
sudo btrfs subvolume list -s /

# Snapshot'tan geri yükleme
# Önce mevcut subvolume'ü yeniden adlandır
sudo mv /home /home_old
# Snapshot'ı restore et
sudo btrfs subvolume snapshot /home_snapshots/home_20240115 /home

# Eski subvolume'ü sil (emin olduktan sonra)
sudo btrfs subvolume delete /home_old

VMware vSphere ile Snapshot Yönetimi

Kurumsal ortamlarda VMware sıklıkla kullanılır. VMware snapshot’ları biraz farklı çalışır ve bazı önemli noktalara dikkat etmek gerekir.

VMware CLI (govc) ile snapshot işlemleri:

# govc kurulumu ve environment ayarları
export GOVC_URL=https://vcenter.example.com
export [email protected]
export GOVC_PASSWORD=your_password
export GOVC_INSECURE=1

# VM snapshot al
govc snapshot.create -vm "production-web-01" "before-php-upgrade"

# Snapshot listesini görüntüle
govc snapshot.tree -vm "production-web-01"

# Snapshot'a geri dön
govc snapshot.revert -vm "production-web-01" "before-php-upgrade"

# Snapshot'ı sil
govc snapshot.remove -vm "production-web-01" "before-php-upgrade"

Önemli uyarı: VMware snapshot’larını uzun süre açık bırakmayın. Delta diskleri büyüdükçe hem performans düşer hem de yönetim zorlaşır. Üretim ortamında snapshot’ların maksimum birkaç gün açık kalması önerilir.

AWS EBS Snapshot ile Bulut Ortamında Çalışmak

Bulut ortamında snapshot yönetimi de benzer mantıkla çalışır ancak API tabanlıdır.

# AWS CLI ile EBS volume snapshot al
aws ec2 create-snapshot 
  --volume-id vol-0123456789abcdef0 
  --description "Production DB before migration" 
  --tag-specifications 'ResourceType=snapshot,Tags=[{Key=Name,Value=prod-db-snapshot},{Key=Environment,Value=production}]'

# Snapshot durumunu kontrol et
aws ec2 describe-snapshots 
  --snapshot-ids snap-0123456789abcdef0 
  --query 'Snapshots[0].{State:State,Progress:Progress}'

# Tüm snapshot'ları listele
aws ec2 describe-snapshots 
  --owner-ids self 
  --query 'Snapshots[*].{ID:SnapshotId,Size:VolumeSize,Date:StartTime,Desc:Description}' 
  --output table

# Snapshot'tan yeni volume oluştur (restore)
aws ec2 create-volume 
  --availability-zone us-east-1a 
  --snapshot-id snap-0123456789abcdef0 
  --volume-type gp3

# Eski snapshot'ları temizle (30 günden eski)
aws ec2 describe-snapshots --owner-ids self 
  --query "Snapshots[?StartTime<='2024-01-01'].SnapshotId" 
  --output text | xargs -I {} aws ec2 delete-snapshot --snapshot-id {}

Gerçek Dünya Senaryosu: Production Sunucusunda Güvenli Güncelleme

Şimdi her şeyi birleştirelim. Gerçek bir senaryo üzerinden gidelim: Production’daki bir web sunucusunda büyük bir PHP sürüm güncellemesi yapacaksınız.

#!/bin/bash
# pre_update_snapshot.sh
# Production güncelleme öncesi snapshot alma scripti

set -euo pipefail

DATE=$(date +%Y%m%d_%H%M%S)
SNAPSHOT_NAME="pre_php_upgrade_${DATE}"
LOG_FILE="/var/log/snapshots/pre_update_${DATE}.log"

mkdir -p /var/log/snapshots

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

log "=== Snapshot alma işlemi başlıyor ==="
log "Snapshot adı: ${SNAPSHOT_NAME}"

# Uygulama servisini durdur (isteğe bağlı, tutarlılık için)
log "Nginx'i durduruyoruz..."
systemctl stop nginx
systemctl stop php8.1-fpm

# LVM snapshot al
log "LVM snapshot alınıyor..."
lvcreate -L 20G -s -n "${SNAPSHOT_NAME}" /dev/vg0/lv_root

# Servisleri yeniden başlat
log "Servisler yeniden başlatılıyor..."
systemctl start php8.1-fpm
systemctl start nginx

# Snapshot durumunu doğrula
SNAP_STATUS=$(lvs --noheadings -o snap_percent /dev/vg0/${SNAPSHOT_NAME} 2>/dev/null | tr -d ' ')
log "Snapshot doluluk oranı: ${SNAP_STATUS}%"

log "=== Snapshot başarıyla alındı ==="
log "Geri dönmek için: sudo lvconvert --merge /dev/vg0/${SNAPSHOT_NAME}"

# Bilgilendirme maili gönder
echo "Production snapshot alındı: ${SNAPSHOT_NAME}" | 
  mail -s "[PROD] Pre-update snapshot hazır" [email protected]

Güncelleme başarısız olursa geri dönmek için:

# Servisleri durdur
systemctl stop nginx php8.1-fpm

# Snapshot'a geri dön (merge)
lvconvert --merge /dev/vg0/pre_php_upgrade_20240115_143022

# Sistemi yeniden başlat (merge tamamlanması için)
reboot

Snapshot Yönetiminde Dikkat Edilmesi Gerekenler

COW Alanı Yönetimi

LVM snapshot’larında en sık yapılan hata, COW alanının çok küçük tutulmasıdır. COW alanı dolduğunda snapshot otomatik olarak geçersiz (invalid) hale gelir ve kurtarma imkansız olur. Kural olarak, beklenen değişiklik miktarının en az iki katı kadar alan ayırın.

# Snapshot doluluk uyarısı için izleme scripti
#!/bin/bash
THRESHOLD=70
while IFS= read -r line; do
  SNAP_NAME=$(echo "$line" | awk '{print $1}')
  SNAP_PERCENT=$(echo "$line" | awk '{print $NF}' | tr -d '%')
  if [ "${SNAP_PERCENT:-0}" -gt "$THRESHOLD" ]; then
    echo "UYARI: $SNAP_NAME snapshot %$SNAP_PERCENT dolu!" | 
      mail -s "[ALERT] Snapshot doluluk uyarısı" [email protected]
  fi
done < <(lvs --noheadings -o lv_name,snap_percent | grep -v "^$")

Snapshot Birikimi

Eski snapshot’ların birikip depolama alanını tüketmesine izin vermeyin. Her snapshot’ın bir yaşam süresi olmalı ve otomatik temizleme mekanizması kurulmalıdır.

Snapshot ile Yedek Aynı Şey Değildir

Bu noktayı yeterince vurgulayamam. Snapshot, disk arızasından sizi korumaz. Disk fiziksel olarak bozulursa snapshot da gider. Snapshot, hızlı geri dönüş için bir güvenlik ağıdır; tam yedek yerini tutamaz. Her zaman snapshot’a ek olarak gerçek bir yedek alın.

Uygulama Tutarlılığı

Veritabanı gibi kritik uygulamalarda, snapshot almadan önce uygulamayı ya durdurun ya da flush/freeze yapın. Aksi takdirde tutarsız (crash-consistent değil, application-consistent olmayan) bir snapshot alırsınız.

# MySQL için snapshot öncesi flush
mysql -u root -p -e "FLUSH TABLES WITH READ LOCK;"
# Snapshot al
lvcreate -L 10G -s -n mysql_snap /dev/vg0/lv_mysql
# Kilidi aç
mysql -u root -p -e "UNLOCK TABLES;"

Snapshot Otomasyonu: Cron ile Periyodik Snapshot

# /etc/cron.d/snapshot-manager dosyası
# Her gün gece 02:00'da snapshot al
0 2 * * * root /usr/local/bin/auto-snapshot.sh >> /var/log/auto-snapshot.log 2>&1

# Haftalık temizlik
0 3 * * 0 root /usr/local/bin/cleanup-snapshots.sh >> /var/log/snapshot-cleanup.log 2>&1
#!/bin/bash
# cleanup-snapshots.sh
# 7 günden eski LVM snapshot'larını temizle

RETENTION_DAYS=7
CUTOFF_DATE=$(date -d "${RETENTION_DAYS} days ago" +%Y%m%d)

lvs --noheadings -o lv_name,lv_attr | while read LV_NAME LV_ATTR; do
  # Snapshot olan volume'leri tespit et (attr'de 's' harfi var)
  if [[ "$LV_ATTR" == *s* ]]; then
    # İsimden tarihi çıkar (format: snap_YYYYMMDD varsayılıyor)
    SNAP_DATE=$(echo "$LV_NAME" | grep -oP 'd{8}' | head -1)
    if [[ -n "$SNAP_DATE" && "$SNAP_DATE" -lt "$CUTOFF_DATE" ]]; then
      echo "Siliniyor: $LV_NAME (Tarih: $SNAP_DATE)"
      lvremove -f "/dev/vg0/$LV_NAME"
    fi
  fi
done

Sonuç

Snapshot teknolojisi, modern sistem yönetiminin vazgeçilmez bir parçasıdır. LVM’den ZFS’e, VMware’den AWS EBS’e kadar her platformun kendi implementasyonu bulunur ama temel mantık hep aynıdır: belirli bir andaki durumu korumak, sorun çıktığında hızla geri dönebilmek.

Pratik olarak benimsemeniz gereken alışkanlıklar şunlardır: Production üzerinde herhangi bir değişiklik yapmadan önce mutlaka snapshot alın, bunu bir prosedür haline getirin. COW alanı boyutlandırmasını dikkatli yapın ve doluluk oranını izleyin. Snapshot’larınızı düzenli olarak test edin çünkü geri dönülemeyen bir snapshot değersizdir. Ve en önemlisi, snapshot’ı yedekle karıştırmayın; ikisi birbirini tamamlar, biri diğerinin yerini tutmaz.

Snapshot almak saniyeler, geri dönmek dakikalar sürer. Almamak ise saatler, bazen günler süren kurtarma operasyonlarına, hatta telafi edilemez veri kayıplarına yol açabilir. Seçim sizin.

Bir yanıt yazın

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