Veri kaybı söz konusu olduğunda, dosya sistemleri arasındaki fark gerçekten hayat kurtarabilir. ZFS, Oracle’ın Sun Microsystems’dan devraldığı ve daha sonra açık kaynak topluluğunun OpenZFS projesiyle geliştirmeye devam ettiği bu dosya sistemlerinden biridir. Copy-on-write mimarisi, yerleşik RAID desteği, anlık snapshot’lar ve veri bütünlüğü kontrolleri ile ZFS, kurumsal ortamlarda uzun yıllardır tercih edilen bir çözüm. Bugün Linux üzerinde ZFS’i sıfırdan kurup, günlük yönetim işlerini nasıl yapacağımıza pratik bir bakış atacağız.
ZFS Neden Bu Kadar Popüler?
Klasik dosya sistemleriyle (ext4, xfs gibi) çalışmış bir sysadmin olarak şunu söyleyeyim: ZFS’e geçtiğinizde “bunu neden daha önce kullanmadım” diye soruyorsunuz. Temel avantajlar şunlar:
- Copy-on-Write (CoW): Veri yazılırken önce yeni bloğa yazılır, eski blok silinmez. Bu sayede güç kesilmelerinde veri tutarsızlığı yaşanmaz.
- Yerleşik RAIDZ desteği: Donanım RAID kartına gerek kalmadan yazılım tabanlı RAID kurabilirsiniz.
- Anlık snapshot’lar: Diskten neredeyse yer kaplamayan, anlık sistem görüntüleri alabilirsiniz.
- Veri bütünlüğü: Her blok checksumlanır, sessiz veri bozulmaları (silent corruption) tespit edilip düzeltilebilir.
- Sıkıştırma ve tekilleştirme: Yerleşik LZ4/ZSTD sıkıştırma ile disk tasarrufu yapabilirsiniz.
- ARC önbelleği: RAM’i akıllıca kullanarak okuma performansını artırır.
Gerçek dünya senaryosu olarak şunu düşünün: Bir depolama sunucunuz var, 8 TB disk, kritik veriler içeriyor. Bir güncelleme yapacaksınız ama riskli. ZFS snapshot’ı 2 saniyede alırsınız, güncellemeyi yaparsınız, bir şeyler ters giderse 30 saniyede geri dönersiniz. ext4 ile aynı işi yapmak için ya LVM snapshot kurar ya da kopyalar durursunuz.
Kurulum Öncesi Hazırlık
ZFS, Linux çekirdeğine dahil değildir (lisans uyumsuzluğu nedeniyle). Bu yüzden OpenZFS projesinin DKMS modülünü kurmanız gerekir. Ubuntu/Debian için işler oldukça kolayken, RHEL tabanlı sistemlerde biraz daha fazla adım var.
Sistem gereksinimleri:
- En az 1 GB RAM (production için 8 GB+ önerilir, ARC önbelleği için)
- 64-bit işlemci
- Linux kernel 3.10+ (güncel kernel şiddetle tavsiye edilir)
Hangi diskleri kullanacağınızı önceden planlayın. /dev/sdX yerine /dev/disk/by-id/ yolunu kullanmanız önerilir, çünkü sunucu yeniden başladığında disk sıralaması değişebilir.
Mevcut disklerin ID’lerini görmek için:
ls -la /dev/disk/by-id/ | grep -v part
Ubuntu/Debian Üzerine ZFS Kurulumu
Ubuntu 20.04 ve sonrasında ZFS resmi repoda mevcut. Kurulum oldukça basit:
sudo apt update
sudo apt install zfsutils-linux
# Kurulumu doğrula
zfs --version
zpool --version
Ubuntu Desktop kullanıyorsanız root pool için ZFS seçeneği doğrudan kurulum sırasında sunuluyor. Ama biz sunucu yönetimi odaklı konuşuyoruz.
Kernel modülünün yüklendiğini kontrol edin:
lsmod | grep zfs
# Çıktıda zfs, zunicode, zavl, icp, zcommon, znvpair satırlarını görmelisiniz
RHEL/CentOS/Rocky Linux Üzerine ZFS Kurulumu
Red Hat tabanlı sistemlerde ZFS, EPEL ve ZFS repo’su aracılığıyla kurulur:
# EPEL repo kurulumu
sudo dnf install epel-release
# ZFS repo ekle
sudo dnf install https://zfsonlinux.org/epel/zfs-release-2-3$(rpm --eval "%{dist}").noarch.rpm
# Kernel-devel yüklü olduğundan emin ol
sudo dnf install kernel-devel
# ZFS kur
sudo dnf install zfs
# Modülü yükle
sudo modprobe zfs
# Her boot'ta otomatik yüklenmesi için
echo "zfs" | sudo tee /etc/modules-load.d/zfs.conf
DKMS kurulumu seçeneğiniz de var, bu sayede kernel güncellemelerinde modül otomatik derlenir:
sudo dnf config-manager --disable zfs
sudo dnf config-manager --enable zfs-kmod
sudo dnf install zfs
ZPool Kavramı ve Temel Yapılar
ZFS’te her şey zpool ile başlar. Zpool, fiziksel disklerin bir araya gelerek oluşturduğu depolama havuzudur. Zpool üzerine dataset‘ler (veri kümeleri) oluşturulur ve bunlar mount edilir.
Temel pool topolojileri:
- Stripe (RAID-0 benzeri): Birden fazla disk, parite yok, performans yüksek ama disk kaybında veri gider
- Mirror (RAID-1 benzeri): İki ya da daha fazla diskin aynası, n-1 disk kaybına dayanır
- RAIDZ1: RAID-5 benzeri, 1 disk kaybına dayanır, minimum 3 disk
- RAIDZ2: RAID-6 benzeri, 2 disk kaybına dayanır, minimum 4 disk
- RAIDZ3: 3 disk kaybına dayanır, minimum 5 disk
Basit Mirror Pool Oluşturma
Eğitim veya test ortamı için iki diskle mirror pool kuralım:
# Disk ID'lerini kullanarak mirror pool oluştur
sudo zpool create datapool mirror
/dev/disk/by-id/ata-WDC_WD4003FZEX-00Z4SA0_WD-WCC7K2JVTL82
/dev/disk/by-id/ata-WDC_WD4003FZEX-00Z4SA0_WD-WCC7K3DUTL92
# Pool durumunu kontrol et
sudo zpool status datapool
Çıktıda state: ONLINE ve her diskin sağlıklı olduğunu göreceksiniz.
RAIDZ2 Pool Oluşturma
Production ortamı için 6 diskli RAIDZ2 kurulumu (4 veri, 2 parite):
sudo zpool create -o ashift=12 production raidz2
/dev/disk/by-id/disk1
/dev/disk/by-id/disk2
/dev/disk/by-id/disk3
/dev/disk/by-id/disk4
/dev/disk/by-id/disk5
/dev/disk/by-id/disk6
# ashift=12 parametresi modern 4K sektörlü diskler için önemli!
ashift=12 parametresine dikkat edin. Bu değer disk sektör boyutunu belirtir. 512 byte sektör için ashift=9, 4096 byte için ashift=12. Yanlış ayarlanırsa ciddi performans kaybı yaşarsınız ve sonradan değiştiremezsiniz.
Pool listeleme ve genel durum:
# Tüm pool'ları listele
sudo zpool list
# Ayrıntılı durum
sudo zpool status -v
# I/O istatistikleri (iostat benzeri)
sudo zpool iostat -v 2
Dataset Yönetimi
Dataset’ler, ZFS’teki temel birimleri oluşturur. Dosya sistemi olarak kullanılabilirler ve hiyerarşik bir yapıya sahiptirler.
# Temel dataset oluştur
sudo zfs create datapool/backup
sudo zfs create datapool/web
sudo zfs create datapool/databases
# İç içe dataset
sudo zfs create datapool/databases/postgresql
sudo zfs create datapool/databases/mysql
# Dataset listesi
sudo zfs list
# Belirli pool'un tüm dataset'leri
sudo zfs list -r datapool
Dataset’ler varsayılan olarak // konumuna mount edilir. Yani datapool/web otomatik olarak /datapool/web konumuna bağlanır. Bunu değiştirebilirsiniz:
sudo zfs set mountpoint=/var/www datapool/web
sudo zfs mount datapool/web
Dataset Özellikleri
ZFS’in en güçlü yanlarından biri, her dataset için ayrı özellik ayarlayabilmenizdir:
# Sıkıştırmayı etkinleştir (LZ4 önerilir, hızlı ve etkili)
sudo zfs set compression=lz4 datapool/backup
# ZSTD sıkıştırma (daha iyi oran ama daha yavaş)
sudo zfs set compression=zstd datapool/databases
# Erişim zamanı güncellemeyi kapat (performans için)
sudo zfs set atime=off datapool/web
# Kotalar belirle
sudo zfs set quota=500G datapool/web
sudo zfs set reservation=100G datapool/databases
# Dataset özelliklerini görüntüle
sudo zfs get all datapool/web
sudo zfs get compression,atime,quota datapool/web
compression=lz4: Çoğu veri tipi için önerilen. CPU maliyeti düşük, sıkıştırma oranı iyi. atime=off: Her dosya okumada “son erişim zamanı” güncellenmez, bu özellikle yoğun okuma yapılan sistemlerde performansı artırır. quota: Dataset’in kullanabileceği maksimum alan. reservation: Dataset için garantilenmiş minimum alan.
Snapshot Yönetimi
Snapshot’lar ZFS’in en sevilen özelliklerinden biri. Anlık, tutarlı, neredeyse bedava (disk kullanımı açısından) yedekler alabilirsiniz.
# Anlık snapshot al
sudo zfs snapshot datapool/web@before-update-2024
# Tüm alt dataset'leri dahil ederek snapshot (-r recursive)
sudo zfs snapshot -r datapool/databases@daily-backup-20240115
# Snapshot listesi
sudo zfs list -t snapshot
sudo zfs list -t snapshot -r datapool
# Snapshot'ın kapladığı alan
sudo zfs list -t snapshot -o name,used,refer
Snapshot’tan Geri Yükleme
Felaket senaryosu: Bir güncelleme sonrası web uygulaması çöktü, hemen geri dönmeniz gerekiyor:
# Snapshot'tan geri al (dataset'i snapshot anına döndürür)
sudo zfs rollback datapool/web@before-update-2024
# Eğer aralarında başka snapshot'lar varsa -r ile onları da temizler
sudo zfs rollback -r datapool/web@before-update-2024
Snapshot Klonlama
Bazen production verisiyle test yapmak istersiniz. Kopyalamadan, anında:
# Snapshot'tan klon oluştur (yazılabilir kopya)
sudo zfs clone datapool/databases/postgresql@daily-backup-20240115 datapool/databases/postgresql-test
# Test ortamında işiniz bitince klonu sil
sudo zfs destroy datapool/databases/postgresql-test
Otomatik Snapshot ile Cron Görevi
Günlük otomatik snapshot için basit bir yaklaşım:
# /usr/local/bin/zfs-snapshot.sh dosyasını oluştur
cat > /usr/local/bin/zfs-snapshot.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d-%H%M)
POOL="datapool"
KEEP=7
# Snapshot al
zfs snapshot -r ${POOL}@auto-${DATE}
# 7 günden eski otomatik snapshot'ları sil
zfs list -t snapshot -o name | grep "@auto-" | head -n -${KEEP} | xargs -r zfs destroy
EOF
chmod +x /usr/local/bin/zfs-snapshot.sh
# Cron'a ekle (her gece 02:00'de)
echo "0 2 * * * root /usr/local/bin/zfs-snapshot.sh" > /etc/cron.d/zfs-snapshot
ZFS Send/Receive ile Yedekleme ve Replikasyon
ZFS’in send/receive özelliği, veriyi uzak sunucuya yedeklemek için mükemmel bir yöntem sunar. Sadece değişen blokları gönderebilirsiniz:
# İlk tam yedek gönderimi (uzak sunucuya SSH üzerinden)
sudo zfs send datapool/databases/postgresql@daily-backup-20240115 |
ssh backup-server "sudo zfs receive backuppool/postgresql"
# Artımlı gönderim (önceki snapshot'tan bu yana değişenler)
sudo zfs send -i datapool/databases/postgresql@daily-backup-20240114
datapool/databases/postgresql@daily-backup-20240115 |
ssh backup-server "sudo zfs receive backuppool/postgresql"
# Sıkıştırarak gönder (ağ bant genişliğini azaltır)
sudo zfs send datapool/databases/postgresql@daily-backup-20240115 |
gzip | ssh backup-server "gunzip | sudo zfs receive backuppool/postgresql"
Bu yöntemi iki data center arasında replikasyon için de kullanabilirsiniz. DR (Disaster Recovery) senaryoları için ZFS send/receive altın değerinde.
Pool Bakımı ve Scrub
ZFS’in “scrub” özelliği, tüm disklerdeki veriyi kontrol edip checksum hatalarını tespit eder ve mümkünse düzeltir:
# Scrub başlat
sudo zpool scrub datapool
# Scrub durumunu kontrol et
sudo zpool status datapool
# Scrub tamamlandığında sonucu gör
sudo zpool status datapool | grep scan
Aylık düzenli scrub için:
echo "0 3 1 * * root zpool scrub datapool" > /etc/cron.d/zfs-scrub
Disk Arızası Senaryosu ve Değiştirme
Mirror pool’da bir disk arızalandığında:
# Arızalı diski gör
sudo zpool status datapool
# state: DEGRADED gibi bir çıktı alırsınız
# Yeni diski ekle ve eski diski değiştir
sudo zpool replace datapool /dev/disk/by-id/arızalı-disk /dev/disk/by-id/yeni-disk
# Resilver (yeniden inşa) sürecini takip et
sudo zpool status datapool
# Rebuild yüzdesi ve kalan süreyi göreceksiniz
ZFS Cache (L2ARC ve ZIL/SLOG)
Performansı artırmak için iki özel cihaz türü kullanabilirsiniz:
L2ARC (Level 2 ARC): SSD’yi okuma önbelleği olarak kullanır. Yoğun okuma yapılan ortamlarda faydalı.
ZIL/SLOG (ZFS Intent Log): Senkron yazma işlemlerini hızlandırır. Özellikle NFS ve veritabanı ortamlarında kritik.
# L2ARC cache SSD ekle
sudo zpool add datapool cache /dev/disk/by-id/ssd-cache-disk
# ZIL/SLOG için ayrı SSD ekle (tercihen MLC/enterprise SSD)
sudo zpool add datapool log /dev/disk/by-id/ssd-log-disk
# Mirrored SLOG (daha güvenli)
sudo zpool add datapool log mirror
/dev/disk/by-id/ssd-log-disk1
/dev/disk/by-id/ssd-log-disk2
# Cache ve log'ların pool'a eklendiğini doğrula
sudo zpool status datapool
Önemli not: SLOG olarak kullanılan SSD’nin güç kaybında veri koruma (power loss protection) özelliği olmalıdır. Intel DC S3700 veya benzeri enterprise SSD’ler bu iş için uygundur. Normal tüketici SSD’leri SLOG olarak kullanmak risklidir.
Monitoring ve İzleme
Production ortamında ZFS’i izlemek kritik. Birkaç pratik komut:
# Pool genel durumu
sudo zpool list -o name,size,alloc,free,cap,health
# Tüm dataset'lerin kullanım detayı
sudo zfs list -o name,used,avail,refer,mountpoint
# ARC istatistikleri (önbellek hit/miss oranı)
arc_summary
# Veya /proc/spl/kstat/zfs/arcstats dosyasından
cat /proc/spl/kstat/zfs/arcstats | grep -E "hits|misses|size"
# ZFS eventlerini izle
sudo zpool events -v
Zabbix veya Prometheus kullanıyorsanız node_exporter‘ın ZFS modülü mevcut, ekstra bir şey kurmanıza gerek yok:
# node_exporter ZFS metriklerini kontrol et
curl -s localhost:9100/metrics | grep zfs_
Sık Karşılaşılan Sorunlar ve Çözümleri
Sorun: Pool import edilemiyor, sistem yeniden başlatıldıktan sonra pool yok.
# Mevcut pool'ları tara ve import et
sudo zpool import
sudo zpool import datapool
# Farklı konumda arama yap
sudo zpool import -d /dev/disk/by-id datapool
Sorun: zpool: cannot open 'x': no such pool hatası
# ZFS modülünün yüklü olup olmadığını kontrol et
lsmod | grep zfs
sudo modprobe zfs
# systemd servisini kontrol et
sudo systemctl status zfs-import-cache
sudo systemctl enable zfs-import-cache zfs-import-scan zfs-mount zfs-share
Sorun: Dataset mount edilmiyor.
# Mount noktasını kontrol et
sudo zfs get mountpoint datapool/web
# Elle mount et
sudo zfs mount datapool/web
# Tüm ZFS dataset'lerini mount et
sudo zfs mount -a
Sorun: Pool kapasitesi %80’in üzerine çıktı, performans düştü.
ZFS performansı %80 doluluktan sonra ciddi şekilde düşer. CoW mimarisinin çalışabilmesi için boş alan gereklidir. Çözümler:
- Eski snapshot’ları temizleyin
- Dataset’lere quota ekleyerek bir dataset’in tüm pool’u doldurmasını engelleyin
- Disk ekleyin (stripe genişletme veya yeni vdev)
# En çok yer kaplayan snapshot'ları bul
sudo zfs list -t snapshot -o name,used -s used | tail -20
# Eski snapshot'ları toplu sil
sudo zfs list -t snapshot | grep "auto-2023" | awk '{print $1}' | xargs -n1 zfs destroy
ARC Boyutunu Ayarlama
ZFS varsayılan olarak mevcut RAM’in büyük bir kısmını ARC önbelleği için kullanır. Sistemde başka uygulamalar da çalışıyorsa bunu sınırlamak gerekebilir:
# Mevcut ARC boyutunu gör (byte cinsinden)
cat /proc/spl/kstat/zfs/arcstats | grep "^size"
# ARC maksimumunu 4GB ile sınırla
echo "options zfs zfs_arc_max=4294967296" | sudo tee /etc/modprobe.d/zfs.conf
# Değişikliği anında uygula (reboot gerektirmez)
echo 4294967296 | sudo tee /sys/module/zfs/parameters/zfs_arc_max
Sonuç
ZFS, özellikle veri güvenliği ve yönetim kolaylığı açısından Linux üzerinde gerçekten güçlü bir seçenek. Snapshot mekanizması tek başına bile birçok yöneticinin hayatını kurtarmıştır. Ben NAS sistemlerimde, veritabanı sunucularımda ve backup sunucularımda yıllardır ZFS kullanıyorum ve ext4/xfs’e geri dönmeyi hiç düşünmedim.
Öğrenme eğrisi biraz dik olabilir, özellikle pool topolojisi ve vdev yapısı konusunda. Ama şunu unutmayın: ZFS’te yanlış bir pool konfigürasyonunu sonradan değiştirmek çok zordur (mirror’a disk ekleyebilirsiniz ama RAIDZ’yi genişletemezsiniz, yeni vdev eklemeniz gerekir). Bu yüzden başlamadan önce ihtiyaçlarınızı iyi planlayın.
Pratik başlangıç önerim: Bir test VM’inde loopback device’larla birkaç disk simüle edip RAIDZ2 kurun, snapshot alın, rollback yapın, send/receive deneyin. Elleriniz kasa girip çıktıktan sonra production’a taşıyın. ZFS bir kez anlaşıldığında vazgeçilmez oluyor.