Osnove ZFS-a

Zettabyte File System, skraćeno ZFS, je savremeni, napredni fajl sistem, koji je u velikoj meri revolucionisao način na koji se upravlja podacima, način na koji se podaci čuvaju i štite. Kako je ZFS izuzetno složen sistem, u ovom članku ćemo obraditi njegove najvažnije osobine koje ga izdvajaju od tradicionalnih fajl sistema. Takođe ćemo proći i kroz jedan praktični primer konfigurisanja ZFS-a.

ZFS je prvobitno kreirala kompanija Sun Microsystems, početkom 2000-ih, i objavila pod open-source licencom, ali je nešto kasnije Oracle kupio Sun Microsystems i zatvorio izvorni kod za nove verzije. Pošto je kod u tom trenutku bio otvoren, iskorišćen je kao osnova za kreiranje open-source projekta pod nazivom OpenZFS, 2013. godine. Ovaj projekat predstavlja verziju ZFS-a koja se i danas koristi na većini Unix-like sistema (Linux, FreeBSD, itd.), i na koju se uglavnom misli kada se govori o ZFS-u.

Osobine

U svojoj osnovi, ZFS nije samo fajl sistem, već i volume menadžer, i kao takav obavlja dve kategorije poslova: upravljanje uređajima i upravljanje podacima. Osim toga što podrazumeva veći obim posla od tradicionalnih fajl sistema, ZFS dodatno uvodi neke koncepte kako bi obezbedio veću fleksibilnost u načinu korišćenja prostora, kao i značajno veću bezbednost i integritet podataka.

Gradivni blokovi

Deo benefita koje ZFS nosi sa sobom postiže kroz unikatan način apstrakcije fizičkih uređaja, tj. diskova. Ideja je da fizičke diskove sakrije od korisnika tako što ih na pametan način spaja u jedan ili više virtuelnih kontejnera za skladištenje podataka. Prostorom tih kontejnera je zatim moguće upravljati sa visokim stepenom kontrole. On se može deliti na manje celine, čijim se osobinama može pojedinačno upravljati.

Gradivni blokovi ZFS-a

Osnovni gradivni blokovi ZFS-a koji se koriste u ovom procesu apstrakcije su: vDev, zPool i Dataset. U nastavku ćemo obraditi svaki od njih.

vDev – Virtuelni uređaj

Prvi gradivni blok koji ZFS uvodi je takozvani virtuelni uređaj, tj. vDev (Virtual Device). ZFS spaja fizičke diskove koristeći koncepte RAID-a kako bi obezbedio bolje performanse, veći kapacitet i mogućnost oporavka od otkaza diskova. Ideja je da se diskovi ne posmatraju kao zasebne jedinice, već da se spajanjem predstave kao jedan virtuelni uređaj za čuvanje podataka.

Konfiguracije za spajanje diskova koje ZFS koristi su derivati klasičnih RAID konfiguracija, a to su:

  • Single Device (vDev sa jednim diskom. Ovo zapravo nije RAID konfiguracija, nema redundanse)
  • Mirror (RAID1. Oporavak od otkaza jednog diska, u konfiguraciji od 2 diska)
  • RAID-Z1 (RAID5. Oporavak od otkaza jednog diska, u konfiguraciji od 3 ili više diskova)
  • RAID-Z2 (RAID6. Oporavak od otkaza do 2 diska, u konfiguraciji od 4 ili više diskova)
  • RAID-Z3 (Oporavak od otkaza do 3 diska, u konfiguraciji od 6 ili više diskova)

Ideja kod ZFS-a je da izborom neke od ovih konfiguracija kreiramo virtuelne diskove koji pružaju bolje performanse, kapacitet i bezbednost podataka u odnosu na pojedinačne fizičke diskove. To je ono što se postiže na nivou vDev-a. Međutim, da bismo ovakve virtuelne diskove zaista koristili za smeštanje podataka moramo proći kroz još nekoliko koraka.

zPool – Objedinjeni skladišni prostor

Pool u računarskim tehnologijama obično predstavlja jedan resurs koji na neki način objedinjuje više pojedinačnih resursa. Pool za podatke, u ZFS svetu poznat kao zPool, je kontejner koji objedinjuje prostor više virtuelnih diskova, tj. vDev-ova. To objedinjavanje ZFS postiže raspoređivanjem podataka podjednako na sve vDev-ove, tako da se svi oni mogu posmatrati kao jedan, objedinjeni resurs.

