Het is niet ZFS die FLUSH CACHE commando's uitschakelt; het is de hardware RAID controller. Die ontvangt dergelijke requests maar negeert ze gewoon, in elk geval in write-back modus. Vandaar dat de meeste controllers enkel write-back willen inschakelen als je een Battery Backup Unit (BBU) hebt om de eigen buffercache van de hardware RAID controller te beschermen. Zolang die buffer bij de hardeschijven terecht komt, is er weinig aan de hand. Alleen de buffercache van de hardeschijven gaat dan verloren.Panzy schreef op donderdag 19 december 2013 @ 19:38:
Bedankt voor de uitgebreide post weer, 1 ding snap ik alleen niet:
Kun je mij vertellen hoe ZFS kan weten dat het op een RAID array staat en daardoor commando's gaat uitschakelen? Mijn computer weet namelijk niet beter dan dat het gewoon een HDD is, wel knap dat ZFS daar omheen kan kijken.
Maar dat is wel een groot probleem. ZFS - inclusief alle 2e generatie filesystems zoals NTFS/Ext3/Ext4/UFS - bieden uitstekende bescherming tegen de harddisk write-back buffercache. De geheugenchip in hardeschijven dus die write-requests opspaart. Die ben je kwijt als de stroom uitvalt. Maar daar is een prima bescherming tegen gevonden. Traditioneel wordt daarvoor een journal gebruikt. Hierdoor kan de hardeschijf altijd zijn write-back verliezen zonder schade aan het filesystem zelf. Natuurlijk verlies je de meest recente wijzigingen, maar het filesystem zelf raakt niet corrupt. Bij 1e generatie filesystems is dat wel zo. Denk aan FAT bij Windows 95/98/ME waar je bij het opstarten vaak 'scandisk' kreeg en meer dan eens kon je recent aangeraakte bestanden vinden in de found.000 directory met een vage naam. Soms zelfs hele directories die verdwenen. 2e generatie filesystems hebben dat probleem verholpen door middel van journalling, soft updates en write barriers. In principe houdt dat in dat metadata en data gescheiden van elkaar wordt. Bovendien wordt daarbij een nieuw commando gebruikt: FLUSH BUFFER. Dit commando zegt tegen de hardeschijf dat hij zijn gehele DRAM buffer moet wegschrijven. Pas als dat gebeurd is, is het FLUSH-commando voltooid. Deze commando's worden gebruikt om te garanderen dat bepaalde matadata naar disk wordt geschreven vóórdat er nieuwe data wordt geschreven. Het garandeert in feite dat de volgorde van data en metadata writes niet verstoord raakt.
Een hardware RAID controller echter, kan zijn grote DRAM buffer van bijvoorbeeld 1 gigabyte nauwelijks gebruiken als het FLUSH-commando's zou gebruiken. De buffer zou dan met een halve megabyte gevuld zijn en dan een flush commando krijgen. Op die manier verlies je het voordeel van een dergelijk grote write-back. Dus de truc is dat de controller de FLUSH-commando's keihard negeert. ZFS weer daar niets van; die ziet gewoon een enkele SCSI-schijf. Dat de FLUSH-commando's niet bij de disks terecht komen, heeft ZFS geen weet van. ZFS ziet in dit geval de fysieke disks ook helemaal niet.
Gebruik je ZFS in combinatie met hardware RAID, dan bestaat het risico dat je hele pool corrupt raakt. Als dat gebeurt, kun je ook geen recovery meer plegen. In elk geval niet iets wat officiëel gesupport wordt; met het zdb-commando kun je met zeer specialistische kennis mogelijk wel je data recoveren, maar dat is onbetaalbaar en onpraktisch. Je kunt dan na een vage crash opeens zien dat je pool 'corrupted metadata' bevat en derhalve niet importeerbaar of toegankelijk is. Al je disks zijn online, je kunt verder niets doen. Kut!
ZFS kan in principe niet corrupt raken; ZFS is ontworpen om met write-back om te gaan zolang FLUSH CACHE commando's worden eerbiedigd. In het geval dat je echter een extra laag aanbrengt tussen ZFS en de fysieke disks - ofwel in software danwel in hardware - bestaat de mogelijkheid dat je ZFS pool toch corrupt raakt, zelfs al doen je hardeschijven prima hun werk.
Verder bestaat het risico dat Hardware RAID je disks uit de array gooit; bij passthrough of JBOD mode heb je geen arrays; of nouja arrays met één disk zeg maar. Maar die kan de controller wel onzichtbaar maken als er bad sectors optreden. Dit probleem heb ik concreet ervaren met Areca en er zijn meer van dit soort verhalen. Dit is een apart probleem van het probleem hierboven en kwam bij mijn Areca-controller voor in alle mogelijke configuraties: single-disk arrays, passthrough mode en JBOD mode (alle disks automatisch in passthrough). Bij bad sectors werden de disks onzichtbaar en kon ZFS er dus ook niets meer mee. Dat wil je ook niet. Bij het rebooten komen de disks weer terug; je data komt hierdoor niet in gevaar. Maar het is wel irritant.
Conclusie is dus dat Hardware RAID + ZFS een zeer slechte combinatie is. ZFS wilt zo dicht bij de disks zitten als mogelijk is. AHCI controller zoals je chipset Intel/AMD poorten zijn van de hoogste kwaliteit. De SAS-controllers van LSI zijn ook heel goed. Sommige hardware RAID controllers kun je in de juiste configuratie ook veilig met ZFS gebruiken. Ik durf hierbij geen zekerheid te bieden, maar ik vermoed dat 3ware en LSI het beter doen dan met name Highpoint en Areca. Ook kan de firmware veel verschil maken; mijn Areca is getest destijds met firmware versie 1.42 uit mijn hoofd.
Hopelijk heb ik je overtuigd nog eens na te denken. Het lijkt mij onverstandig om een route te kiezen waarvan je problemen kunt verwachten. ZFS kan veel hebben, maar sommige dingen dus niet. Dus kies daar dan ook niet voor zou ik zeggen en ga voor iets wat iedereen gebruikt; chipset SATA of LSI SAS controller. Dan weet je zeker dat het goed gaat werken en mag je er vanuit gaan dat je data niet corrupt raakt.
Succes