13 Mayıs 2025 Salı

Bir sunucu uzerindeki zfs datasetinin yeni bir pool uzerine tasinmasi, yerel replikasyon

Asagidaki script eski zfs den yeni zfs veri kopyalamasi yapar.

##########################scriptin calistirma sorumlulugu calistirana aittir. #######################################

 #!/bin/bash
# zfs uzerindek verileri hizli tasimak icin zfs replikasyonu yapar
#
# Kullanım: ./zfs_local_replicate.sh source_dataset destination_dataset
# 2025.05.13
# Remzi AKYUZ
# remzi@akyuz.tech


SOURCE_FS="$1"
DEST_FS="$2"
DATE=$(date +"%Y%m%d-%H%M%S")
SNAPSHOT_NAME="${SOURCE_FS}@replica-${DATE}"

# Hatalı kullanım kontrolü
if [[ -z "$SOURCE_FS" || -z "$DEST_FS" ]]; then
  echo "Kullanım: $0 <source_dataset> <destination_dataset>"
  exit 1
fi

# 1. Snapshot oluştur
echo "[+] Snapshot oluşturuluyor: $SNAPSHOT_NAME"
zfs snapshot "$SNAPSHOT_NAME"

# 2. İlk defa mı yoksa incremental mi?
LAST_SNAP=$(zfs list -t snapshot -o name -s creation | grep "^${SOURCE_FS}@replica-" | tail -2 | head -1)

if [[ -n "$LAST_SNAP" && "$LAST_SNAP" != "$SNAPSHOT_NAME" ]]; then
  echo "[+] Incremental send: $LAST_SNAP -> $SNAPSHOT_NAME"
  zfs send -i "$LAST_SNAP" "$SNAPSHOT_NAME" | zfs receive -F "$DEST_FS"
else
  echo "[+] Tam send (ilk kez çalışıyor olabilir)"
  zfs send "$SNAPSHOT_NAME" | zfs receive -F "$DEST_FS"
fi

# 3. Replikasyon tamam
echo "[+] Replikasyon tamamlandı. Hedef: $DEST_FS"

# 4. Eski snapshot'ları sil (yalnızca replica- ile başlayanlar)
echo "[+] Eski snapshot'lar temizleniyor, yalnızca son 3 adet tutulacak..."

SNAPSHOTS=($(zfs list -t snapshot -o name -s creation | grep "^${SOURCE_FS}@replica-" ))

TOTAL=${#SNAPSHOTS[@]}

if (( TOTAL > 3 )); then
  COUNT=$((TOTAL - 3))
  for ((i=0; i<$COUNT; i++)); do
    OLD_SNAP="${SNAPSHOTS[$i]}"
    echo "[-] Siliniyor: $OLD_SNAP"
    zfs destroy "$OLD_SNAP"
  done
else
  echo "[=] Silinecek eski snapshot bulunamadı (toplam: $TOTAL)"
fi


echo "[+] Hedef dataset'teki eski snapshot'lar temizleniyor..."

DEST_SNAPSHOTS=($(zfs list -t snapshot -o name -s creation | grep "^${DEST_FS}@replica-" ))

TOTAL_DEST=${#DEST_SNAPSHOTS[@]}

if (( TOTAL_DEST > 3 )); then
  COUNT_DEST=$((TOTAL_DEST - 3))
  for ((i=0; i<$COUNT_DEST; i++)); do
    OLD_DEST_SNAP="${DEST_SNAPSHOTS[$i]}"
    echo "[-] Siliniyor (hedef): $OLD_DEST_SNAP"
    zfs destroy "$OLD_DEST_SNAP"
  done
else
  echo "[=] Silinecek hedef snapshot bulunamadı (toplam: $TOTAL_DEST)"
fi

##########################scriptin calistirma sorumlulugu calistirana aittir. #######################################

Ozellikle buyuk hacimli dosya sistemlerinin tasinmasi icin uygundur.

tasima islemleri snapshotlar ile yapilmaktadir. snapshot esnasinda acik dosya varsa, acik dosyalar kapatilip, script calistirilir ve tekrar dosya yazma islemlerine devam edilir.
Bellir bir servis kullaniyorsaniz, servisi durdurun, script baslatin, snaphot alindiktan ve kopyalama devam ederken, servisi tekrar baslatabilirsiniz.

Alternatif olarak scriptdeki asagidaki satirlari duzenleyebilirsiniz.


systemctl stop servis_ismi

# 1. Snapshot oluştur
echo "[+] Snapshot oluşturuluyor: $SNAPSHOT_NAME"

zfs snapshot "$SNAPSHOT_NAME"


systemctl start servis_ismi

Bu islem servisini anlik olarak durdurur, snap sonrasi tekrar baslatir.
Servisinizin data butunlugu korunmus olur.

Hiç yorum yok:

Yorum Gönder

ansible ile yerel quay sunucusu üzerinden execution environment kullanımı

 Yerel quay veya registry sunucularımızdaki ee leri ansible ile kullanabiliyoruz. Bunun için kendi yaptığımız ee leri veya hazır ee leri yük...