Jedan zPool može biti sastavljen od jednog ili više vDev-ova koji su konfigurisani na isti način, u pogledu RAID konfiguracije i, poželjno je, broju i veličini diskova.

Ono što je vrlo važno napomenuti je da zPool sam po sebi ne obezbeđuje oporavak od otkaza, jer vDev-ove objedinjuje bez ikakve redundanse. To je sličan način kako radi i RAID-0 (Stripe), koji obezbeđuje povećane performanse i kapacitet, ali ne i redundansu, pa tako nije moguć ni oporavak prilikom otkaza nekog od diskova. Zato, ukoliko bi jedan vDev potpuno otkazao, ceo zPool bi bio uništen! Nema načina da povrati izgubljene podatke. Iz tog razloga je bitno da sami vDev-ovi budu otporni na otkaze diskova, izborom odgovarajuće konfiguracije. Ako se osvrnemo na moguće konfiguracije vDev-ova, možemo da uočimo da bi izbor Single Device konfiguracije mogao da bude fatalan po zPool, jer ukoliko samo taj jedan (i jedini) disk u vDev-u otkaže, sam vDev otkazuje, pa tako i ceo zPool strada. Zato je vrlo bitno izabrati konfiguraciju vDev-a koja je adekvatna za konkretan slučaj korišćenja.

Ono što je vrlo važno napomenuti je da zPool sam po sebi ne obezbeđuje oporavak od otkaza, jer vDev-ove objedinjuje bez ikakve redundanse.

Moć ovakvog načina upravljanja skladišnim prostorom možemo videti na primeru konfiguracije koja je ZFS pandan hibridnom RAID10. U takvoj konfiguraciji prvo bi se parovi diskova spojili u virtuelne diskove u Mirror konfiguraciji (RAID1), a zatim bi se oni spojili u jedan zPool spajanjem koje je slično Stripe-u (RAID0). Na taj način se postižu benefiti i Mirror-a i Stripe-a, bezbednost i performanse, koje inače donosi i sam RAID10. A pored toga, takav zPool je lako moguće proširiti, dodavanjem novog MirrorvDev-a.

U trenutku kada imamo oformljen zPool, još uvek ne možemo koristiti njegov prostor. Operativni sistem još uvek nema mogućnost da dati prostor koristi za smeštanje fajlova. Tu na scenu stupa novi pojam, Dataset.

Dataset – Vidljivi resurs

Datasetje kontejner za čuvanje podataka koji je vidljiv operativnom sistemu. Ideja je da se prostor koji nam pruža zPool iskoristi za kreiranje jednog ili više kontejnera, koje će operativni sistem moći da koristi za smeštanje podataka. U tom kontekstu, postoje dve vrste Dataset-ova: File System Dataset, koji operativni sistem vidi kao folder, i Volume Dataset, koji operativni sistem vidi kao blok uređaj (disk).

File System Dataset se predstavlja operativnom sistemu kao folder koji ima svoju strukturu direktorijuma i koji je spreman za smeštanje i čitanje fajlova. Ovakvi Dataset-ovi se obično koriste kod NAS uređaja (Network-Attached Storage) tako što se upotrebom određenog protokola (SMB, NFS, itd.) taj Dataset podeli preko mreže, kao deljeni folder. Ovakav Dataset ima svoju konfiguraciju dozvola za pristup, veličine, itd.

Volume Dataset operativni sistem vidi kao običan disk, tj. blok uređaj, koji se, kao i bilo koj drugi fizički disk, može formatirati i na njemu postaviti neki od tradicionalnih fajl sistema. Ovakav Dataset je pogodan za korišćenje u serverskim okruženjima, gde se može proslediti na korišćenje virtuelnoj mašini kao običan blok uređaj, ali koji sa sobom nosi sve benefite koje je ZFS obezbedio.

Ključni mehanizmi

Pored ovih gradivnih blokova koji donose sa sobom pomenute benefite, ZFS dodatno upošljava određene mehanizme koji ga posebno izdvajaju od konkurencije. U nastavku ćemo obraditi neke od najvažnijih mehanizama.

Copy-on-Write

ZFS je takozvani copy-on-write, skraćeno CoW, fajl sistem. To znači da prilikom izmene podataka, umesto da se nova verzija upiše u isti blok na disku, ona se kopira u novi blok.

