OpenZFS

Photo by Jaime Nugent / Unsplash

Giriş

Bu makale ile, bir ZFS uyarlaması olan ve şu anda pek çok platformda desteklenen OpenZFS dosya sistemi hakkında bilgiler ve yine OpenZFS'e özel bazı uygulamalar anlatılmıştır. Uçtan uca tüm özelliklerden ziyade bir NAS kurulumu için gerekli olabilecek temel bilgilere yer verilmiştir. Bu nedenle snapshot, clone ve replication gibi oldukça güçlü özellikler için topluluk sitesinin incelenmesi yerinde olacaktır. Dokümanın çok uzayıp gitmemesi için dosya sistemi dataset ya da zvol dataset oluşturma ile ilgili bölümler bu doküman kapsamına alınmamış, kapsam zpool oluşturma ile sınırlı tutulmuştur.

OpenZFS Hakkında

OpenZFS, başlangıçta Sun Microsystems tarafından Solaris işletim sistemi için geliştirilen ve şu anda OpenZFS Projesi tarafından sürdürülen, ZFS dosya sistemi ve birim yöneticisinin açık kaynaklı bir uygulamasıdır.

ZFS, veri bütünlüğü, depolama kapasitesi ve esnekliğiyle öne çıkan, son derece güçlü ve çok yönlü bir dosya sistemidir. RAIDZ gibi gelişmiş veri koruma özelliklerine ve kopya üzerinde yazma gibi yenilikçi özelliklere sahiptir.

OpenZFS, ZFS'nin tüm temel özelliklerini korurken, açık kaynaklı bir geliştirme topluluğu tarafından sürekli olarak geliştirilmektedir. Bu da, OpenZFS'yi şu amaçlar için ideal bir seçim haline getirir:

  • Sunucu ve NAS cihazları için güvenilir ve yüksek performanslı depolama
  • Kişisel bilgisayarlarda veri bütünlüğü ve güvenliği
  • Veri merkezlerinde ve bulut ortamlarında büyük ölçekli depolama

OpenZFS'nin bazı önemli avantajları şunlardır:

Veri Bütünlüğü: ZFS, veri hatalarını ve bozulmalarını tespit ve düzeltmek için gelişmiş veri bütünlüğü özelliklerine sahiptir.
Depolama Kapasitesi: ZFS, petabaytlarca veriye kadar depolama kapasitesi sunar.
Esneklik: ZFS, farklı boyutlarda ve kapasitelerde sabit diskleri birleştirmek için kullanılabilir.
RAIDZ: RAIDZ, veri koruması için RAID 1, RAID 2 ve RAID 3'e benzer seviyeler sunan, ZFS'ye özgü bir RAID çözümüdür.
Kopya Üzerinde Yazma: Kopya üzerinde yazma, ZFS'nin anlık görüntüler oluşturmak ve geri yüklemeleri gerçekleştirmek için kullanılabilen bir özelliğidir.
Açık Kaynak: OpenZFS, ücretsiz ve açık kaynaklı bir yazılımdır.

OpenZFS, aşağıdakiler de dahil olmak üzere çeşitli işletim sistemlerinde kullanılabilir:

  • Linux
  • FreeBSD
  • macOS
  • Solaris
  • Windows (üçüncü taraf çözümleri aracılığıyla)

Proje ile ilgili dokümantasyona https://openzfs.github.io/openzfs-docs/ adresinden ulaşılabilir.

Topluluk

OpenZFS topluluğuna https://github.com/openzfs/zfs adresinden ulaşılabilir. İlk başlangıçta platformlar bazında geliştirici gruplar birbirinden bağımsız ilerlerken, 2020 yılı itibarı ile tüm platform codebase leri birleştirilerek çalışmaları tek bir repo altında toplanmış ve proje OpenZFS çatısı altında devam etmektedir. https://github.com/openzfs/zfs/releases/tag/zfs-2.0.0 ilk bileşik codebase olarak ortaya çıkan sürümdür.

OpenZFS RAID

Genel Bilgiler

Bu bölümdeki tüm ayrımlar, spare ve parity kullanımı ile ilgili düzenlemeler sonucu ortaya çıkan standartlara ilişkin olarak yapılmıştır. Takip eden bölümlerdeki tariflerin daha iyi anlaşılabilmesi için, aşağıdaki görsel iyi bir referans olacaktır.

OpenZFS Parity ve Spare Dağılımı

RAIDZ

RAIDZ, RAID-5'in bir varyasyonudur ve paritenin daha iyi dağıtılmasını sağlar ve tek parite ile yedeklilik sağlar. Aynı zamanda veri kaybına yol açabilen RAID-5'teki "yazma boşluğu" sorununu ortadan kaldırır. Bu yazma boşluğu, güç kesintisi yaşandığında verilerin ve paritenin tutarsız hale gelmesi durumudur. Zira RAID-5 sabit büyüklükte parity bloğu kullanarak veriyi in-place değiştirirken, copy-on-write yapılan I/O nedeni ile RAIDZ, bir tutarlı durumdan diğerine doğrudan geçiş yapmaktadır. RAID'den farklı olarak stripe checksum bilgisi de saklanmakta ve sessiz hatalar tespit edilebilmektedir. Daha detaylı bilgi için https://jro.io/truenas/openzfs/ adresinde oldukça detaylı bir makaleye ulaşılabilir.

