• Okuduklarımdan, seyrettiklerimden aldığım notlar, izlenimler, incelemeler…

ZFS Dosya Sistemi

2016 Ocak ayında bloguma düştüğüm notların ortak teması NAS oldu. Kendin-Yap NAS Projesi yazımda, hareket noktalarımdan birini “yeni nesil bir dosya sistemine geçmek” olarak belirtmiştim. “Yeni nesil” ile anlatmak istediğim, geleneksel dosya sistemlerinde olası, fark edilemeyen veri bozulmalarından kendini koruyabilen bir dosya sistemi. Seçmiş olduğum FreeNAS çözümünün temelindeki dosya sistemi olan ZFS bu isteği karşılıyor. Bu yazıda ZFZ dosya sisteminden bahsediyorum. Elimdeki büyük oranda dolu diskleri değerlendirmek ve henüz yeni disk yatırımı yapmak istemediğimden ZFS’i tüm özellikleri ile kullanmıyorum. Bu zaman içinde olacak. Ancak, sistemi kullanarak alıştıkça ve özelliklerini araştırdıkça, keşfettikçe beğenim artıyor.

ZFS, geleneksel UNIX dosya sistemlerinde olmayan bazı özelliklere sahip. İlk başta Sun Microsystems tarafından, açık kaynak dosya sistemi hedeflenerek oluşturulmuş. Sonradan Sun’ın Oracle tarafından satın alınmasıyla, ZFS açık kaynak projesinin devamı olarak OpenZFS insiyatifi oluşturulmuş. FreeNAS, OpenZFS’e dayalı. ZFS özelliklerini aşağıda özetledim.

ZFS işlem bazında Yazma-Sırasında-Kopya-Alan (Copy-On-Write – CoW) işlevine sahip. Yazma işlevinin en ufak unsuru olarak bloklar kullanılır. Yazma işlevi sırasında, yazılacak blok’un bir kopyası tutulur. Bütün değişiklikler blok kopyası üzerinde uygulanır. Yazma işlemi tamamlanınca, bütün ibreler (pointer) yeni kopyayı işaret eder. ZFS, çoklu yazma ve okuma işlemlerini bütünleşik bir işlem olarak ele alır. Yani, toplu olarak okunan-yazılan veri bütünlüğü denetlenir. Bu bütünleşik işlem ya başarılıdır ya da değildir. Bu bakımdan işlemleri sadece blok bazında ele alan diğer dosya sistemlerinde olası  yazma hatalarına (write-hole) karşı dayanıklıdır. Dolayısı ile dosya sistemini kontrol eden ilave bir uygulamaya ihtiyaç duymaz. 128 bitlik bir dosya sistemi olduğu için dosya sistemi en fazla 16 exabyte’a erişebilir.

ZFS kendi kendini iyileştirebilen bir dosya sistemi olarak tasalanmıştır. ZFS bir veri yazdığında, yazılan her veri bloğu için bir “sağlama toplamı” (checksum) üretilir. Veri okunurken bu sağlama toplamı kontrol edilir. Eğer, bu kontrol sonucunda, aynalanmış (mirrored) veya RAIDZ veri havuzunda, bir hata bulunursa yanlış veri doğrusuyla değiştirilir. Veri havuzundaki tüm veriler uzun zaman boyunca kullanılmayabilir. O veriye ne olduğunu bilemezsiniz. Ancak, “Scrub” adı verilen periyodik görevler tanımlanarak (kullanılmasa da) tüm veri blokları okunur, sağlama toplamları kontrol edilir, varsa hatalı bloklar düzeltilir. ZFS, bir diskli bir sistemde bile veri bozulmasını farkedebilir. FreeNAS yazılımında aylık “scrub” görevleri otomatik olarak tanımlanır. Bu işlemin sonuçları incelenerek disk arızaları gerçekleşmeden önce fark edilebilir.

Geleneksel UNIX dosya sistemlerinde olduğu gibi, dosya sistemini yaratırken “partition” boyutu belirlenmesi gerekmiyor. Bunun yerine ZFS saklama havuzuna gerektikçe diskler (“vdev” adı veriliyor) ilave ediyorsunuz ve bu havuzdan gerektiğince dosya sistemleri tanımlıyorsunuz. Kapasite artışı gerektiğinde benzer “vdev” (virtual device = sanal cihaz) “strip” olarak havuza katılabilir. FreeNAS yazılımında bu işlem için “Volume Manager” kullanılmaktadır. Veri havuzu yaratıldıktan sonra dinamik olarak boyutlandırılabilien “dataset”ler veya sabit hacimli “zvol”lar yaratılabilir. “Dataset”ler üzerlerinde saklanacak veri türü, izinler, kota ve sıkıştırma seviyeleri bakımından özelleştirilebilir.

ZFS gerçek zamanda veri sıkıştırması destekler. Sıkıştırma işlemi bir veri bloğu diske yazılırken gerçekleştirilir – tabi sözkonusu veri sıkıştırmaya uygun ise. Sıkıştırılmış bir veri bloğuna erişildiğinde veri otomatik olarak genişletilir (decompress). Sıkıştırma, dosya seviyesi yerine blok seviyesinde yapıldığı için onu kullanan uygulamalara şeffaftır. FreeNAS ile yaratılan veri havuzları “default” olarak LZ4 sıkıştırma algoritmasını kullanır.

