
Sel kevadel arutasime juba mĂ”ningaid sissejuhatavaid teemasid, nĂ€iteks ja . Teises neist lubasime isegi jĂ€tkata ZFS-s erinevate mitme ketta topoloogiate jĂ”udluse uurimist. See on jĂ€rgmise pĂ”lvkonna failisĂŒsteem, mida rakendatakse praegu laialdaselt, alates kuni .
Noh, tÀna on kÔige sobivam pÀev ZFS-iga tutvumiseks, uudishimulikkud lugejad. Lihtsalt teadke, et OpenZFS arendaja Matt Ahrens on tagasihoidlikult öelnud, et 'see on tÔeliselt keeruline'.
Kuid enne, kui jĂ”uame numbrite juurde â ja need tulevad, luban â ZFS-i kaheksakettilise konfiguratsiooni kĂ”ikide variantide osas, peame rÀÀkima sellest, kuidas kuidas ZFS tĂ”eliselt andmeid kettale salvestab.
Zpool, vdev ja seade

See diagramm sisaldab tĂ€ielikku puuli, kus on kolm abivahendit vdev'i, ĂŒks igast klassist, ja neli RAIDz2 jaoks

Tavaliselt pole pĂ”hjust luua puu, mis koosneb sobimatutest tĂŒĂŒpidest ja suurustest vdev'idest â aga kui soovite, ei takista teid miski selle tegemiselt
Kuna ZFS failisĂŒsteemi tĂ”eliselt mĂ”istmiseks peate hoolikalt vaatama selle tegelikku struktuuri. Esiteks, ZFS ĂŒhildab traditsioonilised mahtude ja failisĂŒsteemi halduse tasemed. Teiseks kasutab ta kirjutamise ajal koopiate tegemise tehingumehhanismi. Need omadused tĂ€hendab, et sĂŒsteem on struktuuriliselt vĂ€ga erinev tavalisest failisĂŒsteemist ja RAID-massiividest. Esimene pĂ”hiehituse elementide komplekt, mida mĂ”ista: see on salvestuspuu (zpool), virtuaalne seade (vdev) ja tegelik seade (seade).
zpool
Salvestuspuu zpool on ZFS-i kĂ”ige ĂŒlemine struktuur. Iga puu sisaldab ĂŒhte vĂ”i mitut virtuaalset seadet. See omakorda sisaldab ĂŒhte vĂ”i mitut tegelikku seadet (seade). Virtuaalsed puud on iseseisvad ĂŒksused. Ăks fĂŒĂŒsiline arvuti vĂ”ib sisaldada kahte vĂ”i enamat eraldi puud, kuid igaĂŒks neist on teistest tĂ€ielikult sĂ”ltumatu. Puid ei saa ĂŒhiselt kasutada virtuaalseid seadmeid.
ZFS-i ĂŒleliigusus asub virtuaalsete seadmete tasemel, mitte puude tasemel. Puu tasemel ei ole absoluutselt mingit ĂŒleliigsust â kui mĂ”ni vdev vĂ”i eelnevalt mÀÀratud vdev kaob, kaob koos sellega ka kogu puu.
Kaasaegsed salvestuspaigid vĂ”ivad taluda virtuaalse seadme vahemĂ€lu vĂ”i logi kaotust, kuigi nad vĂ”ivad kaduda vĂ€ikese hulga rĂ€paste andmete, kui nad kaotavad vdev logi voolukatkestuse vĂ”i sĂŒsteemirikkega.
On levinud vÀÀrarusaam, et ZFS andmepaarid (stripes) kirjutatakse kogu paiki. See ei ole tÔsi. Zpool ei ole lihtsalt lÔbus RAID0, see on pigem lÔbus. keerulise muutliku jaotamismehhanismiga.
Suur osa kirjutamist jagatakse kergesti saadavail virtuaalsetel seadmetel, lĂ€htudes olemasolevast vaba ruumist, nii et teoreetiliselt tĂ€idetakse need kĂ”ik samaaegselt. Uuemates ZFS versioonides arvestatakse jooksva kasutuse (utiliseerimise) vdev'i - kui ĂŒks virtuaalne seade on palju rohkem koormatud kui teine (nĂ€iteks lugemise koormuse tĂ”ttu), siis selle kirjutamise ajutiselt mööda minnakse, hoolimata kĂ”rgeimast vabast ruumist.
Kaasaegse ZFS kirjutamise jaotamismehhanismis sisseehitatud(utiliseerimise) seire vĂ”ib vĂ€hendada viivitust ja suurendada lĂ€bilaskevĂ”imet ebatavaliselt kĂ”rgete koormuste ajal - kuid see ei ole karantsi aeglaste HDD-de ja kiirete SSD-de tahtmatu segamise vastu ĂŒhes paigis. Selline ebaĂŒhtlane paigaldus töötab siiski kĂ”ige aeglasema seadme kiirusel, see tĂ€hendab, et see toimib nagu oleks see tĂ€ielikult koostatud sellistest seadmetest.
vdev
Iga salvestuspaik koosneb ĂŒhest vĂ”i mitmest virtuaalsest seadmest (virtual device, vdev). Iga vdev sisaldab omakorda ĂŒhte vĂ”i mitut fĂŒĂŒsilist seadet. Enamus virtuaalseid seadmeid kasutatakse andmete lihtsaks salvestamiseks, kuid on olemas ka mitmeid abklasse vdev'e, sealhulgas CACHE, LOG ja SPECIAL. Igal neist vdev'i tĂŒĂŒbist vĂ”ib olla ĂŒks viiest topoloogiast: ĂŒhte seadet (single-device), RAIDz1, RAIDz2, RAIDz3 vĂ”i peegel (mirror).
RAIDz1, RAIDz2 ja RAIDz3 on erilised variandid sellest, mida vanad nimetavad kahekordseks (diagonaalseks) pariteediks. 1, 2 ja 3 viitavad sellele, kui palju pariteetplokke on eraldatud iga andmete ribale. Erinevalt eraldiseisvatest kettadest, mis tagavad pariteedi, jaotavad RAIDz virtuaalsed seadmed pariteedi kettale ĂŒhtlaselt. RAIDz massiiv suudab kaotada nii palju kettasid, kui tal on pariteetplokke; kui ta kaotab veel ĂŒhe, lakkab ta olemast ja viib endaga kaasa salvestusalu.
Peegeldavatel virtuaalsetel seadmetel (mirror vdev) hoitakse iga plokk iga seadme peal vdev-is. Kuigi kĂ”ige levinumad on kaksikpeeglid (two-wide), vĂ”ib peeglis olla mis tahes arvu seadmeid - suurtes seadistustes, et suurendada lugemise jĂ”udlust ja talitlushĂ€irete vastupidavust, kasutatakse sageli kolmikpeegleid. Vdev peegeldus suudab taluda mis tahes rikkeid, seni kuni vĂ€hemalt ĂŒks seade vdev-is töötab.
Ăksikud vdev-id on oma olemuselt ohtlikud. Selline virtuaalne seade ei talunda ĂŒhtegi riket - ja kui seda kasutatakse salvestusala vĂ”i spetsiaalse vdev-i jaoks, toob tema rike kaasa kogu ala hĂ€vimise. Olge selle osas vĂ€ga, vĂ€ga ettevaatlik.
Virtuaalsed seadmed CACHE, LOG ja SPECIAL vĂ”ivad olla loodud mis tahes ĂŒlaltoodud topoloogiate pĂ”hjal - kuid pidage meeles, et virtuaalse seadme SPECIAL kaotamine tĂ€hendab kogu ala kaotamist, seetĂ”ttu on tungivalt soovitatav ĂŒleliigne topoloogia.
seade
See on tÔenÀoliselt kÔige lihtsam mÔistetav termin ZFS-is - see on sÔna-sÔnalt juhusliku juurdepÀÀsu blokiseade. Pidage meeles, et virtuaalsed seadmed koosnevad eraldi seadmetest ja ala on loodud virtuaalsetest seadmetest.
Kettad - magnetilised vÔi tahked - on kÔige levinumad blokiseadmestena, mida kasutatakse vdev-i ehitamiseks. Siiski sobib iga seade, millel on kirjeldus /dev-is - seega vÔib eraldi seadmetena kasutada ka terveid riistvara RAID-massiive.
Lihtne raw-fail on ĂŒks kĂ”ige olulisemaid alternatiivseid blokiseadmeid, millest vdev-i saab ehitada. Testimisalad  on vĂ€ga mugav viis kontrolida ala kĂ€ske ja nĂ€ha, kui palju ruumi on saadaval antud topoloogia ala vĂ”i virtuaalse seadme jaoks.