Za vreme trajanja procesa izmene podataka, tj. transakcije, prvobitna verzija se smatra trenutno aktuelnom, sve dok se transakcija ne izvrši uspešno, kada izmenjena verzija podataka postaje aktuelna. Ovaj mehanizam je realizovan pomoću pokazivača na lokaciju, tj. blok, trenutno aktuelne verzije podatka. Nakon izvršene transakcije, kada se pokazivač usmeri na novi blok, stari postaje slobodan, pa se može koristiti za smeštanje drugih podataka.

Snapshot

Jedan mehanizam koji copy-on-write otključava se zove Snapshot. U ZFS-u, Shapshot predstavlja prethodno stanje Dataset-a. Za razliku od potpune kopije podataka, koja bi zauzela prilično prostora, Snapshot čuva samo pokazivače na blokove verzije podataka koja je u trenutku kreiranja Snapshot-a bila aktuelna. Zbog CoW mehanizma, izmenom podataka nakon kreiranje Snapshot-a, blokovi koji su promenjeni se kopiraju. Međutim, umesto da se stara verzija oslobodi, ona će ostati da postoji, i pokazivači Snapshot-a će i dalje pokazivati na prethodnu verziju blokova. Ovde možemo da primetimo da će Snapshot i novo stanje podataka deliti one blokove koji se nisu menjali, pokazivači će pokazivati na iste blokove, bez potrebe da se oni čuvaju duplo. Na taj način, postojanje Snapshot-a dodatno zauzima samo onoliko blokova koliko ih je izmenjeno nakon kreiranja tog Snapshot-a. Ovaj mehanizam je sličan načinu rada Git-a, samo izmenjeni podaci dodatno zauzimaju prostor, dok se u isto vreme obezbeđuje čuvanje prethodnog stanja podataka.

Snapshot mehanizam

Kompresija i deduplikacija

Pored optimalnog iskorišćenja prostora kod Snapshot-ova, ZFS dodatno optimizuje iskorišćenje prostora pomoću dva mehanizma: kompresija i deduplikacija.

Kompresija predstavlja kodiranje podataka na način koji smanjuje potreban prostor za njihov zapis, pre nego što se ti podaci smeste na disk. Kada se podaci čitaju sa diska, ZFS obavlja dekompresiju, odnosno dekodiranje podataka. Osim uštede na prostoru, često se postižu i veće performanse čitanja i pisanja, zbog redukovanja broja U/I operacija. Naravno, kompresija i dekompresija troše određeno procesorsko vreme. Zato postoje različiti algoritmi koji se mogu koristiti, i koji ostvaruju različite performanse u pogledu iskorišćenja prostora i procesorskog vremena.

Deduplikacija je osobina ZFS-a da eliminiše duplirane kopije podataka. Umesto da se novi podaci zapišu u novom bloku, ukoliko su oni identični podacima već postojećeg bloka, novi blok se neće kreirati, već će pokazivač koji prati lokaciju novih podataka pokazivati na taj postojeći blok. Novi odvojeni blok se kreira tek kada je potrebno izmeniti podatke, tada se pokazivač pomera na novi blok. Ovo je još jedan mehanizam koji je potpomognut CoW-om.

Deduplikacija

Kompresija i deduplikacija se mogu konfigurisati odvojeno za svaki Dataset.

Kontrolna suma

Checksum, ili kontrolna suma, je broj koji se računa, pomoću heš funkcije, za svaki blok prilikom njegovog upisivanja. Ta suma se čuva na disku zajedno sa podacima bloka. Prilikom svakog čitanja bloka suma se ponovo računa i upoređuje sa onom koja se nalazi na disku. Ukoliko te sume nisu identične, to je indikator da su podaci neregularno promenjeni, samim tim i oštećeni. U tom slučaju ZFS preduzima korake da oporavi oštećene podatke koristeći redundantne podatke koji su obezbeđeni na nivou vDev-a, Mirror-om ili nekom od RAID-Z konfiguracija.

Pored provere kontrolne sume prilikom regularnog čitanja podataka, ZFS to omogućava kroz proces koji se zove Scrubbing, koji periodično čita sve podatke i proverava sume. Ukoliko naiđe na oštećenje, pokreće pomenuti proces oporavka.

Praktični primer