ZFS düşük maliyetli, anlık fotoğraflar (snapshot) sağlar. Belirlenen veri havuzu, dataset, veya zvol için anlık fotoğraflar çekilebilir. Yazarken Kopyala (CoW – Copy on Write) özelliği nedeniyle, ilk fotoğrafın boyutu “0” byte’dır. Ancak, dosya üzerinde değişiklikler yapıldıkça fotoğrafın boyutu artmaya başlar. Çünkü değişiklikler kayıt edilmektedir. Anlık fotoğraflar bize, çekildikleri andaki veri durumunu sağlar. Dosya silindiği zaman, diskteki ilgili bloklar, serbest alan (üzerine veri yazılabilir alan) listesine yazılır. Ancak, anlık fotoğrafta yer alan bloklar, o fotoğraf silinene kadar serbest veri alanı listesine yazılmaz. Bu nedenledir ki, silinmiş bir dosyaya, anlık fotoğraf (snapshot) sayesinde erişmek mümkündür. Konuya kurumsal bilişim teknoloji yöneticisi gibi bakalım: Örneğin, verinin 15 dakikada bir “anlık fotoğrafının” çekildiğini, bunların uzaktaki bir sistemde bir ay boyunca saklandığını düşünün. Bu bir ay içinde ana veri lokasyonunda katastrofik bir kayıp da olsa, uzaktaki anlık fotolar sayesinde veriye en fazla 15 dakikalık bir kayıp ile erişilebilir. Anlayacağınız üzere “anlık fotolar” yerel olarak oluşturulabilir, ancak, uzak bir ZFS sisteminde bir kopyası tutulabilir. Kopyayı alan, uzaktaki ZFS sistemi, yerel sistemin bire bir kopyası olmak orunda değildir. Farklı RAIDZ seviyesine, depolama hacmine, sıkıştırma ayarına, vs… sahip olabilir.

ZFS boot ortamı sorunlu bir sistem yükseltme durumunda veri kurtarmayı olanaklı kılar. FreeNAS’ın 9.3 sürümünden itibaren, işletim sisteminin misafir eden “dataset”in anlık fotoğrafı, sistem güncelleme veya yükseltmeden önce otomatik olarak alınır. Bu anlık fotoğraf ortamı GRUB boot yükleyicisine ilave edilir. Sistem yükseltme girişimi başarısız olursa sistemin yükseltme girişiminden önceki haline geri dönmek mümkün olur.

ZFS yazma ön belleği (write cache) sağlar. Bu ön bellek, RAM ve ZIL adı verilen ortamda yer alır. RAM, elektrik olduğu sürece veri saklayabilir (volatile). ZIL ise veriyi elektrik olmadığında bile saklayabilir (nonvolatile).  ZIL (ZFS Intent Log), senkron yazma işlemleri olan durumlarda – ZFS veri havuzuna asenkron olarak yazılana kadar –  geçici bir depolama alanıdır. Örnek ile anlatayım. Yazma işlemi esnasında elektrik kesilmesine sonucu veri kaybını engellemek için yazılan verinin geçici bir kopyasını tutarsınız. Yazma işlemi başarı ile sonuçlanınca bu geçici kopyayı silersiniz.  Sistem, veri bütünlüğü önem taşıyan çok sayıda senkron yazma işlemi gerçekleştirecek ise (örneğin bir veri tabanından), performans bir “log aracı” ile arttırılabilir. Bu log aracının, CIFS, AFP, veya  iSCSI gibi çok seyrek senkron yazma kullanan sistemlerde pek etkisi olmaz. Shell ortamında kullanılabilecek “zilsat” özelliği, sistemin bir log aracından fayda sağlayıp sağlayamayacağını belirlemek için yardımcı olur. NFS yazmalarını hızlandırmak için bir log aracı kullanılacak ise, hızlı ve süperkondansatör grubuna sahip bir SSD tavsiye ediliyor.

ZFS okuma ön belleği sağlar.  Bu önbellek RAM’dedir ve okuma gecikmelerini azaltmak içindir.

ZFS veri yedekleme ve donanımsal RAID sistemlerinin kısıtlamalarını adreslemek için tasarlanmıştır. Örneğin “write hole” adı verilen durum var; bir veriyi yedeklediniz; herhangi bir sebeple yedeklenen verideki bir bit zaman içinde değişikliğe uğradı ve yedeği geri yüklerken bu hatalı biti yüklediniz. Donanımsal RAID denetleyicileri böyle durumları fark edemiyor. ZFS ise böyle bir duruma olanak vermez. ZFS üç seviyeli bir veri koruma sağlar:

  • RAIDZ1 disk alanını maksimize eder ve özellikle veri büyük miktarlar halinde (128K veya fazla) yazıldığında veya okunduğunda performans sağlar.
  • RAIDZ2 ise daha iyi veri koruma sağlar (RAIDZ1’e göre, veri kayıpları arasındaki zaman – yani “MTTDL” – parametresi daha iyidir.
  • Verinin bir aynasını tutmak (mirror) daha fazla disk alanı gerektirir. Ama genellikle ufak rastlantısal okumalarda daha iyi performans sağlar.

ZFS’in bir çok faydaları olmakla birlikte bazı konularda uyanık olmak gerekir:

  • ZFS, 90% kapasitede, performans optimizasyonundan, depolama alanı optimizasyonuna geçer ki bunun performansa etkileri vardır. Yüksek yazma performansı ve disk değiştirme işlemlerine sorunlarla karşılaşmamak için veri havuzu 80’e erişmeden kapasite artışı yapınız.
  • iSCSI sözkonusu ise, “fragmantaion” yani veri parçalanması olmaması için veri havuzunun 50% kapasiteyi aşmaması tavsiye edilir.
  • 1TB üzerindeki hacimler için RAIDZ2 tavsiye edilir.
  • Vdev (virtual device) yaratırken eşit boyuttaki diskler kullanılmalı. ZFS farklı boyuttaki disklerle de “vdev” yaratabilir, ancak kapasite en küçük diskin kapasitesi ile sınırlı olacaktır.

Bazı kaynaklar:

Yorum yapın:

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.