Saate luua testkasti hĂ”redatest failidest vaid mĂ”ne sekundiga â kuid Ă€rge unustage seejĂ€rel kustutada kogu kasti ja selle komponente.
Oletame, et soovite seadistada serveri kaheksa ketta peale ja plaanite kasutada 10 TB (~9300 GiB) kettaid â kuid te ei ole kindel, milline topoloogia vastab teie vajadustele kĂ”ige paremini. Ălaltoodud nĂ€ites loome testkasti hĂ”redatest failidest mĂ”ne sekundiga â ja nĂŒĂŒd teame, et kaheksa 10 TB kettaga RAIDz2 vdev tagab 50 TiB kasulikku mahtu.
Teine eriline seadme klasse on SPARE (varu). Soojavarustusseadmed, erinevalt tavapĂ€rastest seadmetest, kuuluvad kogu kasti, mitte ĂŒhele virtuaalsele seadmele. Kui mĂ”ni vdev kastis ebaĂ”nnestub ja varuseade on kasti ĂŒhendatud ja saadaval, liitub see automaatselt kahjustatud vdev'iga.
PĂ€rast kahjustatud vdev'iga ĂŒhendamist hakkab varuseade saama koopiaid vĂ”i andmete rekonstrueerimist, mis peaksid puuduvatel seadmetel olema. Traditsioonilises RAID-is nimetatakse seda taastamiseks (rebuilding) ja ZFS-is on see "ĂŒlemineku taastamine" (resilvering).
Oluline on mĂ€rkida, et varuseadmed ei asenda pĂŒsivalt rikutud seadmeid. Need on vaid ajutised asendajad, et vĂ€hendada aega, mille jooksul vdev degradeerub. PĂ€rast seda, kui administraator on asendanud riknenud seadme vdev'is, toimub taastamine uuele seadmele ja varu seade eraldatakse vdev'ist ning naaseb varuseadmest tööle kogu kasti jaoks.
Andmekogud, plokid ja sektorid
JĂ€rgmised alusloomaelemendid, mida meie ZFS-i teekonnal mĂ”ista, ei seondu nii palju riistvaraga, kui selle kohapealse andmete korralduse ja salvestamisega. Ăksikute tasemete loomine, nagu metaslab, jĂ€i meil selgelt mĂ”istmise huvides vahele.
Andmekogud (dataset)