Sada, kada smo se upoznali sa osnovnim konceptima, možemo proći kroz jedan praktični primer konfiguracije ZFS-a na realnom sistemu.

Primerom ćemo pokriti kreiranje jednog zPool-a sastavljenog od dva MirrorvDev-a, naknadno proširivanje zPool-a novim MirrorvDev-om, kao i kreiranje Dataset-ova. Operativni sistem koji je korišćen za ovaj primer je Ubuntu 22.04.

Kako isprobati ovaj primer?

Cilj ovog primera je da na jednostavan način demonstrira kako bi u praksi mogao da izgleda proces konfigurisanja ZFS-a na realnom sistemu. Međutim, važno je napomenuti, ovo nije uputstvo kako konfigurisati ZFS na produkcionom sistemu. U tom slučaju je potrebno ozbiljnije se pozabaviti dodatnim konfigurisanjem (radi optimizovanja performansi i osiguravanja bezbednosti), kao i upoznavanjem sa najboljim praksama, automatizovanjem procesa, itd.

Iz tog razloga, preporučujemo da se za isprobavanje i eksperimentisanje sa konfigurisanjem ZFS-a koristi virtuelna mašina, sa virtuelnim hard diskovima. Na taj način nema rizika od oštećenja host sistema ili formatiranja pogrešnih hard diskova, i time gubljenja podataka. Takođe, na taj način brzo i lako možemo dodavati proizvoljan broj virtuelnih hard diskova i testirati različite konfiguracije.

S druge strane, proces konfigurisanja prikazan u ovom primeru je identičan i ako se ne koristi virtuelna mašina. Jedina bitna razlika bi zapravo bila u broju i veličini hard diskova, koji bi uticao na to kako ih možemo konfigurisati u okviru vDev-ova.

Primer koji je ovde demonstriran je izveden na VirtualBox virtuelnoj mašini, za koju je zakačeno 6 virtuelnih hard diskova od 250GB, koje ćemo iskoristiti za kreiranje zPool-a, i jedan disk od 25GB na kom je instaliran sam OS.

Ako vas zanima kako instalirati Ubuntu na virtuelnoj mašini i kreirati dodatne virtuelne hard diskove korišćenjem VirtualBox-a, možete pogledati sledeće video tutorijale:

Bez daljeg odugovlačenja, pređimo na primer.

Instalacija potrebnog softvera

Da bismo koristili ZFS potrebno je da određen softver bude instaliran na sistemu. Jedan od njih je Linux kernel modul za podršku ZFS-a, a on dolazi u okviru podrazumevanog Ubuntu-ovog Linux kernela. Jedino što je potrebno dodatno instalirati na Ubuntu je zfsutils-linux paket koji će povući i instalaciju nekoliko drugih potrebnih paketa.

Na Ubuntu, instalaciju ovog paketa iniciramo sledećom komandom:

sudo apt install zfsutils-linux

Nakon završene instalacije, na sistemu će postojati dve nove komande koje ćemo koristiti, a to su zfs i zpool.

Kreiranje zPool-a

Da bismo kreirali zPool, prvo je potrebno da identifikujemo diskove koje želimo da uključimo u njegov sastav, naravno, povezujući ih u vDev-ove.

Da bismo videli koje diskove imamo dostupne, i kako su označeni, možemo iskoristiti komandu fdisk, koja će izlistati sve diskove i, ukoliko ih ima, njihove particije. Komandu je potrebno pokrenuti kao root korisnik.

sudo fdisk -l

Za svaki disk ćemo dobiti ispis podataka sličan ovom:

Ispis fdisk komande (za jedan disk)

U mom slučaju, diskovi koje želim da uključim u Pool su: sdb, sdc, sdd, sde, sdfi sdg. Svi su predstavljeni nodovima u direktorijumu /dev, pa je puna putanja do njih /dev/sd...

Komandu zpool, kao što možemo da pretpostavimo, koristimo za operacije vezane za zPool. Naučili smo da je zPool sastavljen od vDev-ova, ali ovde ih ne moramo odvojeno kreirati, već prilikom samog kreiranja zPool-a kreiramo i vDev-ove koji će biti u njegovom sastavu.

Novi zPool sa 2 MirrorvDev-a kreiramo na sledeći način:

sudo zpool create mypool mirror /dev/sdb /dev/sdc mirror /dev/sdd /dev/sde

