Artık ZFS kurulumunu yapıp kurcalamaya hazırlanalım. Bu makalede temel düzey bir sisteme ZFS kurulumu yapıp, depolama havuzlarını oluşturdukça temel kavramlardan bahsedeceğim. Kurulum dışında ZFS havuzu, VDEV, aynalama (mirroring), RAIDZ gibi kavramları göreceksiniz. Sadece bu makaleyle bile ZFS kullanımına bodoslama dalabilirsiniz.
Dizinin diğer yazıları
- ZFS yazı dizisi vol. 1: Veri depolamaya ZFS yaklaşımı
- ZFS yazı dizisi vol. 2: ZFS kurulumu ve oynamaya hazırlık (Buradasınız)
Sistem ve ZFS kurulumu
Bu deneyleri KVM altında oluşturacağım bir sanal makinada yapıyorum. Günlük kullandığım Debian Linux Stretch’te (9.x) çalışacağım. Debian ve Ubuntu için büyük oranda tutar, diğer dağıtımlar için soran olursa rehber buluruz. 🙂 Linux için ZFSOnLinux kullanıyoruz. Tüm ZFS özellikleri henüz yok, ama bizim kullanacağımız kadarı var ve yeterli.
Sanal makinaya 4GB büyüklüğünde diskler ekleyeceğim -çünkü bu test sisteminde 1TB depolama alanım var. Gerçek hayattaki fiziksel sunucularda bunu 4TB olarak düşünebilirsiniz. Yani test sisteminde toplam 16GB alanım var; gerçek bir sunucuda 4TB büyüklüğünde disklerle alacağınız alan 16TB olacak. Elbette 16GB alanın ne kadarını kullandığım konfigürasyona göre değişecek, hepsini de kendi bölümlerinde bulacaksınız.
Başlamak için Debian net install kurulum dosyasını indirin. Sanal makinaya kuruyorsanız böylece kullanabilirsiniz, aksi halde bunu bir USB diske yazdıracaksınız. Windowsçular için Rufus gibi bir araç önerebilirim. Linux tayfası zaten ihtiyacı olan dd komutunu sistemlerinde bulacaklar.
dd if=/home/emirhan/Downloads/debian-9.5.0-amd64-netinst.iso of=/dev/sdX bs=4096
DİKKAT: Bu komuttaki /dev/sdX USB flash belleği temsil ediyor. Bunun yerine flash belleğinizin düğüm noktası neyse onu yazacaksınız; sdd, sdc gibi. Bu komuta verdiğiniz aygıt silinip yerine debian kurulum dosyaları yazılır, dikkatli olun.
Net-install ile grafik arayüz de kurdurabilirsiniz ama gerek yok. Hem hızlıca test edebilmek hem de kafa karışıklığından uzak kalmak için bunu önerdim. Ayrıca ciddi bir sistem kuracaksanız yine bu küçük, basit kurulumla başlayıp sadece ihtiyacınız olanları kurduğunuz bir makinaya ilerleyebilirsiniz. Benim seçimim aşağıdaki şekilde:
Test amaçları için önünüze gelen yönergeleri takip edip sistem kurulumunu yapın. Sıra ZFS’inizi kurmaya geldi. Debian Stretch için gerekli kurulum paketleri contrib deposunda. Bu depo standart kurulumda açık gelmez. Etkinleştirmek için /etc/apt/sources.list dosyasını açın. Nano adlı metin düzenleyici standart gelmiş olmalı, şu komutla açabilirsiniz:
nano /etc/apt/sources.list
Karşınıza gelen şu halden:
Buna getirin:
Ctrl+X ile Nano metin düzenleyiciden çıkış komutu verebilirsiniz, çıkmadan önce kaydetmenizi ister. Sonra da apt-get update komutuyla paket depo bilgisini güncelleyin. Net-install’da pek gerekmez ama hazır Apt depolarını güncellemişken sistemi güncellemek de güzel alışkanlık.
Şimdi kolları tekrar bir sıvayın ve sırasıyla aşağıdaki üç komutu girip işletin:
apt-get install linux-headers-$(uname -r)
apt-get install zfs-dkms zfsutils-linux zfs-initramfs
modprobe zfs
Bu komutlarla aşağıdakileri kuruyorsunuz. Bu yazdıklarınız dışında başka paketlerin de kurulduğunu farkedeceksiniz; Debian paket yönetim sistemi kurulum için söylediğimiz paketlerin bağımlılıklarını da belirleyip kendiliğinden kuruluma ekler. Ayrıca bir “lisans uyumsuzluğu” bilgilendirmesi alacaksınız. Bu bir sistem uyumsuzluğu değil, onaylayıp geçebilirsiniz. Endişeye mahal yok.
- linux-headers-$(uname -r): $(uname -r) kısmı o anda çalışmakta olan çekirdeği (kernel’i) veriyor. Debian’da paket isminin biçemi (formatı) da öyle. Bu paketi C programlayanlar tanıdık bulabilir; ZFS modülünü kaynak kodundan derleyeceği (compile edeceği) için çekirdeğe ait başlık (header) dosyalarının sistemde bulunması gerek.
- zfs-dkms: Esas işi yapacak şey; çekirdeğe eklenen ZFS modülü. Bu kaynak kodundan derleneceği için biraz zaman alacak.
- zfsutils-linux: Biz ZFS’i nasıl yöneteceğiz? Bu paketteki yazılımla!
- zfs-initramfs: Yazı dizisinde bununla pek işimiz yok ama ileride sistem açılışını ZFS’teki bir bölümden yapmak isterseniz diye koydum.
Son komut ise ZFS modülünü sisteme yükleyip etkinleştiriyor. Şimdi ZFS’le taklalar atmaya hazırsınız. Cidden. 🙂
ZFS yapı taşları: Havuzlar ve VDEV’ler
ZFS ile depolama yönetimi tepe seviyede havuzlarla yapılır. ZFS size depolama “havuzları” sunar. Bu havuzların kaç diskten oluştuğu, bu disklerin hangi konfigürasyonla yapıldığı gibi mevzularla günlük hayatınızda ilgilenmezsiniz. ZFS bu işleri arkaplanda sessizce halleder. Sisteminizde istediğiniz kadar havuz oluşturabilirsiniz. Bu yazı dizisinde tek bir havuz kullanacağız. Adı da (benim ZFS öğrenirken gördüğüm her yerde verildiği gibi) tank olacak. Paletli olan tank değil, akvaryum gibi olan tank bu. 🙂 Siz istediğiniz gibi isimlendirebilirsiniz.
İpucu: İleride ZFS havuzlarının dışarı aktarılması ve içeri aktarılmasından bahsedeceğim, orada göreceğiniz üzere ZFS havuzunu bir sistemden diğerine aktarmak mümkün. Bu yüzden tüm sistemlerinizde havuz isimlerini aynı yapmayın. Mümkünse sistem adını da içeren farklı farklı havuz isimleriniz olsun. Benim bu yazılar için kurduğum sistemin adı zfstester, havuzun adını da (sistemde birden fazla havuz oluşturma ihtimali için) zfstestertank0 diyebilirim mesela.
Bu havuzların yapıtaşları VDEV’lerdir. Sanal Aygıt (Virtual Device) için kullanılan bu terim ZFS havuzunda birleştirilecek diskleri veya disk gruplarını tarif eder. Burada fena halde esnek takılabilirsiniz. 4 disk için (birisi dışında tavsiye edilmeyen) örnek senaryolar:
- 4 diskin herbiri ayrı birer VDEV: ZFS havuzunun toplam alanı dört diskin toplamı kadar olur. Kontrol ettiğinizde 4 ayrı VDEV görürsünüz.
- İkişerli “aynalanmış” gruplar: Her iki disk birbirinin kopyası olacak şekilde (aynalanmış halde), iki VDEV olarak görülür. Her bir VDEV ikişer diskten oluşur. Havuz sığası (kapasitesi) 2 disk kadardır.
- İki disk birbirinin aynası, öbür ikisi ayrı VDEV’ler: İlk iki disk bir “grup” olarak düşünülür ve tek bir VDEV olarka görülür. Diğer iki tanesi ayrı ayrı iki VDEV olur. Toplam 3 VDEV’iniz olur, toplam havuz sığası da 3 disk kadardır.
Görsel olarak, aşağıdaki çizimde ilk örneği görüyorsunuz.
İkinci örnek de şu:
ZFS yazacağı veriyi tüm VDEV’ler arasında “şeritler”, yani RAID terminolojisini bilenlerin tanıdık olduğu Striping yöntemini (daha akıllı şekilde) uygular. Eğer VDEV’lerden biri diğerinden büyükse bu da ZFS için bir sorun değildir, verinin bir kısmı şeritlenmiş, geri kalanı şeritlenmemiş olarak VDEV’lerde tutulabilir.
Bu arada, bir ZFS havuzundaki disklerin illa ki fiziksel sabit disk olması gerekmiyor. Linux’ta blok depolama aygıtı olarak kullanılan her şey olabilir; mekanik disk, SSD, SAN’den bir blok aygıtı, USB, hatta bir dosya.
İlk havuzumuzu yaratıyoruz
Sistemi kurduğumuzda depolama durumumuz şöyle:
Sadece sistem kurulumu yaptığımız disk var. Adı da vda; /dev/vda. Buna dört tane 4’er GB’lık disk takalım:
Yeni disklerimiz vdb, vdc, vdd ve vde olarak geldi. Fiziksel makina da olsaydı bunlar hot-plug olacaktı -yani sunucuyu kapatmadan sisteme takılacaklardı.
Şimdi tank adını vereceğimiz bir havuz oluşturuyoruz. Bu havuzu herbiri birer diskten oluşan 4 VDEV olarak yaratalım. ZFS’te havuzla ilgili işleri zpool komutu, dataset/dosya sistemi ile ilgili işleri de zfs komutuyla yapıyoruz. Şimdi işimiz havuzla olduğuna göre komutumuz zpool.
zpool create -f tank /dev/vdb /dev/vdc /dev/vdd /dev/vde
Havuzumuzla ilgili bilgi almak için ise zpool status komutunu kullanıyoruz.
Ta-daaa: tank adlı ilk havuzumuzu oluşturduk. ZFS komutlarının çok basit olduğunu söylemiş miydim? -f parametresini “diskler boş hayatım, tablo falan yok hata verme” demek için kullandık. Sonra depolama havuzumuza istediğimiz ismi verdik. Arkasından da havuzda yer alacak diskleri tek tek yazdık.
Peki nerede bu tank?
Kök dosya sistemine /tank olarak bağlanmış vaziyette, emir ve görüşlerinize hazır. ZFS’le yarattığınız havuzlar bu şekilde kök dosya sistemine bağlanırlar. Artık bunun içinde istediğiniz gibi klasör oluşturun, alt dosya sistemleri yaratın. Yapacağız sabredin.
Şimdi bu havuzun boyutunun, 4 diskin toplam boyutuna eşit olduğuna dikkat edin; 16GB. Bu tip bir yapılandırmanın sorunu ZFS’in veri koruma özelliklerinin çok azını kullanıyor olmanız. Bu disklerden herhangi birinde hata olursa tüm havuz ölür.
O zaman ikinci tür yapılandırmaya geçelim. Diskler ikişerli olarak birbirinin kopyası olsun. Sonraki ekran görüntüsünde arka arkaya şu komutları çalıştırıyorum:
zpool destroy tank (az önceki havuzu yokedelim)
zpool create -f tank mirror /dev/vdb /dev/vdc mirror /dev/vdd /dev/vde (ikili gruplar halinde yenisini yaratalım)
zpool status (havuz durumuna bakalım)
zfs list (Toplam sığa ne oldu? )
zpool status komutunun çıktısına bakın önce. İki tane VDEV oluşturdu: mirror-0 ve mirror-1. Bu VDEV’ler ikişer diskten oluşan birer grup. Altlarında da mirror-0 için vdb ve vdc, mirror-1 için de vdd ve vde var.
Bu disk gruplarında vdb ve vdc birbirinin kopyası. Aynı şekilde vdd ve vde de birbirlerinin kopyası. Böyle bir yapılandırmada ZFS o ünlü güvenliğini üst düzeyde sağlayabiliyor. Bunlardan herhangi biri bozulursa, yerine takacağınız diske sağlam kopyadan veri aktarılıyor. Diskin toptan bozulması dışında, disk bozulmadığı halde bir bit veri hatası bile olsa, ZFS bunu yakalayıp sağlam kopyadan bunu düzeltebiliyor. Hatta veri hatası senaryosunda, farklı bloklarda olmak kaydıyla hem vdb’de, hem de vdc’de hata da olabilir. ZFS hangi veri bloğunun hatalı olduğunu bildiği için, vdb’deki hatalı olanı vdc’den, vdc’deki hatalı olanı da vdb’den kopyalayarak düzeltiyor.
Bu topolojide her şey iyi güzel de, toplam disk alanı ilkinin yarısı oldu? Burada RAID alemlerinde RAID5’e sapılırdı. ZFS’te de RAIDZ topolojisine bakıyoruz. bir önceki gibi havuzu yokedip, bu sefer RAIDZ konfigürasyonunda deneyelim.
Burada da anahtar kelime raidz1. Önceki iki konfigürasyonun aksine, bir tane VDEV oluştu ve bu da RAIDZ1 olarak geldi. Bu topoloji RAID-5 gibi “parite-tabanlı” bir yapılandırma. Bu konunun derinliklerine girmeyeceğim şimdilik. Depolama alanına dikkat edin; 12GB.
RAIDZ için RAIDZ1 dışında RAIDZ2 ve RAIDZ3 diye iki ayrı seviye daha var. Bunlar basitçe 2 diskin bozulmasına ve 3 diskin bozulmasına dayanıklı yapılandırmalar.
Şimdi bu üç yapılandırmanın veri güvenliği ve sığa açısından karşılaştırmasını yapalım:
- Her bir diskin bir VDEV olduğu yapılandırmada en yüksek disk alanına ulaşıyoruz. Ancak burada veri bozulmasına karşı düzeltme şansımız yok.
- İkişerli aynalama gruplarında (tek diskin kapasitesi)*(disk sayısı)/2 kadar depolama alanı elde ediyoruz. Bu yapılandırma tek diskin arıza yaptığı durumlarda veri kaybı yaşamıyor. Aslında, bir tanesi henüz yenilenmeden, diğer VDEV’deki bir diskin bozulmasında da veri kaybı yaşamıyor.
- RAIDZ1 yapılandırması ise, disk sayısına n dersek, (tek disk sığası) * (n-1) kadar depolama alanı sağlıyor ve yine bir tane diskin bozulması durumunda veri kaybına karşı güvenlik sağlıyor.
Peki hangisini tercih etmek gerek? Tamamen beklediğiniz disk alanı yoğunluğu, hata direnci ve disk sayısına bağlı. 4 yerine 8 diskimiz olsaydı:
- Ayrı disklerden VDEV yapma durumunda 32GB disk alanı yakalayacaktık
- Aynalamalı yaptığımızda 16GB disk alanımız olacaktı
- RAIDZ1 ile 28GB mümkün
- RAIDZ2 ile 24GB
- RAIDZ3 ile 20GB
Açıkçası ben parite tabanlı yapılandırmaları artık pek sevmiyorum. Disk bozulmasına karşı güvenlik sağlayan yapılandırmalar da kullansanız, bir diski bozulunca değiştirilip hazır hale gelene kadar yağmurda ıslanmış bir yavru kedi ürkekliğinde bekliyorsunuz. Ya o disk hazır olana kadar bir tanesi daha patlarsa? Ben bunları aynı seriden mi almışım? 10 yıl önce belki disklerim birer TB büyüklüğündeydi, yani bir disk patlayınca olsa olsa 1TB kopyalama yapacaktım ama şimdi bir disk patlayınca 4TB’a kadar kopyalamam gerekebilir. Üstelik disk hızları da 10 yıl öncesinin dört katına da ulaşmadı.
Dolayısıyla ben aynı sığaya ulaşmak için daha fazla disk kullanmak pahasına aynalanmış konfigürasyonu tercih ediyorum. Bunu engelleyen bir durum yoksa size de aynısını tavsiye ederim. Zaten orada sizi kısıtlayan şey sunucu anakartındaki disk bağlantı sayısı olacaktır; yoksa ZFS ile veri kaybı endişesi olmadığı için gayet de teknoloji dükkanından indirimde 10’arlı alınmış disklerle bol bol alan yaratabilirsiniz.
ZFS havuz topolojileri için komutlar
Temel VDEV yapılandırması için zpool komutuna anahtar kelimeleri takip eden disk (aygıt) isimleri veriyorsunuz. Genelleştirmek için disk isimlerini sdb, sdc, sdd, sde diye verdim. Sanal *olmayan* bir sistemde muhtemelen bu isimlerle karşılaşacaksınız.
- Her disk birer VDEV olacak şekilde: zpool create -f tank /dev/sdb /dev/sdc /dev/sdd /dev/sde
- Bu diskler ikişerli aynalanmış olacak şekilde: zpool create -f tank mirror /dev/sdb /dev/sdc mirror /dev/sdd /dev/sde
- RAIDZ1’li tek VDEV: zpool create -f tank raidz1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
- RAIDZ2’li tek VDEV: zpool create -f tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
- Gereksiz ama ikisi aynalanmış, öbürleri kendi VDEV’leri olsun: zpool create -f /dev/sdb /dev/sdc mirror /dev/sdd /dev/sde
İpucu: Disk isimlendirmelerinde tekil ID (disk kimliği) kullanımı
Biz örneklerde vdb, vdc diye verdik. Siz gerçek bilgisayarda sda, sdb, sdc gibi isimler göreceksiniz. Önemli değil. Önemli olan, bu aygıt isimlerinin değişebilir olması. Sistem BIOS’tan ne gelirse ona göre isimlendiriyor. Tutup bu sisteme iki disk daha ekler, hatta eklerken SATA yuvalarını karıştırırsanız bizim vdb ile vdc güme gidebilir.
Bunun önüne geçmek için disklerin tekil adlarıyla hitap edebiliriz.
Tuhaf isimlerin sebebi sanal makinaya gösterdiğim disklerin seri numaralarını kafama göre girmiş olmam. 🙂 Gerçek bir makinada şuna benzer gözükecekti:
Bu isimlendirme değişmez işte. ZFS havuzunuzu doğrudan bu isimlerle yapılandırabilirsiniz. Ama yazması zor gelecektir; o yüzden havuzunuzu yarattıktan hemen sonra aşağıdaki iki komutu çalıştırıyorsunuz (havuzun adı tank olsun):
zpool export tank
zpool import -d /dev/disk/by-id tank
Böylece önce havuzunuzu dışarı aktarıyor, sonra da bu sefer verdiğim disk ID’lerini kullanarak geri içeri aktarıyorsunuz.
Bir sonraki yazıda disklere kasıtlı olarak zarar verip ZFS’in nasıl kurtardığına değineceğim. Yazıları buraya kadar takip ettiyseniz /tank altında ZFS dosya sisteminize dosya ekleyip kullanmaya başlayabilirsiniz.Ama ilerleyen makalelerde havuzları silip yaratma durumumuz var, o yüzden pratik yapacağınız sistemde henüz yapmayın.