Kui me esmakordselt loome andmekogu, kuvab see kogu saadaoleva kasti ruumi. SeejĂ€rel seadistame kvoodi â ja muudame mount-punkti. Imeline!

Zvol on enamasti lihtsalt andmekogu, millel puudub oma failisĂŒsteemi kiht, mida asendame siin tĂ€iesti tavapĂ€rase failisĂŒsteemiga ext4.
ZFS andmegrupp on enam-vĂ€hem sarnane tavalise monteeritud failisĂŒsteemiga. Nagu tavaline failisĂŒsteem, nĂ€eb see esmapilgul vĂ€lja nagu "ĂŒks tavaline kaust". Kuid nagu tavalistel monteeritud failisĂŒsteemidel, on igal ZFS andmegrupil oma pĂ”hivarade kogum.
Esiteks vÔib andmegrupile mÀÀrata kvoodi. Kui seadistate zfs set quota=100G poolname/datasetname, siis ei saa te kirjutada monteeritud kausta /poolname/datasetname rohkem kui 100 GiB.
Kas mĂ€rkate, et iga rea alguses on olemas ja puudub kaldkriips? Igal andmegrupil on oma koht nii ZFS hierarhias kui ka sĂŒsteemi monteerimise hierarhias. ZFS hierarhias ei ole esimest kaldkriipsu â alustate ankrust ning seejĂ€rel teeĂŒlesande andmegrupi juurde. NĂ€iteks, pool/vanem/laps andmegrupi kohta nimega laps vanema andmegrupi all vanem loovalt nimetatud ankrus pool.
Vaikimisi on andmegrupi monteerimispunkt ZFS hierarhias tema nimega ekvivalentne, alustades kaldkriipsust â ankur nimega pool monteeritakse kui /pool, andmegrupp vanem monteeritakse /pool/parent, ja alamandmegrupp laps monteeritakse /pool/parent/child. Siiski on vĂ”imalik muuta andmegrupi sĂŒsteemi monteerimispunkti.
Kui me mÀÀrame zfs set mountpoint=/lol pool/vanem/laps, siis andmegrupp pool/vanem/laps monteeritakse sĂŒsteemi kui /lol.
Lisaks andmegruppidele peame mainima ka mahtusid (zvols). Mahu struktuur on sarnane andmegrupile, vĂ€lja arvatud see, et seal ei ole tegelikult failisĂŒsteemi â see on lihtsalt plokiseade. NĂ€iteks saate luua zvol nimega mypool/myzvol, seejĂ€rel vormindada selle ext4 failisĂŒsteemiga ja siis monteerida see failisĂŒsteem â nĂŒĂŒd on teil ext4 failisĂŒsteem, kuid kĂ”igi ZFS turvafunktsioonide toetusega! See vĂ”ib tunduda mĂ”ttetu ĂŒhel arvutil, kuid omab palju rohkem tĂ€hendust iSCSI seadme eksportimise taustana.
Jaotusseadmed

Fail esindab ĂŒhte vĂ”i mitut plokki. Iga plokk salvestatakse ĂŒhel virtuaalses seadmel. Ploki suurus on tavaliselt kuues vÀÀrtuses recordsize, kuid vĂ”ib olla vĂ€hendatud kuni 2^ashift, kui see sisaldab metaandmeid vĂ”i vĂ€ikest faili.

