ZFS thread staat ook in OM; is een alias gemaakt in NOS. Maar ik ben bezig de topicstart uit te breiden met extra info; dus dat komt wel goed.

Klopt, regelmatig scrubben dus

. Maar ik heb liever wat corrupte files dan een unrecoverable pool. Bij 4+ disks is RAID-10 de veiligste optie.
Als je pech hebt en tijdens het rebuilden van één mirror de overblijvende disk in die mirror het ook begeeft, is je hele pool naar de klote. Bij RAID6 / RAID-Z2 kun je twee willekeurige disk failures hebben zonder dat je data hoeft te verliezen. Dus ik zou een RAID6 / RAID-Z2 zeker als veiliger beschouwen als een mirror ofwel RAID10.
Voordeel van de mirror is zoals je al noemde het makkelijk uitbreiden met 2 schijfjes tegelijk en het feit dat je random IOps beter schaalt (zonder SSDs) en kortere rebuildtijden en minder CPU overhead. Maar voor thuisgebruikers is RAID-Z1/2 erg interessant.
Mja, wanneer kun je profiteren van de snelheid van sequential I/O? Bij het lezen en schrijven van grote bestanden of streaming media, met 1 client. Als de belasting iets complexer wordt (meerdere clients, andere usage, verlies je al je voordeel. Het gros van de I/O is random, dus kun je daar beter op voorbereid zijn als performance een van je eisen is: RAID-10 doet zowel sequential als random I/O goed, RAIDZ zal alleen goed presteren bij sequentiele I/O.
Ik moet zeggen dat ik niet heel veel ervaring heb met het hosten van VM's, maar ik zou dat zeker onder random I/O scharen.
Voor thuisgebruik is sequential I/O de belangrijkste spec; veel mensen slaan met name grote bestanden op. En bestanden van 1MB+ valt al onder sequential I/O. Voor die VMs doe je inderdaad vooral random reads en writes; daar heb je dan je SSDs voor.
Overigens interessant: in ZFS pool versie 31 heb je hybrid allocator; wat de metadata mirrort ipv in de parity RAID integreert. Dat is fijn omdat je hiermee random reads (zonder SSDs) al een stuk sneller maakt op RAID-Z1/2/3 zodra deze van metadata afhankelijk zijn. Bedenk bijvoorbeeld het zoeken op je RAID-Z waarbij je voornamelijk metadata opvraagt. Helaas nog niet beschikbaar in BSD platforms.
Yep, dat klopt. Wij gebruiken alleen SAS-disks voor onze ZFS-servers, met het OS op twee dedicated disks in RAID-1. Dergelijke beperkingen heb ik dus geen last van. Het trucje met FreeBSD kende ik niet, hoe verstandig is dat met het oog op eventuele problemen die je later in Solaris kunt krijgen, en het debuggen? Partities, labels, slices, etc? Heb je hier misschien een linkje over?
Trucje van in FreeBSD pool aanmaken met GEOM truc en dan in Solaris importeren zorgt ervoor dat je pool wordt aangemaakt met 'ashift=12' ipv 'ashift=9'; dat laatste betekent dat ZFS de disks behandelt als sectorsize 512-bytes; ashift=12 is geoptimaliseerd voor 4K sector disks. (2^12 = 4096 bytes)
Dat werkt zo:
1) je maakt onder FreeBSD een disk aan met GNOP met een andere sectorsize:
gnop create -S 4096 /dev/ada1
2) nu heb je een /dev/ada1.nop device; de .nop toevoeging is de schijf die een sectorsize van 4096 bytes heeft, dit kun je controleren met: diskinfo -v /dev/ada1.nop
3) nu maak je een pool aan:
zpool create tank raidz /dev/ada1.nop /dev/ada2 /dev/ada3 /dev/ada4
4) nu controleer je ashift=12 (vervang tank door de naam van de pool)
zdb -e tank | grep ashift
4) nu exporteer je de pool
zpool export tank
5) nu switch je naar Solaris en je pool zou prima moeten werken en geoptimaliseerd voor 4K disks
Onder Solaris heb je wel een aangepaste binary die alle pools als ashift=12 beschouwt; dit kan bestaande pools corrumperen en de hele pool vernietigen; dat is dus gewoon onveilig en moet je dus gewoon niet doen! De methode hierboven is 100% veilig. Aangezien Solaris niet correct GPT partities ondersteunt heb ik het alleen getest door geen partities te gebruiken; maar je zou eventueel goed-alignde MBR paritites (start offset 2048 sectors van 512-bytes = 1MiB) kunnen gebruiken.
Wat is goed? Ten opzichte van RAIDZ2 met 7 disks? Of ten opzichte van RAID-10 met 6 disks? Ik ben erg nieuwsgierig naar de onderliggende redenen, heb je daar meer info over?
Dit is een vrij technisch verhaal, maar here goes:
RAID-Z werkt heel apart; het is meer een RAID3 dan een RAID5. Traditioneel RAID5 heeft namelijk read-modify-write cycles die vaak bij random writes voorkomen; bij RAID-Z bestaan zulke cycles niet! Dat betekent wel dat
elke I/O request alle disks zal betrekken in de I/O - vandaar ook dat je bij RAID-Z maar de performance van een enkele disk hebt bij random I/O; heel anders dan RAID5 waarbij de random reads bijna zo hoog zijn als RAID0 en random writes juist veel lager dan een enkele disk door de read-modify-write cycles.
RAID-Z verspreidt de recordsize (128KiB) uit over alle data disks (totale disks minus parity) dus bij een 7x RAID-Z2 heb je een slechte configuratie voor 4K sector disks:
7-2 = 5 data disks en 128KiB / 5 = 25.6KiB wat een raar getal is; en dus soms 25.5KiB en soms 26.0KiB wordt afgerond door de 512-byte sectors. Beide zijn heel slecht voor 4K sector disks; vandaar dat je flink lagere performance krijgt.
Bij een 6-disk RAID-Z2 heb je 4 data disks en dus 128KiB / 4 = 32KiB wat een exacte breuk is en een veelvoud van 4KiB sectors; dat werkt dus perfect zonder problemen.
Deze 'beperking' geldt alleen voor RAID-Z en niet voor mirroring. Het komt er dus op neer dat je optimale configuraties wilt hebben bij RAID-Z1/2/3 en 4K sector schijven:
- 2 data disks: 3-disk RAID-Z of 4-disk RAID-Z2 of 5-disk RAID-Z3
- 4 data disks: 5-disk RAID-Z of 6-disk RAID-Z2 of 7-disk RAID-Z3
- 8 data disks: 9-disk RAID-Z of 10-disk RAID-Z2 of 11-disk RAID-Z3
Als je een sub-optimale configuratie gebruikt, is het truucje met ashift=12 zoals hierboven besproken een grote aanrader; anders kun je lage performance verwachten.
Juist bij VM's kan het verleidelijk zijn om te deduppen, omdat je veel dezelfde data zal hebben. Ik heb op onze ZFS-servers echter filesystems van een paar 100 GB gehad die dedup aan hadden staan. Het verwijderen daarvan kan letterlijk uren duren, omdat ZFS voor elk block dat het moet verwijderen moet bekijken of het nog in een andere dataset gebruikt worden. Ik kan je vertellen: een drukke fileserver vindt dit niet cool.
Had je wel genoeg RAM + L2ARC op de dataset? Die de-dup tables moeten namelijk in RAM+L2ARC passen; als de mechanische disks daarvoor moeten worden betrokken dan gaat het even snel als stront door een trechter. Maar in mijn geval kon ik toch vrij deftige performance halen; maar ik heb dan ook geen echt drukke VMs die veel random writes doen. Toch zou ik zeggen: probeer het nog eens met veel RAM én L2ARC; dan zou dedup met verify aan toch redelijk goed moeten werken. Wel is het zo dat je (zeker met verify) beter reads kunt doen dan writes/modifies.
De-dup op honderden gigabytes data is enorm zwaar en heb je serieus veel RAM + L2ARC voor nodig. L2ARC alleen heeft ook extra RAM nodig; dus reken op 64GiB RAM. Dan kom je dus in de buurt van een serieuze enterprise server en dat valt een beetje buiten de scope van deze thread/forum.
Ben wel mee eens dat de-dup voor thuisgebruikers eigenlijk niet interessant is.
Eén SSD voor zowel read als writecache vind ik sowieso een vrij vieze oplossing

