
Sel kevadel oleme juba arutanud mitmeid algteemasid, nagu nĂ€iteks ja . Teises osas lubasime jĂ€tkata arutelusid ZFS erinevate mitme ketta topoloogiate jĂ”udluse ĂŒle. See on jĂ€rgmise pĂ”lvkonna failisĂŒsteem, mida rakendatakse praegu igal pool: alates kuni .
Noh, tÀna on meeste ja naiste Ôige pÀev ZFS-iga tutvumiseks, uudishimu tekitavad lugejad. Lihtsalt teadke, et OpenZFS arendaja Matt Ahrens'i tagasihoidlikul hinnangul "see on tÔeliselt keeruline".
Enne kui jĂ”uame numbriteni - ja need tulevad, luban - kĂ”ikide ZFS kaheksa ketta konfigureerimise vĂ”imaluste osas, peame rÀÀkima sellest, kuidas ZFS ĂŒldiselt andmeid kettal salvestab.
Zpool, vdev ja seade

See diagramm tĂ€ispunktide kogumist sisaldab kolme abivahendit vdev-i, ĂŒhe igast klassist ja neli RAIDz2 jaoks

Tavaliselt pole pĂ”hjust luua kogumit erinevat tĂŒĂŒpi ja suurusega vdevidest - kuid kui soovite, ei takista teid see kindlasti.
ZFS failisĂŒsteemi tĂ”eliseks mĂ”istmiseks tuleb tĂ€helepanelikult vaadata selle tegelikku struktuuri. Esiteks ĂŒhendab ZFS traditsioonilise mahuhalduse ja failisĂŒsteemide tasemed. Teiseks kasutab see kirjutamise ajal koopia loomise tehingu mehhanismi. Need omadused tĂ€hendavad, et sĂŒsteem on struktuuri poolest vĂ€ga erinev tavalistest failisĂŒsteemidest ja RAID-massiividest. Esimene mĂ”istmise pĂ”hielement on salvestuspank (zpool), virtuaalne seade (vdev) ja reaalne seade (device).
zpool
Salvestuspank zpool on ZFS kĂ”ige ĂŒlemine struktuur. Iga pank sisaldab ĂŒhte vĂ”i mitut virtuaalset seadet. Omakorda sisaldab igaĂŒks neist ĂŒhte vĂ”i mitut reaalset seadet (device). Virtuaalsed pangad on iseseisvad plokid. Ăks fĂŒĂŒsiline arvuti vĂ”ib sisaldada kahte vĂ”i enamat eraldi panka, kuid igaĂŒhel on tĂ€ielik sĂ”ltumatus teistest. Pangad ei saa jagada virtuaalseid seadmeid.
ZFS-i ĂŒlekandmine toimub virtuaalsete seadmete tasandil, mitte reservuaaride tasandil. Reservuaaride tasandil ei ole mingit ĂŒlekandsĂŒsteemi - kui mĂ”ni vdev vĂ”i erivdev kaob, kaob koos sellega kogu reservuaar.
Kaasaegsed salvestusreservuaarid suudavad taluda virtuaalse seadme vahemĂ€lu vĂ”i ĆŸurnali kaotust - kuigi nad vĂ”ivad kaotada vĂ€ikese hulga rikutud andmeid, kui nad kaotavad vdevi ĆŸurnali voolukatkestuse vĂ”i sĂŒsteemi rikke ajal.
On levinud vÀÀrarusaam, et ZFS-i "andmeriidud" (stripe'id) salvestatakse kogu reservuaari ulatuses. See ei ole tÔsi. Zpool ei ole sugugi naljakas RAID0, vaid pigem naljakas keerulise ja muutuva jaotamismechanismiga.
Peamiselt jaotatakse salvestused saadavalolevate virtuaalsete seadmete vahel olemasoleva vaba ruumi alusel, nii et seeoretiseeritult tĂ€idavad need kĂ”ik korraga. Uuemates ZFS versioonides arvestatakse praegust kasutust (utiliseerimist) vdev'i puhul â kui ĂŒks virtuaalne seade on oluliselt koormatum kui teine (nĂ€iteks lugemise koormuse tĂ”ttu), jĂ€etakse selle kirjutamiseks vahepeal kĂ”rvale, hoolimata kĂ”rgeimast vabade ruumide osakaalust.
Utiliseerimise mÀÀramise mehhanism, mis on integreeritud kaasaegsetesse ZFS salvestusmeetoditesse, vĂ”ib vĂ€hendada viivitust ja suurendada lĂ€bilaskevĂ”imet ebatavaliselt kĂ”rgete koormuste perioodidel â kuid see ei blankett kui juhuslik segu aeglastest HDD-dest ja kiiretest SSD-dest ĂŒhes soos. Selline ebaĂŒhtlane soe töötab siiski aeglaseima seadme kiirusel, nagu oleks see tĂ€ielikult koos sellistest seadmetest.
vdev
Iga salvestuspools koosneb ĂŒhest vĂ”i mitmest virtuaalsest seadmest (virtual device, vdev). Iga vdev omakorda sisaldab ĂŒhte vĂ”i mitut fĂŒĂŒsilist seadet. Enamik virtuaalseid seadmeid kasutatakse andmete lihtsaks salvestamiseks, kuid on olemas ka mitmeid abiklasse vdev, sealhulgas CACHE, LOG ja SPECIAL. Igal neist vdev-i tĂŒĂŒpide puhul vĂ”ib olla ĂŒks viiest topoloogiast: ĂŒhes seadmest (single-device), RAIDz1, RAIDz2, RAIDz3 vĂ”i peegel (mirror).
RAIDz1, RAIDz2 ja RAIDz3 on erilised variandid, mida vanad inimesed nimetasid RAID kahekordseks (diagonaalseks) pariteediks. 1, 2 ja 3 viitavad sellele, kui palju pariteediblokeerimist on eraldatud iga andmevoo jaoks. Selle asemel, et kasutada eraldi kettaid pariteedi tagamiseks, jaotavad RAIDz virtuaalsed seadmed selle pariteedi ĂŒhtlaselt diskide vahel. RAIDz-massiiv vĂ”ib kaotada sama arvu kettaid, kui tal on pariteediblokeerimisi; kui see kaotab veel ĂŒhe, siis see lakkab töötamast ja viib kaasa salvestuspooli.
Peegeldavad virtuaalsed seadmed (mirror vdev) salvestavad iga ploki igas seadmes vdev'is. Kuigi kĂ”ige levinumad on topeltpeeglid (two-wide), vĂ”ib peeglis olla meelevaldne arv seadmeid â suuremates seadmetes kasutatakse sageli kolmikuid lugemisvĂ”imekuse ja tĂ”rke taluvuse parandamiseks. Vdev peegel suudab ĂŒle elada mis tahes tĂ”rke, kui vdev'is töötab vĂ€hemalt ĂŒks seade.
Ăksikud vdev'id on oma olemuselt ohtlikud. Selline virtuaalne seade ei talleta tĂ”rget â ja kui seda kasutatakse salvestusena vĂ”i spetsiaalse vdev'ina, toob selle tĂ”rge kaasa kogu basseini hĂ€vimise. Olge siin vĂ€ga ettevaatlik.
Virtuaalsed seadmed CACHE, LOG ja SPECIAL vĂ”ivad olla loodud mis tahes eespool mainitud topoloogiate pĂ”hjal â kuid pidage meeles, et virtuaalse seadme SPECIAL kaotus tĂ€hendab basseini kadumist, seetĂ”ttu on soovitatav ĂŒleliigne topoloogia.
device
TĂ”enĂ€oliselt on see ZFS-i kontekstis kĂ”ige arusaadavam termin â see viitab tegelikult juhusliku ligipÀÀsu blokiseadmestikule. Pea meeles, et virtuaalsed seadmed koosnevad eraldi seadmetest ning bassein koosneb virtuaalsetest seadmetest.
Kettad â kas magnetilised vĂ”i SSD-d â on kĂ”ige levinumad blokeeringuseadmestikud, mida kasutatakse vdev-i ehitusplokkidena. Kuid sobib iga seade, millel on kirjeldus /dev-s â seega vĂ”ivad eraldi seadmetena kasutada isegi terveid riistvaralisi RAID-massiive.
Lihtne raw-fail on ĂŒks tĂ€htsamaid alternatiivseid blokeeringuseadmestikke, mille baasil vĂ”ib vdev-i luua. Testbasseinid, mis on  â on vĂ€ga mugav viis kĂ€skude testimiseks ja jĂ€lgimiseks, kui palju ruumi on basses vĂ”i antud topoloogias virtuaalses seadmes saadaval.

Sa saad luua testbasseini tĂŒhjadest failidest vaid mĂ”ne sekundiga â aga Ă€ra unusta seejĂ€rel kogu basseini ja selle komponente kustutada.
Oletame, et soovite seadistada serverit kaheksa kĂ”vakettaga ja kavatsete kasutada 10 TB (~9300 GiB) kettaid â kuid te ei ole kindel, milline topoloogia vastab kĂ”ige paremini teie vajadustele. Ălaltoodud nĂ€ites loome mĂ”ne sekundi jooksul katsepilu hajutatud failideks â ja nĂŒĂŒd teame, et kaheksast 10 TB ketast koosnev RAIDz2 vdev pakub 50 TiB kasulikku mahutavust.
Veel ĂŒks eriline seadmete klass on SPARE (varu). Kuumalt vahetatavad seadmed erinevad tavapĂ€rastest seadmetest, kuna need kuuluvad kogu pilvele, mitte ainult ĂŒhele virtuaalseadmele. Kui mĂ”ni vdev pilves ebaĂ”nnestub ja reserveeritud seade on pilvega ĂŒhendatud ja saadaval, liitub see automaatselt kahjustatud vdev-iga.
PĂ€rast kahjustatud vdev-iga ĂŒhendamist hakkab reserveeritud seade saama koopiaid vĂ”i ĂŒmber ehitusi andmetest, mis peaksid olema puuduvatel seadmetel. Traditsioonilises RAID-is nimetatakse seda taastamiseks (rebuilding), ZFS-is aga âĂŒlejÀÀgi taastamiseksâ (resilvering).
Oluline on mĂ€rkida, et varuteenused ei asenda riknenud seadmeid igaveseks. Need on vaid ajutised asendused, et vĂ€hendada vdev-degrdeerimise ajal kadumisaega. Kui administraator asendab riknenud seadme vdev-is, toimub ĂŒleliigsuse taastamine sellele pĂŒsivale seadmele, SPARE ĂŒhendus katkestatakse vdev-ist ja naaseb varuna kogu basseini jaoks.
Andmekogud, blokk ja sektorid
JĂ€rgmine ehitusplokkide kogum, mida on vajalik meie ZFS-i teekonna jooksul mĂ”ista, ei puuduta niivĂ”rd riistvara, vaid seda, kuidas andmed on organiseeritud ja salvestatud. Me jĂ€tame siit vahele mĂ”ned tasemed, nagu metaslab, et mitte detailidega ĂŒle koormata, sĂ€ilitades samas ĂŒldise struktuuri mĂ”istmise.
Andmekogud (dataset)

Kui loome andmekogu esmakordselt, nÀitab see kogu basseini saadaval olevat ruumi. Siis seadistame kvoodi ja muudame mount-punkti. VÔlu!

Zvol on suuresti lihtsalt andmekogu, millel puudub oma failisĂŒsteemi kiht, mida asendame siin tĂ€iesti normaalse failisĂŒsteemiga ext4.
ZFSi andmekogum sarnaneb standardse monteeritud failisĂŒsteemiga. Nagu tavaline failisĂŒsteem, nĂ€ib see esmapilgul "lihtsalt veel ĂŒhe kausta". Kuid nagu tavalistel monteeritud failisĂŒsteemidel, on igal ZFSi andmekogumil oma pĂ”hivÀÀrtuste kogum.
Esiteks vÔib andmekogumile olla mÀÀratud kvoot. Kui seadistada zfs set quota=100G poolname/datasetname, siis ei saa te monteeritud kausta /poolname/datasetname kirjutada rohkem kui 100 GiB.
Kas olete mĂ€rganud, et iga rea alguses on olemas - ja puuduvad - kaldkriipsud? Igal andmekogumil on oma koht nii ZFSi hierarhias kui ka sĂŒsteemi monteerimise hierarhias. ZFSi hierarhias ei ole algset kaldkriipsu - alustate puu nimest ja seejĂ€rel tee jĂ€rgmisest andmekogumist jĂ€rgmisse. NĂ€iteks, pool/vanem/laps andmekogumi nimega laps vanema andmekogumi vanem loomingulise nimega pool.
Vaikimisi on andmekogumi monteerimispunkt vĂ”rreldav selle nimega ZFSi hierarhias, algse kaldkriipsuga - puu nimega pool monteeritakse kui /pool, andmekogum vanem monteeritakse /pool/parent, ja alandmikuna andmekogum laps monteeritakse /pool/parent/child. Siiski saab sĂŒsteemi andmestiku mount-punkti muuta.
Kui mÀÀrame zfs set mountpoint=/lol pool/parent/child, siis andmestik pool/vanem/laps mountitakse sĂŒsteemi kui /lol.
Lisaks andmestikele peame mainima ka mahtu (zvols). Maht on ligikaudu sarnane andmestikule, vĂ€lja arvatud see, et tal ei ole tegelikult failisĂŒsteemi â see on lihtsalt plokkseade. NĂ€iteks vĂ”ite luua zvol nimega mypool/myzvol, seejĂ€rel vormindada selle failisĂŒsteemiga ext4 ja seejĂ€rel mountida selle failisĂŒsteemi â nĂŒĂŒd on teil ext4 failisĂŒsteem, kuid ZFS-i terviklikkuse funktsioonidega! See vĂ”ib tunduda rumal ĂŒhe arvuti puhul, kuid on palju mĂ”istlikum iSCSI seadme eksportimise tagasiside osana.
Plokid

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

Me tÔesti, tÔesti ei nalja tohutu jÔudluse kaotuse osas, kui seadistate liiga vÀikese ashift'i
ZFS-i kontekstis salvestatakse kĂ”ik andmed, sealhulgas metainformatsioon, plokkides. Iga andmehulgaga seotud ploki maksimaalne suurus mÀÀratakse atributi kaudu recordsize (sisalduse suurus). AndmeĂŒksuse suurus vĂ”ib varieeruda, kuid see ei muuda juba salvestatud plokkide suurust ega asukohta â see kehtib ainult uute plokkide jaoks nende salvestamisel.
Kui ei ole mÀÀratud teisiti, on vaikimisi andmesalvestuse suurus 128 KiB. See on omamoodi keeruline kompromiss, kus jĂ”udlus on enamasti kĂŒllaltki hea, kuid mitte ideaalne. Sisalduse suurus vĂ”ib seada vahemikku 4K kuni 1M (tĂ€iendavate seadistustega recordsize vĂ”ib seadistada isegi suuremaks, kuid see ei ole sageli hea idee).
Iga plokk viitab ainult ĂŒhe faili andmetele â teist faili ei saa sama plokki mahutada. Iga fail koosneb ĂŒhest vĂ”i mitmest plokist, olenevalt suurusest. Kui faili suurus on vĂ€iksem kui andmesalvestuse suurus, salvestatakse see vĂ€iksemas plokis â nĂ€iteks 2 KiB faili sisaldav plokk vĂ”tab kettal Ă€ra vaid ĂŒhe 4 KiB sektori.
Kui fail on piisavalt suur ja vajab mitut plokki, siis kĂ”ik selle failiga seotud kirjed on suurusega recordsize â sealhulgas viimane rekord, mille peamine osa vĂ”ib olla .
Zvol volumentidel ei ole omadust recordsize â selle asemel on neil vĂ”rdne omadus volblocksize.
Sektsioonid
Viimane ja kĂ”ige elementaarsem ehitusplokk on sektsioon. See on vĂ€ikseim fĂŒĂŒsiline ĂŒhik, mida saab salvestada vĂ”i lugeda algsest seadmest. AastakĂŒmnete jooksul on enamik diskidest kasutanud 512-baidiseid sektsioone. Viimasel ajal on enamik diskidest seadistatud 4 KiB sektsioonide peale, samas kui mĂ”ned â eriti SSD-d â kasutavad sektsioone, mis on 8 KiB vĂ”i isegi rohkem.
ZFS sĂŒsteemis on omadus, mis vĂ”imaldab manuaalselt seadistada sektsiooni suuruse. See omadus ashift. Veidi segane on see, et ashift on kahe astme. NĂ€iteks, ashift=9 tĂ€hendab sektsiooni suurust 2^9 ehk 512 bahti.
ZFS kĂŒsib operatsioonisĂŒsteemilt igasugust teavet iga plokiseadmest, kui see lisatakse uut tĂŒĂŒpi vdev-ile, ning teoreetiliselt seab see automaatselt ashifti Ă”igeks, tuginedes sellele teabele. Kahjuks valevad paljud kettad oma sektorite suuruses, et sĂ€ilitada ĂŒhilduvus Windows XP-ga (mis ei suutnud mĂ”ista kettaid, millel on erinevad sektorite suurused).
See tÀhendab, et ZFS administraator peab kindlasti teadma oma seadmete tegelikku sektorite suurust ja seadma selle kÀsitsi ashift. Kui ashift on seatud liiga vÀikeseks, siis suureneb lugemise/kirjutamise operatsioonide arv astronoomiliselt. NÀiteks 512-aatomiliste "sektorite" kirjutamine tegelikku 4 KiB-sektorisse tÀhendab, et tuleb kirjutada esimene "sektor", seejÀrel lugeda 4 KiB sektorit, muuta seda teise 512-aatomilise "sektoriga", kirjutada see tagasi uude 4 KiB sektorisse ja nii edasi iga kirjutise jaoks.
Tegelikus maailmas tabab selline trahv Samsung EVO tahkiskettaid, mille puhul peaks kehtima ashift=13, kuid need SSD-d valetavad oma sektorite suuruse kohta, seetĂ”ttu on see vaikimisi seatud ashift=9. Kui kogenud sĂŒsteemiadministraator seda parameetrit ei muuda, töötab see SSD aeglasemalt tavalise magnetse HDD-ga.
VĂ”rdluseks, liiga suure suuruse eest ashift praktiliselt ei tule mingeid karistusi. Tegelikku jĂ”udluse langust ei esine ja kasutamata ruumi suurenemine on ÀÀrmiselt vĂ€ike (vĂ”i null, kui on sisse lĂŒlitatud tihendamine). SeetĂ”ttu soovitame tungivalt isegi neile ketastele, mis tĂ”eliselt kasutavad 512-baidiseid sektoreid, seadistada ashift=12 vĂ”i isegi ashift=13, et kindlalt tulevikku vaadata.
Omadus ashift seatakse iga virtuaalse seadme vdev jaoks, mitte pala, nagu paljud ekslikult arvavad â ja seda ei muudeta pĂ€rast seadistamist. Kui te juhuslikult rikkusite ashift uue vdev-i lisamisega pala, siis olete jÀÀdavalt saastanud selle pala madala jĂ”udlusega seadmega ja tavaliselt pole teisi vĂ”imalusi, vĂ€lja arvatud pale hĂ€vitamine ja uuesti alustamine. Isegi vdev-i eemaldamine ei pÀÀsta vale seadistuse eest ashift!
Kirjutamise ajal kopeerimise mehhanism

Kui tavaline failisĂŒsteem peab andmeid ĂŒle kirjutama â muudab see iga ploki seal, kus see asub

FailosĂŒsteem kopeerimise kirjutamisel salvestab uue ploki versiooni ja seejĂ€rel vabastab vana versiooni.

Abstraktselt öeldes, kui ignoreerida plokkide tegelikku fĂŒĂŒsilist asukohta, lihtsustub meie 'andmete komeet' 'andmete ussiks', mis liigub vasakult paremale saadaval oleva ruumi kaardil.

NĂŒĂŒd saame hĂ€sti aru, kuidas kopeerimise kirjutamise snĂ€ppĆĄotid töötavad â iga plokk vĂ”ib kuuluda mitmesse snĂ€ppĆĄotti ning pĂŒsib, kuni kĂ”ik seotud snĂ€ppĆĄotid on hĂ€vitatud.
Kopeerimise kirjutamise mehhanism (Copy on Write, CoW) on fundamentaalne alus, mis teeb ZFSi nii uskumatuks sĂŒsteemiks. Peamine kontseptsioon on lihtne â kui palute traditsioonilisel failisĂŒsteemil faili muuta, teeb ta just seda, mida palusite. Kui palute kopeerimise kirjutamise failisĂŒsteemil sama teha, ĂŒtleb ta 'hea kĂŒll' â aga valetab teile.
Selle asemel kirjutab failisĂŒsteem kirjutamise kopeerimisega uue versiooni muudetud blokkist ning seejĂ€rel uuendab faili metaandmed, et katkestada seos vana blokiga ja siduda see uue blotiga, mille just kirjutasite.
Vana bloki lahtiĂŒhendamine ja uue sidumine toimub ĂŒhe operatsiooni kĂ€igus, mistĂ”ttu ei saa seda katkestada â kui lĂŒlitate toite vĂ€lja pĂ€rast seda, kui see on toimunud, on teil uus failiversioon, ja kui lĂŒlitate toite vĂ€lja enne seda, on teil vana versioon. Igatahes ei teki failisĂŒsteemis konflikte.
Kirjutamise kopeerimine ZFS-is toimub mitte ainult failisĂŒsteemi tasandil, vaid ka ketaste haldamise tasandil. See tĂ€hendab, et ZFS ei ole tundlik kirjutamispuuduste suhtes () â fenomen, kus riba Ă”nnestus osaliselt kirjutada enne sĂŒsteemi tĂ”rget, kahjustades massiivi pĂ€rast taaskĂ€ivitamist. Siin kirjutatakse riba aatomaariselt, vdev on alati jĂ€rjekindel, ja .
ZIL: ZFS-i kavatsuste ajakiri

ZFS sĂŒsteem töötleb sĂŒnkroonne kirjutisi eriliselt â see salvestab need ajutiselt, kuid kohe ZIL-i, enne kui kirjutab need hiljem pĂŒsivalt koos asĂŒnkroonsete kirjutistega.

Tavaliselt ei loeta ZIL-is salvestatud andmeid enam kunagi vĂ€lja. Kuid see on vĂ”imalik pĂ€rast sĂŒsteemi riket.

SLOG ehk sekundaarne LOG-seade on lihtsalt eriline â ja eelistatavalt vĂ€ga kiire â vdev, kus ZIL-i saab salvestada eraldi peamisest salvestusruumist.

PĂ€rast riket loetakse kĂ”ik mÀÀrdunud andmed ZIL-ist taastatavaks â antud juhul asub ZIL SLOG-is, nii et need loetakse sealt.
On olemas kaks peamist kirjutamise operatsiooni kategooriat â sĂŒnkroonsed (sync) ja asĂŒnkroonsed (async). Enamikus töökoormustes on enamus kirjutamistegevusi asĂŒnkroonsed â failisĂŒsteem vĂ”imaldab neid koguda ja vĂ€lja anda pakettidena, vĂ€hendades fragmenteerimist ja oluliselt suurendades lĂ€bilaskevĂ”imet.
SĂŒnkroonsed kirjutised on hoopis midagi muud. Kui rakendus nĂ”uab sĂŒnkrooni kirjutamist, ĂŒtleb see failisĂŒsteemile: âPeate selle kohe salvestama energiakindlasse mĂ€llu. just praegu, ja kuni siis ei saa ma midagi muud teha.â SeetĂ”ttu peavad sĂŒnkroonsed kirjed koheselt ketta peale salvestuma â ja kui see suurendab fragmenteerimist vĂ”i vĂ€hendab lĂ€bilaskevĂ”imet, siis nii peabki olema.
ZFS kĂ€sitleb sĂŒnkroone kirjeid teisiti kui tavalised failisĂŒsteemid â selle asemel, et need kohe tavalisse salvestusse laadida, salvestab ZFS need spetsiaalsesse salvestuspiirkonda, mida nimetatakse ZFS-i kavatsuste ajaks (ZFS Intent Log, vĂ”i ZIL). Trikk on selles, et need kirjed ka jÀÀvad mĂ€llu, olles kogutud koos tavaliste asĂŒnkroonsete kirjutamisotsega, et hiljem salvestada need salvestusse tĂ€iesti normaalses TXG (tehingugrupid, Transaction Groups) vormis.
Tavaliselt salvestatakse ZIL ja seda ei loeta enam kunagi. Kui pÀrast mÔnda hetke ZIL-st salvestatud kirjed kinnitatakse peamisse salvestusse tavapÀrases TXG-s mÀlust, eraldatakse need ZIL-ist. Ainsad korrad, kui ZIL-ist midagi loetakse, on siis, kui tehakse basseini import.
Kui ZFS-i sĂŒsteem vĂ”i toitekatkestus pĂ”hjustab vea, kui ZIL-is on andmeid, loetakse need andmed jĂ€rgmise basseini impordi ajal (nĂ€iteks pĂ€rast avariilise sĂŒsteemi taaskĂ€ivitamist). KĂ”ik, mis on ZIL-is, loetakse, kogutakse TXG gruppidesse, salvestatakse pĂ”hiahendisse ja seejĂ€rel eemaldatakse ZIL-ist impordi kĂ€igus.
Ăks vdev-i abikliendi kategooriaid on LOG vĂ”i SLOG, teisejĂ€rguline LOG seade. Selle ainus ĂŒlesanne on anda basseini eraldi ja, eelistatavalt, palju kiiream vdev, mille kirjutamisvastupidavus on vĂ€ga kĂ”rge, ZIL-i salvestamiseks, mitte peahoidlas vdev-s. Isegi kui ZIL kĂ€itub sĂ”ltumatult salvestuskohtadest, siis kui LOG-vdev-il on kirjutamise osas vĂ€ga kĂ”rge jĂ”udlus, toimuvad sĂŒnkroonsed kirjutised kiiremini.
LOG vdev-i lisamine basseini ei saa parandada asĂŒnkroonsete kirjutiste sooritust â isegi kui sunnite kĂ”ik kirjutised ZIL-i tegema zfs set sync=always, nad siiski on nad endiselt seotud peamise salvestusega TXG samamoodi ja samas tempos nagu ilma pĂ€evikuta. Ainus otsene jĂ”udluse parendamine on sĂŒnkroonselte kirjutuste viivitus (kuna pĂ€eva suurem kiirus kiirendab toimingute tĂ€itmist sync).
Kuid keskkonnas, kus on juba vaja suurt hulka sĂŒnkroonseid kirjeid, vĂ”ib vdev LOG kaudselt kiirendada asĂŒnkroonset kirjutamist ja vahemĂ€luta lugemist. ZIL-i kirjeid eraldi vdev LOG-i laadides on vĂ€hem konkurentsi IOPS-i pĂ€rast pĂ”hilises salvestuses, mis tĂ”stab teatud mÀÀral kĂ”igi lugemis- ja kirjutamistoimingute jĂ”udlust.
Snaipid
Kirjutamisel kopeerimise mehhanism on samuti vajalik alus ZFS-i aatomiliste hetkepiltide ja inkrementaalse asĂŒnkroonse replikatsiooni jaoks. Aktiivses failisĂŒsteemis on olemas viidete puu, mis tĂ€histab kĂ”iki kirjeid koos praeguste andmetega â kui teete snaipi, teete lihtsalt koopia sellest viidete puust.
Aktive failisĂŒsteemi kirje uuendamisel kirjutab ZFS esmalt uue ploki versiooni kasutamata ruumi. SeejĂ€rel eraldab see vana ploki versiooni praegusest failisĂŒsteemist. Kuid kui mĂ”ni snapshot viitab vanale plokile, jÀÀb see siiski muutumatuks. Vana plokk ei muutu tegelikult vabaks ruumiks, kuni kĂ”ik snapshotid, mis viitavad sellele plokile, on kustutatud!
Replikatsioon

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

Samas vĂ”rgus on 40 GiB suuruse Windows 7 virtuaalmasina pildi faili replikatsioon tĂ€iesti teine lugu. ZFS replikatsioon toimub 289 korda kiiremini kui rsync â vĂ”i "ainult" 161 korda kiiremini, kui olete piisavalt tundlik, et kĂ€ivitada rsync koos vĂ”tit âinplace.

Kui virtuaalmasina pilt suureneb, kaasnevad probleemid rsynciga samuti. 1,9 TiB suurus ei ole tĂ€napĂ€eva virtuaalmasina pildi jaoks ĂŒlemÀÀra suur â aga see on piisavalt suur, et ZFS-i replikatsioon toimuks 1148 korda kiiremini kui rsync, isegi rsynci argumentidega âinplace.
Kui olete aru saanud, kuidas snapshots töötavad, on replikatsiooni olemuse mĂ”istmine lihtne. Kuna snapshot on lihtsalt salvestuste teedepuu, tuleneb sellest, et kui teeme zfs send snapshot'i, saatme selle puu ja kĂ”ik sellega seotud salvestused. Kui edastame selle zfs send ĂŒhes zfs receive sihtobjekti, salvestab see nii tegeliku ploki sisu kui ka puu, mis osutab plokkidele, sihtkoha andmekogusse.
Asjad muutuvad veelgi huvitavamaks teises zfs send. NĂŒĂŒd on meil kaks sĂŒsteemi, igal neist on poolname/datasetname@1, ja te teete uue snapshot'i poolname/datasetname@2. Seega on algses puus datasetname@1 ja datasetname@2, samas kui sihtpuus on ainult esimene snapshot. datasetname@1.
Kuna meil on allika ja sihtkoha vahel ĂŒhine snapshot datasetname@1, saame luua inkrementaalse zfs send selle peale. Kui me rÀÀgime sĂŒsteemist zfs send -i poolname/datasetname@1 poolname/datasetname@2, see vĂ”rreldakse kahte nĂ€idiku puud. KĂ”ik nĂ€idikud, mis eksisteerivad ainult @2, viitavad selgelt uutele plokkidele â seega vajame nende plokkide sisu.
KaugsĂŒsteemis inkrementaalse töötlemine send on samuti lihtne. Esiteks kirjutame kĂ”ik uued kirjed, mis on voos send, ja seejĂ€rel lisame viidatud need plokid. VoilĂ , meil on @2 uus sĂŒsteem!
ZFS asĂŒnkroonne inkrementaalne replikatsioon on suur edasiminek vĂ”rreldes varasemate meetoditega, mis ei pĂ”hine snĂ€pĆĄottidel, nĂ€iteks rsync. MĂ”lemal juhul edastatakse ainult muudetud andmed â kuid rsync peab kĂ”igepealt lugema kĂ”ik andmed mĂ”lemast kĂŒljest kettalt, et kontrollida kokkuvĂ”tte ja vĂ”rrelda seda. Erinevalt sellest ei loe ZFS replikatsioon midagi muud kui nĂ€idiku puid â ja mis tahes plokke, mis ei ole esitatud ĂŒldises snĂ€pĆĄotis.
Sisseehitatud pakkimine
Kopeerimise mehhanism salvestamise ajal lihtsustab ka sisseehitatud tĂ”hukeskkonna sĂŒsteemi. Traditsioonilisest failisĂŒsteemist on tihendamine probleemne â nii vana kui ka uus muudetud andmete versioon asub samas ruumis.
Kui vaatame andmefraktsiooni faili keskel, mis alustab oma elu megabaidi nullidest alates 0x00000000 ja nii edasi â on seda vĂ€ga lihtne tihendada ĂŒhe ketta sektorini. Kuid mis juhtub, kui asendame selle megabaidi nullid mittetihendatavate andmetega, nagu JPEG vĂ”i pseudojuhuslik mĂŒra? ĂhtĂ€kki nĂ”uab see megabait andmeid mitte ĂŒhte, vaid 256 sektorit, igaĂŒks 4 KiB, samas kui sellel kohal kettal on reserveeritud ainult ĂŒks sektor.
ZFS-il pole sellist probleemi, kuna muudetud kirjed kirjutatakse alati kasutamata ruumi â algne plokk vĂ”tab ainult ĂŒhe 4 KiB sektori, samas kui uus kirje vĂ”tab 256, kuid see pole probleem â hiljuti muudetud fraktsioon failist 'keskel' kirjutataks alati kasutamata ruumi sĂ”ltumata selle suuruse muutumisest, seega on see ZFS-i jaoks tĂ€iesti normaalne olukord.
ZFS-i sisseehitatud tihendamine on vaikimisi vĂ€lja lĂŒlitatud ning sĂŒsteem pakub lahtiselt ĂŒhendatavaid algoritme â nende seas on nĂŒĂŒd LZ4, gzip (1-9), LZJB ja ZLE.
- LZ4 on voolualgoritm, mis pakub ÀÀrmiselt kiiret tihendamist ja dekompressiooni ning parendust enamike kasutusjuhtude jaoks â isegi ĂŒsna aeglastel CPU-del.
- GZIP on austatud algoritm, mida tunnevad ja armastavad kĂ”ik Unix-sĂŒsteemide kasutajad. Seda saab rakendada tihendustasemetes 1-9, kus tihendustase ja CPU kasutamine suurenevad, kui lĂ€heneda tasemele 9. Algoritm sobib hĂ€sti kĂ”igile tekstilistele (vĂ”i muudele ĂŒlihĂ€sti tihendatavatele) kasutusviisidele, kuid muidu sageli tekitab probleeme CPU-ga â kasutage seda ettevaatlikult, eriti kĂ”rgematel tasemetel.
- LZJB on ZFS-i originaalalgoritm. See on vananenud ja seda ei tohiks enam kasutada, LZ4 ĂŒletab selle kĂ”igis nĂ€itajates.
- ZLE â nulltaseme kodeering, Zero Level Encoding. See ei mĂ”juta tavapĂ€raseid andmeid, kuid tihendab suuri nullide jĂ€rjestusi. See on kasulik tĂ€iesti tihendamatute andmekogumite jaoks (nt JPEG, MP4 vĂ”i teiste juba tihendatud formaatide puhul), kuna see ignoreerib tihendamatuid andmeid, kuid tihendab kasutamata ruumi lĂ”ppsalvestistes.
Soovitame LZ4 tihendust praktiliselt kĂ”igi kasutusvĂ”imaluste jaoks; performantsi karistus tihendamatute andmete korral on vĂ€ga vĂ€ike, samas kui kasv tavapĂ€raste andmete jaoks on see mĂ€rkimisvÀÀrne. Virtuaalmasina pildi kopeerimine uue Windows operatsioonisĂŒsteemi installatsiooni jaoks (vĂ€rskelt installitud OS, sees pole veel andmeid) koos compression=lz4 toimus 27% kiiremini kui compression=none, in .
ARC â kohandatud asenduskĂŒhvelduse vahemĂ€lu
ZFS on ainus kaasaegne failisĂŒsteem, millest me teame, mis kasutab oma lugemise vahemĂ€lumehhanismi, mitte ei toetunud operatsioonisĂŒsteemi lehe vahemĂ€lule, et salvestada hiljuti loetud blokke mĂ€llu.
Kuigi enda vahemĂ€lu ei ole probleemideta â ZFS ei saa uusi mĂ€lukasutuse soove sama kiiresti töödelda kui tuum, mistĂ”ttu uus kutse malloc() mĂ€luekspressioon vĂ”ib ebaĂ”nnestuda, kui see vajab hetkel ARC-is hĂ”ivatud töömĂ€lu. Siiski on tungiv vajadus kasutada enda vahemĂ€lu, vĂ€hemalt praegu.
KĂ”ik tuntud kaasaegsed operatsioonisĂŒsteemid, sealhulgas MacOS, Windows, Linux ja BSD, kasutavad lehekĂŒlgede vahemĂ€lu rakendamiseks LRU (Least Recently Used) algoritmi. See on primitiivne algoritm, mis tĂ”stab pĂ€rast iga lugemist vahemĂ€lustatud ploki âjĂ€rjekorras ĂŒlesâ ja asendab plokke âjĂ€rjekorras allaâ vastavalt vajadusele, et lisada uusi vahemĂ€lu puudeid (plokid, mida oleks pidanud lugema diskilt, mitte vahemĂ€lust) kĂ”rgemasse.
Tavaliselt töötab algoritm korralikult, kuid suurte andmekogumite sĂŒsteemides toob LRU kergesti kaasa thrashing'i â sageli vajalike plokkide asendamine, et vabastada ruumi plokkidele, mida enam vahemĂ€lust ei loeta.
 â tunduvalt vĂ€hem naiivne algoritm, mida saab vaadelda kui 'kaalutud' vahemĂ€lu. PĂ€rast iga vahemĂ€lublooki lugemist muutub see veidi 'raskemaks' ja on raskem kĂ”rvaldada â isegi pĂ€rast kĂ”rvaldamist muutub plokk jĂ€lgitud teatud aja jooksul. Plokk, mis on kĂ”rvaldada, kuid peab seejĂ€rel uuesti vahemĂ€llu lugema, muutub samuti 'raskemaks'.
KĂ”ikide nende tulemusena on vahemĂ€lu palju suurema tabamussuhtega (hit ratio) â suhe vahemĂ€lu tabamiste (lugemine, mis toimub vahemĂ€lust) ja vahelejĂ€tmiste (lugemine kettalt). See on ÀÀrmiselt oluline statistika â mitte ainult, et vahemĂ€lu tabamised teenindatakse jĂ€rsult kiiremini, vaid ka vahelejĂ€tmised vĂ”ivad saada kiiremini teenindatud, kuna mida rohkem vahemĂ€lu tabamisi â seda vĂ€hem on paralleelseid pĂ€ringuid kettale ja seda vĂ€iksem on viivitus nende jÀÀkide vahelejĂ€tmiste jaoks, mis tuleb teenindada kettalt.
KokkuvÔte
PĂ€rast ZFS pĂ”hisemantika uurimist â kuidas toimub kirjutamise kĂ€igus kopeerimine ning suhetest salvestuspaikade, virtuaalsete seadmete, plokkide, sektorite ja failidega â oleme valmis arutama tegelikku jĂ”udlust ja reaalseid numbreid.
JĂ€rgmisest osast vaatame, kuidas toimivad peegeldava vdev ja RAIDz salvestuspaigad ĂŒksteisega vĂ”rreldes, samuti vĂ”rreldes traditsiooniliste Linuxi RAID-topoloogiatega, mida me oleme uurinud. .
Alguses soovisime arutada ainult pĂ”hitĂ”desid â ZFS enda topoloogiaid â kuid pĂ€rast sellist oleme valmis rÀÀkima edasise ZFS seadistamise ja hÀÀlestamise ĂŒle, sealhulgas abiseadmete vdev-tĂŒĂŒpide kasutamisest, nagu L2ARC, SLOG ja Special Allocation.
Allikas: habr.com