Me tĂ”esti, tĂ”eliselt ei naljasta tohutu jĂ”udluse kaotuse ĂŒle, kui seada ashift liiga madalaks.
ZFS-i baselines salvestatakse kĂ”ik andmed, sealhulgas metaandmed plokkidesse. Iga andmestiku maksimaalne ploki suurus mÀÀratakse omaduses recordsize (salvestusvĂ€li). SalvestusvĂ€lja saab muuta, kuid see ei muuda ega asenda ĂŒhtegi plokki, mis on juba andmestikku kirjutatud - see kehtib ainult uute plokkide puhul nende kirjutamise ajal.
Kui pole mÀÀratud muud, on praegune salvestusvÀli vaikesuurus 128 KiB. See on omamoodi keeruline kompromiss, kus jÔudlus ei ole ideaalne, kuid pole ka kohutav enamikes olukordades. SalvestusvÀli saab seadistada vÀÀrtuseks vahemikus 4K kuni 1M (lisaseadetega recordsize saab seadistada ka suuremaks, kuid see on harva hea mÔte).
Iga plokk viitab ainult ĂŒhe faili andmetele - sa ei saa kahe erineva faili andmeid ĂŒhte plokki suruda. Iga fail koosneb ĂŒhest vĂ”i mitmest plokist, sĂ”ltuvalt suurusest. Kui faili suurus on vĂ€iksem kui salvestusvĂ€li, salvestatakse see vĂ€iksemas plokis - nĂ€iteks 2 KiB faili plokk hĂ”ivab ainult ĂŒhe 4 KiB sektori kettal.
Kui fail on piisavalt suur ja vajab mitmeid plokke, on kÔik salvestused, mis sisaldavad seda faili, suurusega recordsize - sealhulgas viimane salvestus, mille peamine osa vÔib olla .
Zvoli mahutitel ei ole omadust recordsize - selle asemel on neil ekvivalentne omadus volblocksize.
Sektorid
Viimane ja kĂ”ige pĂ”hjalikum ehitusplokk on sektor. See on vĂ€ikseim fĂŒĂŒsiline ĂŒksus, mida saab aluseks olevast seadmega kirjutada vĂ”i lugeda. AastakĂŒmneid on enamus ketastest kasutanud 512-baidiseid sektoreid. Viimasel ajal on enamus ketastest seadistatud 4 KiB sektoriteks, ja mĂ”nedes - eriti SSD-de puhul - 8 KiB sektoriteks vĂ”i isegi rohkem.
ZFS-sĂŒsteemis on omadus, mis vĂ”imaldab manuaalselt seadistada sektori suurust. See omadus ashift. Veidi segane on see, et ashift on 2 astme. NĂ€iteks, ashift=9 tĂ€hendab sektori suurust 2^9, ehk 512 baiti.
ZFS kĂŒsib operatsioonisĂŒsteemilt iga plokiseadmest ĂŒksikasjalikku teavet, kui see lisatakse uude vdev'i, ja teoreetiliselt seadistab ashifti automaatselt selle teabe pĂ”hjal. Kahjuks valetavad paljud kettad oma sektori suuruse kohta, et sĂ€ilitada ĂŒhilduvus Windows XP-ga (millel oli probleeme teiste sektori suurustega kettaste mĂ”istmisega).
See tÀhendab, et ZFS-i administraator peab teadma oma seadmete tegelikku sektori suurust ja seadistama selle kÀsitsi. ashift. Kui ashift on seadistatud liiga vÀikseks, suureneb lugemis-/kirjutamisoperatsioonide arv erakordsetes ulatustes. Nii tuleb 512-baidiseid "sektoore" kirjutada reaalsetesse 4 KiB-sektoritesse, mis tÀhendab, et esmalt tuleb kirjutada esimene "sektor", siis lugeda 4 KiB sektor, muuta see teise 512-baidise "sektoriga", kirjutada see tagasi uude 4 KiB-sektorisse ja nii edasi iga kirje puhul.
Tegelikus maailmas on selline trahv tuntav Samsung EVO tahkete ketaste puhul, mille jaoks peaks olema kehtiv ashift=13, kuid need SSD-d valetavad oma sektori suuruse kohta, seega on see seadistatud ashift=9. Kui kogenud sĂŒsteemiadministraator seda parameetrit ei muuda, siis töötab see SSD aeglase tavalise magnet HDD-ga.
VĂ”rdluseks, liiga suure suuruse korral ashift pole praktiliselt mingit trahvi. Tegelikku jĂ”udluse vĂ€henemist ei ole ning kasutamata ruumi suurenemine on ÀÀrmiselt vĂ€ike (vĂ”i null, kui tihendamine on sisse lĂŒlitatud). SeetĂ”ttu soovitame tungivalt isegi neile kettastele, mis tegelikult kasutavad 512-baidiseid sektoore, seadistada ashift=12 vĂ”i isegi ashift=13, et kindlalt tulevikku vaadata.
Omadus ashift seadetakse iga virtuaalse seadme vdev jaoks, mitte pooli, nagu paljud ekslikult arvavad - ja pĂ€rast seadistamist ei muutu. Kui sa kogemata seaded ĂŒmber ajasid ashift uue vdev'i lisamisel paiku, siis olete selle mahu madala jĂ”udlusega seadmega pöördumatult saastanud ja tavaliselt pole muud lahendust, kui purustada maht ja alustada kĂ”ik otsast. Isegi vdev'i eemaldamine ei pÀÀsta vale seadistuse eest. ashift!
Kopeerimise mehhanism kirjutamisel

Kui tavaline failisĂŒsteem peab andmeid uuesti kirjutama, muudab ta iga ploki seal, kus see asub.

FailisĂŒsteem, kus toimub kirjutamise kĂ€igus kopeerimine, salvestab uue ploki versiooni ja seejĂ€rel vabastab vana versiooni.

Ăldiselt, kui ignoreerida plokkide reaalsest fĂŒĂŒsilisest asukohast, lihtsustub meie "andmete komeet" "andmeussiks", mis liigub vasakult paremale saadaval oleva ruumi kaartidel.