. En je writecache wil je eigenlijk wel gemirrored hebben.
Hoezo vies? Het wordt afgeraden alleen omdat Solaris hier een hele belangrijke beperking heeft; Solaris kan op een SSD met meerdere partities (één voor L2ARC ander voor SLOG) geen FLUSH commando's sturen; die zijn cruciaal om de integriteit van je data te garanderen. Dus deze setup is alleen veilig onder FreeBSD die een heel mooi GEOM framework heeft die alle 'chains' in de GEOM-chain netjes de flush commando's kan doorsturen.
Mirroren klinkt leuk, maar SSDs zonder supercapacitors die stroom verliezen kunnen allebei tegelijk of stuk of corrupt raken. Dus dat is gewoon geen echte oplossing. Neem een Intel 320 als je SLOG wilt gebruiken dan heb je een VEILIGE SSD zonder risico van een corrupte pool.
De meest veilige oplossing is FreeBSD met één of meerdere Intel 320 SSDs voor zowel L2ARC als SLOG (en andere storage eventueel zoals je VMs/ZVOLs/iSCSI). De Intel 320 heeft én redundant NAND én supercapacitors; twee features die de Intel X25-M niet hebben. Met recht is dit dus dé SSD voor gebruik van SLOG. L2ARC is veel veiliger; corrupte data op je SSD wordt gedetecteerd en dan alsnog van HDD pool gelezen, dus daar geldt bovenstaand advies niet/minder voor.
28 is een prima versie waarmee je zowel met BSD, Nexenta als OpenIndiana uit de voeten kan, en weinig belangrijke features mist.
Enige leuke feature hierboven is de hybrid allocator (31 dacht ik) - maar volgens mij is ZFS v28 de laatste versie onder CDDL uitgebracht. Nu is het aan IllumOS en FreeBSD om ZFS verder te ontwikkelen. Zolang deze ontwikkelingen de on-disk data format niet veranderen blijft het volledig cross-compatible met Solaris.
Enige wat ik nog wel wil zien is block-pointer rewrite zodat je kunt defragmenteren en top-level vdevs kunt verwijderen en RAID-Z's kunt expanden/shrinken. Voor enterprise gebruikers niet zo heel belangrijk, maar voor sommige thuisgebruikers wel een obstakel om ZFS te gebruiken, helaas. Deze feature zal wel door Oracle moeten gebeuren ben ik bang; want daar zal zeker de on-disk data format voor verandert moeten worden.