Parametar mypoolpredstavlja ime našeg novog zPool-a, nakon koga se navode redom konfiguracije vDev-ova koji će se naći u sastavu. Za svaki vDev se prvo navodi tip konfiguracije, u našem slučaju je to Mirror, a zatim oznake diskova koji će ući u njegov sastav.

Nakon što prethodna komanda završi, proverićemo stanje novog zPool-a sledećom komandom:

sudo zpool status mypool

Ovim dobijamo sledeći ispis:

Ispis komande zpool status

Možemo videti status pojedinačnih diskova, vDev-ova i zPool-a, koji nam u ovom slučaju govore da je sve u redu.

Kreiranje Dataset-ova

Sada, kada imamo oformljen zPool, možemo kreirati Dataset-ove po želji. Kreiraćemo dva File System Dataset-a, koji će sistemu biti predstavljeni kao direktorijumi:

sudo zfs create mypool/archive
sudo zfs create mypool/workspace

Iskoristili smo komandu zfs sa parametrom create kojom kreiramo File System Dataset-ove u okviru mypoolzPool-a, a koji se zovu archivei workspace.

Dataset-ovi su sada spremni za korišćenje. Možemo ih videti kao foldere na putanjama /mypool/archive i /mypool/workspace.

Dataset-ovi archive i workspace predstavljeni kao folderi

Međutim, ako pokušamo da sačuvamo fajl u nekom od ova dva foldera naićićemo na problem:

Nemamo odgovarajuće dozvole kako bismo sačuvali fajl u workspace Dataset-u (direktorijumu)

Naime, problem je u tome što je vlasnik ovih direktorijuma rootkorisnik, koji ima sve dozvole nad njihovim sadržajem, dok ostali korisnici sistema imaju samo dozvolu za čitanje.

Ovo možemo rešiti na više načina. Na primer, jedan način bi bio da promenimo vlasništvo nad ovim folderima, i to na sledeći način:

sudo chown user:group /mypool/archive /mypool/workspace

Parametar user:group predstavlja naziv korisnika i naziv grupe, redom, u čijem će vlasništvu biti dati direktorijumi. Umesto user i group ćemo napisati realno korisničko ime i naziv grupe korisnika na našem sistemu. Korisnik koji postane vlasnik ovih direktorijuma će imati potpunu kontrolu nad njihovim sadržajem.

Nakon što smo postali vlasnici, možemo sačuvati fajl.

Uspešno sačuvan fajl u Dataset-u (direktorijumu) workspace

Proširivanje zPool-a

Na početku smo pomenuli da ćemo naknadno, nakon što zPool već bude kreiran, dodati još jedan MirrorvDev. To ćemo sada uraditi, komandom koja je slična onoj kojom smo kreirali novi zPool. Jedina razlika je u tome što umesto parametra create pišemo add:

sudo zpool add mypool mirror /dev/sdf /dev/sdg

Ponovo možemo proveriti status našeg zPool-a komandom zpool status. Dobićemo sledeći ispis:

Ispis komande zpool status

Možemo videti da je novi vDev dodat u naš zPool. Sada je kapacitet novog vDev-a pridodat zPool-u.

Takođe, pomoću zfs komande, možemo izlistati sve zPool-ove i Dataset-ove koje imamo na sistemu, i dobiti neke detalje o njima:

sudo zfs list

Dobićemo sledeći ispis:

Ispis komande zfs list

I to je sve! Uz pomoć samo nekoliko komandi, oformili smo prostor za čuvanje podataka iza koga stoji robustan ZFS sistem, koji obezbeđuje sve one benefite o kojima je prethodno bilo reči.

Rezime

U ovom članku smo prošli kroz osnovne koncepte ZFS-a, sa teorijske i praktične strane, i time samo zagrebali površinu svega onoga što ga čini tako moćnim sistemom. Ukoliko vas je ova tema zaintrigirala, dalje čitanje i istraživanje o ZFS-u i povezanim pojmovima možete nastaviti na linkovima ispod.

Linkovi

Dokumentacija i uputstva

YouTube

Blog članci

Wikipedia

Autor: Dragor Draganović

Student softverskog inženjerstva i demonstrator na Institutu za matematiku i informatiku PMF-a u Kragujevcu.

Dragor Draganović

Student softverskog inženjerstva i demonstrator na Institutu za matematiku i informatiku PMF-a u Kragujevcu.