NĂŒĂŒd saame hĂ€sti aru, kuidas kirjutamise kĂ€igus kopeerimise snĂ€ppshotid töötavad â iga plokk vĂ”ib kuuluda mitmele snĂ€ppshotile ja jÀÀb alles seni, kuni kĂ”ik seotud snĂ€ppshotid on hĂ€vitatud.
Kirjutamise kĂ€igus kopeerimise mehhanism (Copy on Write, CoW) on ZFS-i unikaalse sĂŒsteemi aluseks. PĂ”hikontseptsioon on lihtne â kui palute traditsiooniliselt failisĂŒsteemil faili muuta, teeb ta nĂ”utud. Kui aga palute kirjutamise kĂ€igus kopeerimise failisĂŒsteemil sama teha, ĂŒtleb ta "okei" â kuid petab teid.
Selle asemel kirjutab kirjutamise kĂ€igus kopeerimise failisĂŒsteem uue versiooni muudetud plokist ja seejĂ€rel uuendab faili metaandmeid, et katkestada side vana plokiga ja siduda sellega uus plokk, mille just salvestasite.
Vana ploki eraldamine ja uue sidumine toimub ĂŒhes operatsioonis, seega ei saa seda katkestada â kui lĂŒlitate pĂ€rast selle toimumist vĂ€lja, on teil uus faili versioon, kuid kui lĂŒlitate varem vĂ€lja, on teil vana versioon. Igatahes ei teki failisĂŒsteemi konfliktide.
Kirjutamise kĂ€igus kopeerimine ZFS-is toimub mitte ainult failisĂŒsteemi tasandil, vaid ka ketaste halduse tasemel. See tĂ€hendab, et ZFS ei ole vastuvĂ”tlik kirjutamise tĂŒhikule () â nĂ€htusele, kus riba on salvestatud ainult osaliselt enne sĂŒsteemi tĂ”rget, mis kahjustab massiivi pĂ€rast taaskĂ€ivitamist. Siin kirjutatakse riba aatomaarseks, vdev on alati jĂ€rjepidev, ja .
ZIL: ZFS-i kavatsuste ĆŸurnal.

ZFS sĂŒsteem kĂ€sitleb sĂŒnkroonseid kirjeid eriliselt â see salvestab need ajutiselt, kuid koheselt ZIL-i, enne kui salvestab need hiljem pĂŒsivalt koos asĂŒnkroonsete kirjetega.

Tavaliselt ei loeta ZIL-i salvestatud andmeid enam kunagi. Kuid pĂ€rast sĂŒsteemi tĂ”rget on see vĂ”imalik.

SLOG, vÔi sekundaarne LOG-seade, on lihtsalt eriline - ja eelistatavalt vÀga kiire - vdev, kus ZIL vÔib olla eraldi peamisest salvestusruumist.