RAIDZ2, RAIDZ3

Bir RAIDZ grubu tekli, çiftli veya üçlü pariteye sahip olabilir. Bu, RAIDZ grubunun sırasıyla bir, iki veya üç disk arızasına veri kaybı yaşamadan dayanabileceği anlamına gelir. raidz1 vdev tipi tekli pariteli bir RAIDZ grubunu, raidz2 vdev tipi çift pariteli bir RAIDZ grubunu ve raidz3 vdev tipi ise üç pariteli bir RAIDZ grubunu belirtir. raidz vdev tipi, raidz1 için kullanılan bir takma isimdir.

dRAID

Declustered RAID olarak adlandırılan bu yöntem, disk hataları sonrası RAID rebuild için yapılan I/O nun dağıtılarak daha hızlı sonuç alınması amacı ile geliştirilmiştir. Geleneksel RAID içerisinde konumlandırılan SPARE disklerin yerine mevcuttaki diskler içindeki spare blokların kullanılması ile bu yedek alan tüm disklere dağıtıldığından rebuild dramatik şekilde kısa sürede gerçekleştirilebilmektedir. Bu yeni SPARE için "Logical Spare" ifadesi kullanılmaktadır.

Örnek Uygulama

Örnek çalışmada, üzerinde 36 adet 4TB disk bulunan bir storage ve üzerinde kurulu bulunan Debian 12 (bookworm) dağıtımı kullanılacaktır.

Planlama

ZFS, ihtiyaca göre sınırsız sayıda yapılandırma kombinasyonu sağlayabilir. Bu dokümanda kullanılan büyük kapasiteli (~3.64TBx36) NAS için, maksimum kapasite ve parity sağlayacak yapılandırma irdelenmiştir. Öncelikle 4TB gibi büyük disklerin olduğu ve bunların da bir hayli çok olduğu sistemlerde duraylılık maksimizasyonu için RAID2 (2 parity) kullanımı oldukça iyi bir pratik sağlayacaktır. 36 diskten tek bir vdev oluşturmak yerine 3 ayrı vdev oluşturmak da hem I/O kapasitesi hem de yedekliliğin geliştirilmesi için tercih edilmiştir. Spare olarak ise her bir vdev için birer tane olmak koşuluyla toplamda 3 adet kullanılmıştır. Toplam kapasite ve disk büyüklüğü, DRAID seçilmesi için temel nedeni oluşturmaktadır.

Kapasite hesaplaması için aşağıdaki formül kullanılabilir;

kapasite = (C - S) * (D / (D+P)) * DS

C - Öğe sayısı
S - Dağıtık spare sayısı
D - Veri diski adedi
P - Parite adedi
DS - Minimum disk büyüklüğü

Disk sayıları ve elde edilen çıplak kapasite aşağıdak şekilde hesaplanmıştır;

Çıplak Kapasite = (36 - 3) * (27 / (27 + 6)) * 3.64 = 33 * 0.81 * 3.64 = 94.62 TB

Metadata ve operasyonlarda kullanılmak üzere rezerve edilen alanlar gözönünde bulundurulduğunda yaklaşık 90 TB kullanılabilir alan elde edilmiş olacaktır.

Yapılandırma

Bu bölümde, örnek donanımımız planlama aşamasında belirlendiği üzere 3 adet 2 parity bulunduran vdev olacak şekilde yapılandırılacaktır. Bunun için aşağıdaki komut kullanılabilir;

$ sudo zpool create tank1 draid2:9d:12c:1s /dev/sd[b-m]

dRAID pool içinde bir vdev oluşturulacağı zaman yukarıdaki gibi bir ifade kullanılır. Bu örnekte kullanılan değerler;

draid2: Her bir blok için iki parity blok kullanımı
9d: Toplamda 9 adet veri diski kullanımı
12c: VDEV içinde toplamda 12 disk kullanımı (söz diziminin tutarlılığı için kullanılır)
1s: VDEV içinde her bir blok için 1 spare blok kullanımı

Günlük Operasyonlar

ZFS dosya sistemi kullanan cihazlar, genellikle ya kapasite açısından ya da disk büyüklüğü açısından kritik sistemlerin kullandığı cihazlardır. Bu nedenle periyodik inceleme planlarının içerisine dahil edilmeleri iyi bir pratik olacaktır. Öcelikle mevcut pool durumları kontrol edilmelidir. Bunun için;

$ sudo zpool status

zpool status
  pool: tank1
 state: DEGRADED
status: One or more devices has been removed by the administrator.
	Sufficient replicas exist for the pool to continue functioning in a
	degraded state.
action: Online the device using zpool online' or replace the device with
	'zpool replace'.
  scan: scrub repaired 0B in 00:00:01 with 0 errors on Mon Jul 22 11:03:26 2024
  scan: resilvered (draid2:9d:12c:1s-0) 652K in 00:00:05 with 0 errors on Mon Jul 22 11:03:25 2024
