Velen hebben er vast wel een keer van gehoord: ZFS. Voor velen blijft het dan ook bij het horen. Schaam je echter niet, want ook op internet is het betrekkelijk stil rond dit filesysteem van Sun. En toch is dit een zeer krachtig filesysteem dat een radicaal andere opzet heeft t.o.v alles wat er verder nog in FileSystem land aanwezig is. Tijd dus voor een topic 
Als eerste maar even een paar websites met basic info's later meer:
- ZFS community @ opensolaris
- ZFS wiki
OS support
ZFS schijnt zich het beste thuis te voelen op Solaris, maar er zijn ondertussen ook ports BSD en linux. Apple wilde ZFS zelfs in Leopard gebruiken als hoofd filesysteem, is daar echter op terug gekomen, misschien krijgt Snowleopard een kans... Er is overigens wel gewoon een OSX port beschikbaar voor de liefhebber
Wat maakt ZFS nu eigenlijk zo speciaal
Wat als eerste op zal vallen is dat ZFS werkt met storage pools. Binnen zo'n pool kun je zelf filesystemen aanmaken en je kunt ook vast grottes of quotas instellen. Partitioneren is er niet meer bij
ZFS regelt dat allemaal transparant in de achtergrond. Het tweede dat op zal vallen is dat een storage pool kan bestaan uit meer dan een schijf. Dit houdt in dat ZFS dus ook een software RAID functionaliteit ingebouwd heeft, met de mogelijkheid tot diverse RAID levels, van raid 0 tot RAIDZ2 of een combinatie van verschillende.
Raakt je filesysteem vol, dan druk je simpelweg een nieuwe disk (of meerdere) in je systeem, en voegt deze toe aan je storage pool als een nieuwe stripe. De extra schijfruimte is direct aanwezig
Op de achtergrond zal het filesysteem er vervolgens zelf voor zorgen dat de nieuwe schijf optimaal benut wordt, dat zal dus inhouden dat een deel van de oude data naar de nieuwe stripe zal worden overgezet zodat om zo IO performance te maximaliseren.
Nu hoor ik al meteen de fans va hardware raid klagen dat dat de enige juiste weg is... Sun lijkt hier echter duidelijk andere ideeën over te hebben en is voor de juiste combinatie van de twee. Je kunt je voorstellen dat je hardware raid in bepaalde configuraties nog steeds wil gebruiken om bus IO bandbreedte te besparen naar de schijf controller. Het maakt nogal wat uit of je 10 disks vanuit je OS direct aanspreekt, of die 10 disks transparant via de raid controller als zijnde 2 raid devices.
Verder heeft ZFS zijn eigen foutdetectie en reparatie kit in huis. Er wordt gewerkt met checksums om file integriteit te kunnen testen.
Wil je wat demo's zien, kijk dan eens hier.
Er is nog meer
ZFS is niet alleen gebouwd voor eenvoud, betrouwbaarheid, schaalbaarheid en flexibiliteit, maar ook voor performance. Het IO model van ZFS werkt met pipelines en kan ook out-of-order en op basis van prioriteiten beslissingen nemen om zo efficient mogelijk om te kunnen gaan met de pool. Verder is er ook een ARC cache welke voor een verdere performance boost zorgt. Voor snelle synchrone schrijfacties heeft Sun het principe van het intent log (ZIL) bedacht. Dit is een blok ergens op de pool, of op een losse schijf waar ZFS snel, op een sequentiële manier IO opdrachten naar toe kan schrijven, welke later, als IO load gunstiger is, weer afgespeeld kunnen worden. Het schijven van random data kan zo een flinke performance boost krijgen, zeker als de ZIL op een losse schijf gesitueerd is. Als het systeem zou crashen, wordt de ZIL ook gebruiken om nog uitstaande IO transacties alsnog uit te voeren zodra het systeem weer opnieuw start. Zo is de data in je pool altijd consistent
Snapshots en backup
Nog een mooie feature, die je ook bij andere moderene filesystemen begint te zien is de mogelijkheid om een snapshot te maken van je data. Dit is prima te gebruiken als backup. ZFS is dan zo slim om niet een complete copie van je data te maken, maar zorgt er simpelweg voor dat aanpassingen die gedaan worden in het filesysteem niet naar de zelfde clusters worden geschreven, maar op een nieuwe plek. Dit laatste doet ZFS overigens standaard.
So far so good, wat nu?
ZFS heeft natuurlijk nog meer features, als je meer wil weten moet je zelf op zoek gaan, bijvoorbeeld deze PDF
Waar ik wel naar op zoek ben zijn praktische tips en praktijkervaring. Er is wel wat te vinden, bijvoorbeeld hier: hier. Maar ik mis eigenlijk essentiële informatie die het mogelijk maken om duidelijke oplossingen te vinden voor bepaalde doelstellingen. Zo laten ze enkele voorbeelden zijn van recommended setup voor enkele Sun machines, zonder zinvolle uitleg erbij.
Je kunt dus niet vooraf makkelijk inschatten welke configuratie het beste zal uitpakken, zeker ook omdat er op internet verdacht weinig info opduikt. Toch is er wat wat te vinden:
- http://blogs.sun.com/paul...ng_postgresql_on_zfs_file
- http://dimitrik.free.fr/db_STRESS_BMK_Part2_ZFS.html
- http://blogs.sun.com/realneel/category/ZFS
- http://blogs.sun.com/perrin/entry/the_lumberjack
Dat is niet al teveel, maar laat enerzijds zien dat ZFS een groot potentieel heeft, en aan de andere kant dat het nogal wat uitmaakt hoe je het een en ander configureerd.
Tijd dus voor wat discussie lijkt me
Ik zal dan ook maar meteen met een eigen vraag van start gaan
Wij staan binnenkort namelijk voor de volgende case: server bestaande uit 2x Quad core Intel@2.6,64GB memory, en 16x 15K5 SAS disks op een ICP controller. Dit beestje dient uitsluitend een PostgreSQL database te runnen met een behoorlijk forse load en database omvang. Het idee is om op deze machine OpenSolaris te draaien met ZFS als filesysteem voor de database omgeving. De vraag is echter hoe we dit gaan indelen? We hebben 16 disks, en een veelvoud aan verschillende configuraties, die allemaal een andere impact zullen hebben op performance. Voor de database toepassing zal het vooral van belang zijn om random IO performance te maximaliseren. Voor het gemak ga ik ervan uit dat het OS op een een niet ZFS disk mirror geïnstalleerd zal worden bestaande uit twee disks in hardware RAID1. Blijven dus nog 14 disks om mee te spelen. Je zou er nog aan kunnen denken om een of twee disks als hot spare te reserveren (zowel de controller als ZFS kunnen hiermee overweg), maar aangezien de spare net zo veel kans op falen heeft als een actieve disk (draaien doet de hot spare immers toch) zie ik het voordeel niet direct hiervan. Daarnaast heeft PostgreSQL nog een transactielog welk voor optimale performance op een losse pool gezet zou moeten worden. Ook de ZIL zou voor performance een losse pool moeten worden, de vraag is of dat voor zowel het transactie log als de data zou moeten.
Grootste probleem is het vinden van de juiste verhoudingen in performance tussen de verschillende onderdelen, en wat je de controller laat doen, en wat ZFS? Met andere woorden: hoeveel disks ga je opofferen voor welk onderdeel? De ZFS Best Practices Guide is hier niet echt een enorm grote hulp. Er staan wel wat pointers, maar je komt er niet erg ver mee.
Uiteindelijk zullen benchmarks moeten uitwijzen wat de beste combinatie is voor onze toepassing, tevens is het en mooie test om te zien of ZFS in de praktijk de kop boven water kan houden. Mijn hoop is dat anderen al een keer tegen dit soort dingen zijn aangelopen, zoniet dan hoop ik dat ik voldoende info kan verzamelen om meer inzicht te krijgen, en dat anderen daar weer wat van kunnen leren
Als eerste maar even een paar websites met basic info's later meer:
- ZFS community @ opensolaris
- ZFS wiki
OS support
ZFS schijnt zich het beste thuis te voelen op Solaris, maar er zijn ondertussen ook ports BSD en linux. Apple wilde ZFS zelfs in Leopard gebruiken als hoofd filesysteem, is daar echter op terug gekomen, misschien krijgt Snowleopard een kans... Er is overigens wel gewoon een OSX port beschikbaar voor de liefhebber
Wat maakt ZFS nu eigenlijk zo speciaal
Wat als eerste op zal vallen is dat ZFS werkt met storage pools. Binnen zo'n pool kun je zelf filesystemen aanmaken en je kunt ook vast grottes of quotas instellen. Partitioneren is er niet meer bij
Raakt je filesysteem vol, dan druk je simpelweg een nieuwe disk (of meerdere) in je systeem, en voegt deze toe aan je storage pool als een nieuwe stripe. De extra schijfruimte is direct aanwezig
Nu hoor ik al meteen de fans va hardware raid klagen dat dat de enige juiste weg is... Sun lijkt hier echter duidelijk andere ideeën over te hebben en is voor de juiste combinatie van de twee. Je kunt je voorstellen dat je hardware raid in bepaalde configuraties nog steeds wil gebruiken om bus IO bandbreedte te besparen naar de schijf controller. Het maakt nogal wat uit of je 10 disks vanuit je OS direct aanspreekt, of die 10 disks transparant via de raid controller als zijnde 2 raid devices.
Verder heeft ZFS zijn eigen foutdetectie en reparatie kit in huis. Er wordt gewerkt met checksums om file integriteit te kunnen testen.
Wil je wat demo's zien, kijk dan eens hier.
Er is nog meer
ZFS is niet alleen gebouwd voor eenvoud, betrouwbaarheid, schaalbaarheid en flexibiliteit, maar ook voor performance. Het IO model van ZFS werkt met pipelines en kan ook out-of-order en op basis van prioriteiten beslissingen nemen om zo efficient mogelijk om te kunnen gaan met de pool. Verder is er ook een ARC cache welke voor een verdere performance boost zorgt. Voor snelle synchrone schrijfacties heeft Sun het principe van het intent log (ZIL) bedacht. Dit is een blok ergens op de pool, of op een losse schijf waar ZFS snel, op een sequentiële manier IO opdrachten naar toe kan schrijven, welke later, als IO load gunstiger is, weer afgespeeld kunnen worden. Het schijven van random data kan zo een flinke performance boost krijgen, zeker als de ZIL op een losse schijf gesitueerd is. Als het systeem zou crashen, wordt de ZIL ook gebruiken om nog uitstaande IO transacties alsnog uit te voeren zodra het systeem weer opnieuw start. Zo is de data in je pool altijd consistent
Snapshots en backup
Nog een mooie feature, die je ook bij andere moderene filesystemen begint te zien is de mogelijkheid om een snapshot te maken van je data. Dit is prima te gebruiken als backup. ZFS is dan zo slim om niet een complete copie van je data te maken, maar zorgt er simpelweg voor dat aanpassingen die gedaan worden in het filesysteem niet naar de zelfde clusters worden geschreven, maar op een nieuwe plek. Dit laatste doet ZFS overigens standaard.
So far so good, wat nu?
ZFS heeft natuurlijk nog meer features, als je meer wil weten moet je zelf op zoek gaan, bijvoorbeeld deze PDF
Waar ik wel naar op zoek ben zijn praktische tips en praktijkervaring. Er is wel wat te vinden, bijvoorbeeld hier: hier. Maar ik mis eigenlijk essentiële informatie die het mogelijk maken om duidelijke oplossingen te vinden voor bepaalde doelstellingen. Zo laten ze enkele voorbeelden zijn van recommended setup voor enkele Sun machines, zonder zinvolle uitleg erbij.
Je kunt dus niet vooraf makkelijk inschatten welke configuratie het beste zal uitpakken, zeker ook omdat er op internet verdacht weinig info opduikt. Toch is er wat wat te vinden:
- http://blogs.sun.com/paul...ng_postgresql_on_zfs_file
- http://dimitrik.free.fr/db_STRESS_BMK_Part2_ZFS.html
- http://blogs.sun.com/realneel/category/ZFS
- http://blogs.sun.com/perrin/entry/the_lumberjack
Dat is niet al teveel, maar laat enerzijds zien dat ZFS een groot potentieel heeft, en aan de andere kant dat het nogal wat uitmaakt hoe je het een en ander configureerd.
Tijd dus voor wat discussie lijkt me
Ik zal dan ook maar meteen met een eigen vraag van start gaan

Grootste probleem is het vinden van de juiste verhoudingen in performance tussen de verschillende onderdelen, en wat je de controller laat doen, en wat ZFS? Met andere woorden: hoeveel disks ga je opofferen voor welk onderdeel? De ZFS Best Practices Guide is hier niet echt een enorm grote hulp. Er staan wel wat pointers, maar je komt er niet erg ver mee.
Uiteindelijk zullen benchmarks moeten uitwijzen wat de beste combinatie is voor onze toepassing, tevens is het en mooie test om te zien of ZFS in de praktijk de kop boven water kan houden. Mijn hoop is dat anderen al een keer tegen dit soort dingen zijn aangelopen, zoniet dan hoop ik dat ik voldoende info kan verzamelen om meer inzicht te krijgen, en dat anderen daar weer wat van kunnen leren
Do diamonds shine on the dark side of the moon :?