PÀrast viga taastatakse kÔik mÀÀrdunud andmed ZIL-is - antud juhul asub ZIL SLOG-is, seega taastatakse need just sealt.
On olemas kaks peamist kirjutamistoimingu kategooriat - sĂŒnkroonsed (sync) ja asĂŒnkroonsed (async). Enamikus töökoormustes on absoluutne enamik kirjutamistoimingutest asĂŒnkroonsed - failisĂŒsteem vĂ”imaldab neid koondada ja edastada partiitena, vĂ€hendades fragmenteerimist ja suurendades oluliselt lĂ€bilaskevĂ”imet.
SĂŒnkroonsed kirjutamised on tĂ€iesti teistsugune asi. Kui rakendus kĂŒsib sĂŒnkroonset kirjutamist, ĂŒtleb see failisĂŒsteemile: "Sa pead selle salvestama energiat mittekaotavasse mĂ€llu, right now, ja kuni selle ajani ei saa ma midagi muud teha." Seega peavad sĂŒnkroonsed kirjutamised olema kohe ketta peale salvestatud - ja kui see suurendab fragmenteerimist vĂ”i vĂ€hendab lĂ€bilaskevĂ”imet, siis olgu nii.
ZFS kĂ€sitleb sĂŒnkroonseid kirjutamisi teistmoodi kui tavalised failisĂŒsteemid - selle asemel, et kohe neid tavalisse salvestusse laadida, salvestab ZFS need spetsiaalsesse salvestusala, mida nimetatakse ZFS-i kavatsuste logiks - ZFS Intent Log, vĂ”i ZIL. Kiirus on selles, et need kirjutised samuti jÀÀvad mĂ€llu, kui need on koondatud koos tavaliste asĂŒnkroonsete kirjutamisvĂ”imetega, et hiljem neid salvestada nagu tĂ€iesti normaalsed TXG (tehingugrupid, Transaction Groups).
Normaalses töös on ZIL salvestatud ja ei loeta enam kunagi. Kui mÔne hetke pÀrast ZIL-i kirjutised salvestatakse pÔhiseadmesse tavalisetes TXG-des mÀlust, eraldatakse need ZIL-ist. Ainus hetk, mil midagi ZIL-ist loetakse, on siis, kui importitakse aed.
Kui ZFS-l on tĂ”rge - operatsioonisĂŒsteemi tĂ”rge vĂ”i toite lĂ”ppemine - kui ZIL-is on andmeid, loetakse need andmed jĂ€rgmise aeda importimise ajal (nĂ€iteks avariiseadmest taaskĂ€ivitamisel). KĂ”ik, mis on ZIL-is, loetakse, koondatakse TXG-deks, salvestatakse pĂ”hiseadmesse ja seejĂ€rel eraldatakse ZIL-ist importimise kĂ€igus.
Ăks vdev abiklassidest on LOG vĂ”i SLOG, sekundaarne LOG seade. Selle ainus ĂŒlesanne on tagada basseinile eraldi ja eelistatult palju kiirema, vĂ€ga kĂ”rge kirjutamisvastupidavusega vdev seade ZIL-i salvestamiseks, selle asemel, et salvestada ZIL pĂ”hivdev-i peamisse salvestusse. Isegi ZIL kĂ€itub sĂ”ltumata salvestus kohast ĂŒhtemoodi, kuid kui LOG-iga vdev-l on vĂ€ga kĂ”rge kirjutamiskiirus, siis sĂŒnkroonsed kirjutamised toimuvad kiiremini.
LOG-iga vdev lisamine basseini ei paranda ei suuda asĂŒnkroonsete kirjutamiste jĂ”udlust - isegi kui sunnid kĂ”iki kirjutamisi ZIL-i kaudu zfs set sync=always, need on ikkagi seotud pĂ”hiseadmest TXG-ga samamoodi ja samas tempos nagu ilma pĂ€evikuta. Ainus otsene jĂ”udluse parendamine on sĂŒnkroonsest kirjutamisest tulenev viivitus (kuna pĂ€eviku suurem kiirus kiirendab operatsioonide tĂ€itmist. sync).
Kuid keskkonnas, mis juba nĂ”uab suurt hulka sĂŒnkroonseid kirjutamisi, vĂ”ib vdev LOG kaudselt kiirendada asĂŒnkroonset kirjutamist ja vahemĂ€luta lugemist. ZIL-i kirjutiste laadimine eraldi vdev LOG-i tĂ€hendab vĂ€hem konkurentsi IOPS-i nimel pĂ”hiseadmes, mis omakorda suurendab kĂ”ikide lugemise ja kirjutamise operatsioonide jĂ”udlust.
Snapshoot'id
Kirjutamise ajal kopeerimise mehhanism on samuti vajalik alus ZFS-i aatomiliste hetkeseisude ja inkrementaalse asĂŒnkroonse replikatsiooni jaoks. Aktiivses failisĂŒsteemis on punktiiride puu, mis mĂ€rgib kĂ”ik kirjutised praeguste andmete osas - kui teete hetktĂ”mmise, teete lihtsalt koopia sellest punktiiride puust.
Kui aktiivses failisĂŒsteemis kirjutatakse mingi kirjutis ĂŒle, salvestab ZFS esmalt uue versiooni plokist kasutamata ruumi. SeejĂ€rel eemaldab vana ploki versiooni praegusest failisĂŒsteemist. Kuid kui mĂ”ni hetktĂ”mmis viitab vanale plokile, jÀÀb see siiski muutumatuks. Vana plokk ei taastata tegelikult vabaks ruumiks, kuni kĂ”ik sellele plokile viitavad hetktĂ”mmised ei hĂ€vitata!
Replikatsioon

Minu Steam'i raamatukogu 2015. aastal oli 158 GiB ja see sisaldas 126 927 faili. See on ĂŒsna lĂ€hedal optimaalsele olukorrale rsync jaoks - ZFS-i replikatsioon ĂŒle vĂ”rgu oli "vaid" 750% kiiremini.

Samas vÔrgu sees Windows 7 virtuaalmasina 40-gigabaidise pildifaili replikatsioon on tÀiesti teine lugu. ZFS replikatsioon toimub 289 korda kiiremini kui rsync, vÔi "ainult" 161 korda kiiremini, kui teate, kuidas rsync'i kÀivitada koos vÔtmega --inplace.

