Skrivet av tomle:
Det förutsätter att man kör speglat. Kör du raidz1 eller raidz2 t.ex. så finns inte filen på någon annan disk och då är man rökt.
Håller dock med om att det är osannolikt med reverse-checksum. Dock så kan man ju fortfarande råka ut för att man skriver ner filen fel vilken kan fortplanta sig vid scrub.
Nu när vi går in i såpass detalj tycker jag det är viktigt att påpeka att vi talar om block inte filer. På en mirror finns det ett syster-block till varje block, på ett raid-z1 / raid-z2 system finns det datablock för varje disk minus 1 eller 2 beroende på raidz nivå.
Checksummorna i ZFS är lagrade i ett Merkle träd (checksumman för ett block är lagrat i pekaren till blocket). Blocken sprids ut över de tillgängliga diskarna och är av variabel storlek. Om man har ett raid-z1 system med fyra diskar så blir tre logiska-datablock till tre datablock på disk + 1 paritetsblock.
Vid varje läsning av ett block kollas pariteten. Om paritetsinformationen blir ändrad pga. att den hamnade i "dålig ram" så kommer kommer checksumman inte stämma. ZFS vet inte var felet ligger utan läser de övriga blocken från de andra diskarna och kollar om dessa ger rätt checksum. Hamnar samtliga av dessa block i dålig ram så blir det omöjligt att reparera det "felaktiga" blocket. Dock försöker ZFS läsa data som ändras om igen och igen om det då stämmer så går det vidare.
Felen fortplantar sig inte via en scrub, de upptäcks och kan felaktigt rättas pga. fel i ram. Om det uppkommer nya fel så är det för att det sker fler fel i ram, inte för att ZFS felaktigt rättade tidigare. Scrub lämnar alltid det den jobbat på 100% intakt. Felen fortplantar sig inte genom scrub, de kommer alla från felaktig ram.
Skrivet av tomle:
Din fil A är säkert lagrad precis som ovan. Du drar sedan igång din weekly scrub. Fil A läses in i minnet men checksumman läses in i den del av RAM som innehåller fel. Helt plötsligt stämmer inte filinnehållet överens med checksumman (eftersom checksumman är fel pga RAM). ZFS räknar ut vad som skulle finnas i filen egentligen baserat på checksumman och sparar ner till disk. Nu är fil A korrupt.
Skillnaden med ZFS är alltså att den verifierar dina filers integritet och det är i detta skede som du kan sabba din data. Med andra filsystem så skulle detta inte hända eftersom de inte har samma funktion för att periodiskt "scrubba".
Med andra ord kan det tyvärr vara så illa att varje gång ZFS rapporterar att den har rättat ett fel så har det istället skapat ett.
Risken finns at man använder skadad paritet för att reparera ett fel, men risken är också låg att man får fel på en hel stripe av block och således förlorar data. Det gäller inte som du påstår ovan att ZFS plötsligt rättar till det felaktiga blocket, med dålig data och man får en kaskadeffekt över hela poolen.
Med en enkel
kan man till och med se vilka filer som hade block som ZFS inte kunde läsa (mer data än du hade redundans för förstördes av ram).
Skrivet av tomle:
Paritetsdata(=checksums). Det säger sig självt att om du ska spara varje fil två gånger så behöver du 2x lagringsytan, dvs spegling.
Nej, du kan Det handlar inte om filer utan block. Tre av fyra diskar i raid-z1 räcker för att ge alla filer tillbaka. (Den fjärde disken var den som hade en ckecksum som hamnade i i dålig ram.)
Skrivet av tomle:
Om checksumman är fel pga dåligt RAM (vilket väl var vad vi diskuterade) så kan inte ZFS återskapa datat.
Jo, en tvåvägsmirror och Raid-z1 klarar ett fel. Raid-z2 klarar två fel osv. Grejen med minnesfel av den typen vi diskuterar är att de uppenbarar sig som diskfel som egentligen inte existerar. För att ZFS inte ska kunna returnera data så måste samma block på samtliga diskar hamna på ett ställe i ram som har en bit satt till ett värde som inte motsvaras av datat.
Om man har kör utan ECC och har errors under en scrub borde man alltid undersöka RAM först. Det är knappas kosmisk strålning som orsakar många flippade bits utan hårdvarufel.
Att ZFS på en enda disk utan några kopior av data fortfarande kan läsa filsystemet efter att upp till 1/8 av disken är överskriven är bara det en god anledning att köra ZFS. Visst, man kan ha förlorat data, men metadatablocken är såpass utspridda på disken att man fortfarande kan traversera filsystemet och få indikation på vilka filer som inte går att läsa. En 4TB disk med NTFS är en tidsbomb, ni tror väl inte att ReFS utvecklades bara för at det var kul?
Jag föredrar att få en indikation på att data kan vara utsatt i motsättning till att inte veta om det.