config:

	NAME                  STATE     READ WRITE CKSUM
	tank1                 DEGRADED     0     0     0
	  draid2:9d:12c:1s-0  DEGRADED     0     0     0
	    sdb               ONLINE       0     0     0
	    sdc               ONLINE       0     0     0
	    sdd               ONLINE       0     0     0
	    sde               ONLINE       0     0     0
	    sdf               ONLINE       0     0     0
	    sdg               ONLINE       0     0     0
	    spare-6           DEGRADED     0     0     0
	      sdh             REMOVED      0     0     0
	      draid2-0-0      ONLINE       0     0     0
	    sdi               ONLINE       0     0     0
	    sdj               ONLINE       0     0     0
	    sdk               ONLINE       0     0     0
	    sdl               ONLINE       0     0     0
	    sdm               ONLINE       0     0     0
	spares
	  draid2-0-0          INUSE     currently in use

errors: No known data errors

komutunun kullanılması yeterli olacaktır. Yukarıdaki örnekte draid2:9d:12c:1s-0 vdev içindeki sdh diskinin yerinde olmadığını ve yerine geçici olarak draid2-0-0 spare alanının kullanıldığı görülmektedir. Örnek olması amacı ile disk arızası simülasyonu için disk çıkarıldığı için bu şekilde görünmektedir.

Disk Online/Offline

Bir disk yerinden cikartıldığında ya da bir nedenle aşağıdaki komutla offline konuma getirildiğinde, ancak tekrar online olması komutu verildiğinde online olacaktır.

$ sudo zpool offline tank1 sdi

Ardından pool kontrol edildiğinde;

$ sudo zpool status
  pool: tank1
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
	Sufficient replicas exist for the pool to continue functioning in a
	degraded state.
action: Online the device using 'zpool online' or replace the device with
	'zpool replace'.
  scan: resilvered 11.3M in 00:00:02 with 0 errors on Mon Jul 22 11:04:40 2024
config:

	NAME                  STATE     READ WRITE CKSUM
	tank1                 DEGRADED     0     0     0
	  draid2:9d:12c:1s-0  DEGRADED     0     0     0
	    sdb               ONLINE       0     0     0
	    sdc               ONLINE       0     0     0
	    sdd               ONLINE       0     0     0
	    sde               ONLINE       0     0     0
	    sdf               ONLINE       0     0     0
	    sdg               ONLINE       0     0     0
	    sdh               ONLINE       0     0     0
	    sdi               ONLINE       0     0     0
	    sdj               OFFLINE      0     0     0
	    sdk               ONLINE       0     0     0
	    sdl               ONLINE       0     0     0
	    sdm               ONLINE       0     0     0
	spares
	  draid2-0-0          AVAIL

errors: No known data errors

Diskin offline olduğu ve fakat spare'in devreye alınmadığı görülecektir. Bunun nedeni offline durumunun disk arızasından değil, istemli bir şekilde gerçekleştirilmesinden kaynaklıdır. Diski tekrar online hale getirmek için;

$ sudo zpool online tank1 sdj

komutunu kullanmak yeterli olacaktır. Eğer disk gerçekten arızalandı ise değişimle ilgili bölümdeki yönergeler kullanılmalıdır.

Bozulan Disk Değişimi

ZFS pool içinden bir disk bozulduğunda, söz konusu disk yenisi ile değiştirildiğinde aşağıdaki komut ile zfspool'a bu değişiklik uygulanır;

$ sudo zpool replace tank1 sdh

Şayet disk adı farklı olacak ise;

$ sudo zpool replace tank1 sdh sd<yeni harf>

komutu ile değiştirilebilir.

Sonuç

OpenZFS, veri bütünlüğü, performans ve ölçeklenebilirlik için tasarlanmış açık kaynaklı bir dosya sistemidir. Bu dokümanda çok küçük bir bölümü ile ilgili bir inceleme yapılmıştır.

Veri bütünlüğünü korumak için ECC ve checksum kullanır, RAIDZ ve cache gibi çeşitli performans optimizasyon tekniklerini destekler ve petabaytlarca veri depolayabilen büyük veri kümeleri için idealdir.

ZFS yönetimi ZFS komut satırı araçları veya grafiksel kullanıcı ara yüzleri (GUI'ler) aracılığıyla kolayca gerçekleştirilebilir ve Linux, macOS ve FreeBSD dahil olmak üzere çeşitli işletim sistemlerini destekler.

OpenZFS, veri merkezleri, masaüstü ve dizüstü bilgisayarlar, sunucular ve depolama cihazları dahil olmak üzere çeşitli kullanım durumları için ideal bir dosya sistemidir.

Veri bütünlüğü, performans ve ölçeklenebilirlik için önemseyen kullanıcılara güçlü ve kullanımı kolay bir dosya sistemi sunar.

OpenZFS hakkında daha fazla bilgi edinmek için şu kaynaklara göz atabilirsiniz:

Dogan ZORLU

Dogan ZORLU