Kui virtuaalmasina pilt ulatub, siis probleemid rsync'iga ulatuvad koos sellega. 1,9 TiB suurus ei ole tĂ€napĂ€eva virtuaalmasina pildi jaoks nii suur â ent see on piisavalt suur, et ZFS replikatsioon osutuks 1148 korda kiiremini kui rsync, isegi kui kasutada rsync'i argumenti --inplace.
Kuna te mÔistate, kuidas töödeldakse snapshots'e, pole raske tabada replikatsiooni olemust. Kuna snapshot on lihtsalt viidete puu mÀrgete, tÀhendab see, et kui me teeme zfs send snapshot'i, edastame me nii selle puu, kui kÔik seotud mÀrkmed. Kui me edastame selle zfs send ja zfs receive sihtkohta, salvestab see nii tegeliku ploki sisu kui ka viidete puu, mis viitab plokkidele, sihtkohta andmete kogusse.
Asjad muutuvad veelgi huvitavamaks teisel zfs send. NĂŒĂŒd on meil kaks sĂŒsteemi, millest igal on poolname/datasetname@1, ja vĂ”tate uue snapshot'i poolname/datasetname@2. Seega on teie algses puulis datasetname@1 ja datasetname@2, ja sihtpuulis on praegu alles esimene snapshot. datasetname@1.
Kuna allika ja sihtkoha vahel on meil ĂŒhine snapshot datasetname@1, saame teha inkrementaalse zfs send selle peal. Kui me rÀÀgime sĂŒsteemile zfs send -i poolname/datasetname@1 poolname/datasetname@2, siis vĂ”rdleb see kahte viidete puud. KĂ”ik viidatud, mis eksisteerivad ainult @2, viitavad ilmselgelt uutele plokkidele - seega vajame nende plokkide sisu.
Kaug-sĂŒsteemis on inkrementaalne töötlemine sama lihtne. Esmalt salvestame kĂ”ik uued mĂ€rkmed, mis on voolus, ja seejĂ€rel lisame viidatud need plokkidele. VoilĂ , meil on send uues sĂŒsteemis! sendAsĂŒnkroonne inkrementaalne ZFS replikatsioon on tohutu parandamine vĂ”rreldes varasemate mitte-snapshot meetoditega, nagu rsync. MĂ”lemal juhul edastatakse ainult muudetud andmed - kuid rsync peab esmalt @2 kĂ”ik andmed mĂ”lemalt poolt kettalt lugema, et kontrollida summeerimist ja vĂ”rrelda seda. Selle vastu, ZFS replikatsioon ei loe midagi, vĂ€lja arvatud viidete puud - ja kĂ”ik plokid, mis ei ole esindatud ĂŒhises snapshot'is.
AsĂŒnkroonne inkrementaalne replikatsioon ZFS on tohutu tĂ€iustus varasemate, snapshot'e mitte kasutavate meetodite, nĂ€iteks rsync, suhtes. MĂ”lemal juhul edastatakse ainult muutunud andmed - kuid rsync peab esmalt lugeda kĂ”ik andmed kettalt mĂ”lemal poolel lugema, et kontrollida summat ja vĂ”rrelda seda. Erinevalt sellest ei loe ZFS replikatsioon midagi muud kui viidete puid - ja kĂ”ik plokid, mis ei ole esindatud ĂŒhises snapshot'is.
Sisseehitus
Kirjutamise kopeerimismehanism lihtsustab samuti sisseehitatud kompressioonisĂŒsteemi. Traditsioonilises failisĂŒsteemis on kompressioon probleemne â nii vana kui ka uus muudetud versioon andmetest asuvad samas ruumis.
Kui me vaatame andmefragmenti faili keskosas, mis alustab oma elu megabaidiga nullidest 0x00000000 ja edasi â on seda vĂ€ga lihtne kokku suruda ĂŒhe sekundi suurusesse. Kuid mis juhtub, kui asendame selle megabaidi nullidega megabaidi mittekompressitavate andmetega, nĂ€iteks JPEG vĂ”i pseudo-juhusliku mĂŒra? ĂhtĂ€kki vajab see megabaidi andmete jaoks mitte ĂŒhte, vaid 256 sektori suurust 4 KiB, ja sellel kohal on kettal reserveeritud vaid ĂŒks sektor.
ZFS-l pole sellist probleemi, kuna muudetud kirjad kirjutatakse alati kasutamata ruumi â algne plokk hĂ”ivab vaid ĂŒhe 4 KiB sektori, kuid uus kirje vĂ”tab 256, kuid see pole probleem â hiljuti muudetud fragment "faili keskelt" kirjutataks kasutamata ruumi, sĂ”ltumata sellest, kas selle suurus muutus vĂ”i mitte, seega on ZFS jaoks see tĂ€iesti tavapĂ€rane olukord.
ZFS sisseehitatud kompressioon on vaikimisi keelatud ja sĂŒsteem pakub ĂŒhendatavaid algoritme â praegu on nende hulgas LZ4, gzip (1-9), LZJB ja ZLE.
- LZ4 â see on vooluhulga algoritm, mis pakub ÀÀrmiselt kiiret kompressiooni ja dekompressiooni ning jĂ”udluse kasvu enamikus kasutusjuhtudes â isegi ĂŒsna aeglastel CPU-del.
- GZIP â austatud algoritm, mida tunnevad ja armastavad kĂ”ik Unix-sĂŒsteemide kasutajad. Seda saab kasutada kompressioonitasemete 1-9 juures, kompressioonitaseme suurenemise ja CPU kasutamise kasvu tĂ”ttu, kui lĂ€henduda tasemele 9. Algoritm sobib hĂ€sti kĂ”ikide tekstiliste (vĂ”i muude ÀÀrmiselt kompressitavate) kasutusjuhtude jaoks, kuid vastasel korral tekitab see sageli probleeme CPU-ga â kasutage seda ettevaatlikult, eriti kĂ”rgematel tasemetel.
- LZJB â originaalalgoritm ZFS-is. See on vananenud ja ei tohiks enam kasutada, LZ4 ĂŒletab selle igas mÔÔtmes.
- ZLE â null-taseme kodeerimine, Zero Level Encoding. See ei muuda normaalseid andmeid, vaid pigem tihendab suurte nullide jĂ€rjestusi. See on kasulik tĂ€iesti tihendamatute andmestike jaoks (nt JPEG, MP4 vĂ”i muude juba tihendatud formaatide jaoks), kuna see ignoreerib tihendamatu sisu, kuid tihendab kasutamata ruumi lĂ”plikest kirjetest.
Soovitatav on LZ4 tihendamine praktiliselt kĂ”igi kasutusjuhtumite puhul; jĂ”udluse kokkupuude tihendamatute andmetega on vĂ€ga vĂ€ike ja kasv tĂŒĂŒpiliste andmete jaoks on see mĂ€rkimisvÀÀrne. Virtuaalse masina pildi kopeerimine uue Windowsi operatsioonisĂŒsteemi installeerimise jaoks (vĂ€rskelt installitud OS, andmeid sees ei ole) compression=lz4 oli 27% kiirem kui compression=none, in .
ARC - adaptiivne asenduskate
ZFS on ainus kaasaegne failisĂŒsteem, millest me teame, mis kasutab oma lugemiskĂ€itlemise mehhanismi, mitte ei tugi operatsioonisĂŒsteemi lehtede vahemikule, et hoida hiljuti loetud blokke RAM-is.
Kuigi sellel omal vahemĂ€lu ei ole oma probleemid - ZFS ei saa reageerida uusi mĂ€lu eraldamise pĂ€ringuid nii kiiresti kui kernel, seega uus mĂ€lu eraldamise kutse vĂ”ib ebaĂ”nnestuda, kui see vajab RAM-i, mille ARC praegu kasutab. Kuid on kaalukaid pĂ”hjuseid kasutada oma vahemĂ€lu, vĂ€hemalt praegu. malloc() KĂ”ik tuntud kaasaegsed operatsioonisĂŒsteemid, sealhulgas MacOS, Windows, Linux ja BSD, kasutavad lehtede vahemĂ€lu rakendamiseks LRU (Mitte Hiljuti Kasutatud) algoritmi. See on primitiivne algoritm, mis tĂ”stab vahemĂ€llu talletatud bloki "jĂ€rjekorra tippu" pĂ€rast igat lugemist ja eemaldab bloki "jĂ€rjekorrast alla", et vajadusel lisada uusi vahemĂ€lu puuduolekuid (bloke, mis oleks pidanud lugema kettalt, mitte vahemĂ€lust) tippu.
Tavaliselt töötab algoritm hĂ€sti, kuid suurte tööandmete kogumitega sĂŒsteemides viib LRU kergesti trashingu - sageli vajalike blokide eemaldamiseni, et vabastada ruumi blokeeringutele, mis ei loeta kunagi enam vahemĂ€lust.
ARC
 â oluliselt vĂ€hem naivne algoritm, mida vĂ”ib kĂ€sitleda kui "kaalutud" vahemĂ€lu. Iga kord, kui vahemĂ€lust loetakse plokk, muutub see veidi "raskemaks" ja on keerulisem kĂ”rvaldada â ning isegi pĂ€rast eemaldamist plokk jĂ€lgitakse teatud aja jooksul. Plokk, mis on kĂ”rvaldatud, kuid peab seejĂ€rel taas loetakse vahemĂ€lusse, muutub samuti "raskemaks".
KĂ”ikide nende tegevuste lĂ”pptulemus on vahemĂ€lu, millel on palju suurem kĂ€tte saamise koefitsient (hit ratio) â suhe vahemĂ€lus toimuva lugemise (vahemĂ€lust lugemine) ja puude (lugemine kettalt) vahel. See on ÀÀrmiselt oluline statistika â mitte ainult see, et vahemĂ€lu hitid teenindatakse kordades kiiremini, vaid ka vahemĂ€lu puudud saavad samuti kiiremini teenindatud, kuna mida rohkem on vahemĂ€lu hiti, seda vĂ€hem on paralleelseid pĂ€ringuid kettale ja seda vĂ€hem on viivitusi nende jÀÀkpuudude teenindamisel, mis peavad olema teenindatud kettalt.
KokkuvÔte
PĂ€rast ZFS pĂ”hisemantika uurimist â kuidas toimib kirjutamisprotsess ning suhete uurimist salvestusreservide, virtuaalsete seadmete, plokkide, sektorite ja failide vahel â oleme valmis arutama tegelikku jĂ”udlust koos tegelike numbritega.
JÀrgmisel osal vaatame vÔrreldavat tegelikku jÔudlust peegeldava vdev ja RAIDz vahel, samuti traditsiooniliste Linuxi tuuma RAID-topoloogiate vahel, mida oleme uurinud. .
Alguses soovisime vaadelda ainult pĂ”hiteemasid â ZFS topoloogiaid endid â kuid pĂ€rast nii oleme valmis rÀÀkima keerukamatest seadistustest ja ZFS hÀÀlestusest, sealhulgas abistavate vdev tĂŒĂŒpide, nagu L2ARC, SLOG ja Special Allocation, kasutamisest.
Allikas: habr.com
