Å opavasar jau apspriedÄm dažas ievada tÄmas, piem.
Nu, Å”odien ir labÄkÄ diena, lai iepazÄ«tos ar ZFS, zinÄtkÄrie lasÄ«tÄji. VienkÄrÅ”i ziniet, ka OpenZFS izstrÄdÄtÄja Meta Ahrensa pazemÄ«gajÄ novÄrtÄjumÄ "tas ir patieÅ”Äm grÅ«ti".
Bet pirms mÄs nonÄkam pie skaitļiem - un es apsolu, ka tie bÅ«s - par visiem astoÅu disku ZFS konfigurÄcijas variantiem mums ir jÄrunÄ par kÄ KopumÄ ZFS saglabÄ datus diskÄ.
Zpool, vdev un ierīce
Å ajÄ pilnajÄ pÅ«la diagrammÄ ir iekļauti trÄ«s papildu Vdevs, viens no katras klases un Äetri RAIDz2
Parasti nav iemesla izveidot neatbilstoÅ”u vdev veidu un izmÄru kopu, taÄu, ja vÄlaties, nekas neliedz jums to darÄ«t.
Lai patieÅ”Äm izprastu ZFS failu sistÄmu, jums rÅ«pÄ«gi jÄizpÄta tÄs faktiskÄ struktÅ«ra. PirmkÄrt, ZFS apvieno tradicionÄlos apjoma un failu sistÄmas pÄrvaldÄ«bas slÄÅus. OtrkÄrt, tas izmanto transakciju kopÄÅ”anas un rakstÄ«Å”anas mehÄnismu. Å Ä«s funkcijas nozÄ«mÄ, ka sistÄma strukturÄli ļoti atŔķiras no parastajÄm failu sistÄmÄm un RAID masÄ«viem. PirmÄ pamata elementu kopa, kas jÄsaprot, ir krÄtuves baseins (zpool), virtuÄlÄ ierÄ«ce (vdev) un reÄlÄ ierÄ«ce (ierÄ«ce).
zpool
Zpool krÄtuves baseins ir augstÄkÄ ZFS struktÅ«ra. KatrÄ pÅ«lÄ ir viena vai vairÄkas virtuÄlÄs ierÄ«ces. SavukÄrt katrÄ no tÄm ir viena vai vairÄkas reÄlas ierÄ«ces (ierÄ«ce). VirtuÄlie baseini ir autonomas vienÄ«bas. Viens fiziskais dators var saturÄt divus vai vairÄkus atseviŔķus baseinus, taÄu katrs ir pilnÄ«gi neatkarÄ«gs no pÄrÄjiem. PÅ«li nevar koplietot virtuÄlÄs ierÄ«ces.
ZFS dublÄÅ”ana ir virtuÄlÄs ierÄ«ces lÄ«menÄ«, nevis pÅ«la lÄ«menÄ«. Baseina lÄ«menÄ« nav nekÄdas atlaiÅ”anas ā ja tiek pazaudÄts vdev vai speciÄls vdev, lÄ«dz ar to tiek zaudÄts arÄ« viss pÅ«ls.
MÅ«sdienu krÄtuves pÅ«li var izturÄt virtuÄlÄs ierÄ«ces keÅ”atmiÅas vai žurnÄla zaudÄÅ”anu, lai gan tie var zaudÄt nelielu daudzumu netÄ«ro datu, ja tie pazaudÄ vdev žurnÄlu strÄvas padeves pÄrtraukuma vai sistÄmas avÄrijas laikÄ.
PastÄv izplatÄ«ts nepareizs uzskats, ka ZFS "datu svÄ«tras" ir rakstÄ«tas visÄ baseinÄ. TÄ nav taisnÄ«ba. Zpool nav smieklÄ«gs RAID0, tas ir vairÄk smieklÄ«gs
LielÄkoties ieraksti tiek sadalÄ«ti starp pieejamajÄm virtuÄlajÄm ierÄ«cÄm atbilstoÅ”i pieejamajai brÄ«vajai vietai, tÄpÄc teorÄtiski tie visi tiks aizpildÄ«ti vienlaicÄ«gi. JaunÄkÄs ZFS versijÄs tiek Åemts vÄrÄ paÅ”reizÄjais vdev lietojums (iznÄ«cinÄÅ”ana) ā ja viena virtuÄlÄ ierÄ«ce ir ievÄrojami noslogotÄka par citu (piemÄram, lasÄ«Å”anas slodzes dÄļ), tÄ tiks Ä«slaicÄ«gi izlaista rakstÄ«Å”anai, neskatoties uz to, ka tai ir visaugstÄkÄ brÄ«vÄs vietas attiecÄ«ba. .
MÅ«sdienu ZFS rakstÄ«Å”anas pieŔķirÅ”anas metodÄs iebÅ«vÄtais otrreizÄjÄs pÄrstrÄdes noteikÅ”anas mehÄnisms var samazinÄt latentumu un palielinÄt caurlaidspÄju neparasti lielas slodzes periodos, taÄu tas tÄ nav carte blanche lÄ«dz patvaļīgai lÄnu HDD un Ätro SSD sajaukÅ”anai vienÄ baseinÄ. Å Äds nevienlÄ«dzÄ«gs baseins joprojÄm darbosies ar lÄnÄkÄs ierÄ«ces Ätrumu, tas ir, it kÄ tas pilnÄ«bÄ sastÄvÄtu no Å”ÄdÄm ierÄ«cÄm.
vdev
Katrs krÄtuves kopums sastÄv no vienas vai vairÄkÄm virtuÄlajÄm ierÄ«cÄm (vdev). SavukÄrt katrs vdev ietver vienu vai vairÄkas reÄlas ierÄ«ces. LielÄkÄ daļa virtuÄlo ierÄ«Äu tiek izmantotas vienkÄrÅ”ai datu glabÄÅ”anai, taÄu ir vairÄkas vdev palÄ«gu klases, tostarp CACHE, LOG un SPECIAL. Katram no Å”iem vdev tipiem var bÅ«t viena no piecÄm topoloÄ£ijÄm: vienas ierÄ«ces, RAIDz1, RAIDz2, RAIDz3 vai spogulis.
RAIDz1, RAIDz2 un RAIDz3 ir Ä«paÅ”as Ŕķirnes, ko vecie ļaudis dÄvÄtu par dubultÄs (diagonÄlÄs) paritÄtes RAID. 1, 2 un 3 attiecas uz to, cik paritÄtes bloku ir pieŔķirti katrai datu joslai. TÄ vietÄ, lai nodroÅ”inÄtu atseviŔķu disku paritÄti, virtuÄlÄs RAIDz ierÄ«ces sadala paritÄti daļÄji vienmÄrÄ«gi pa diskiem. RAIDz masÄ«vs var zaudÄt tik daudz disku, cik tam ir paritÄtes bloki; ja tas zaudÄs vÄl vienu, tas neizdosies un paÅems sev lÄ«dzi krÄtuves baseinu.
Spoguļa virtuÄlajÄs ierÄ«cÄs (spoguļa vdev) katrs bloks tiek saglabÄts katrÄ vdev ierÄ«cÄ. Lai gan visizplatÄ«tÄkie ir divu platumu spoguļi, spogulis var saturÄt jebkuru ierÄ«Äu skaitu ā lielÄs instalÄcijÄs bieži izmanto trÄ«skÄrÅ”us, lai uzlabotu lasÄ«Å”anas veiktspÄju un kļūdu toleranci. Vdev spogulis var izturÄt jebkuru kļūmi, ja vien darbojas vismaz viena vdev ierÄ«ce.
AtseviŔķi Vdevi pÄc bÅ«tÄ«bas ir bÄ«stami. Å Äda virtuÄla ierÄ«ce neizdzÄ«vos vienu kļūmi - un, ja to izmantos kÄ krÄtuvi vai Ä«paÅ”u vdev, tad tÄs kļūme novedÄ«s pie visa baseina iznÄ«cinÄÅ”anas. Esiet Å”eit ļoti, ļoti uzmanÄ«gi.
CACHE, LOG un SPECIAL virtuÄlÄs ierÄ«ces var izveidot jebkurÄ no iepriekÅ” minÄtajÄm topoloÄ£ijÄm, taÄu atcerieties, ka ÄŖPAÅ AS virtuÄlÄs ierÄ«ces pazaudÄÅ”ana nozÄ«mÄ pÅ«la zaudÄÅ”anu, tÄpÄc ļoti ieteicama ir lieka topoloÄ£ija.
ierīce
Tas, iespÄjams, ir visvieglÄk saprotamais termins ZFS ā tÄ burtiski ir bloÄ·Äta brÄ«vpiekļuves ierÄ«ce. Atcerieties, ka virtuÄlÄs ierÄ«ces veido atseviŔķas ierÄ«ces, un pÅ«ls sastÄv no virtuÄlajÄm ierÄ«cÄm.
MagnÄtiskie vai cietvielu diski ir visizplatÄ«tÄkÄs blokierÄ«ces, ko izmanto kÄ vdev pamatelementus. TaÄu derÄs jebkura ierÄ«ce, kuras deskriptors mapÄ /dev ā tÄdÄjÄdi veselus aparatÅ«ras RAID masÄ«vus var izmantot kÄ atseviŔķas ierÄ«ces.
VienkÄrÅ”s neapstrÄdÄts fails ir viena no svarÄ«gÄkajÄm alternatÄ«vajÄm bloku ierÄ«cÄm, no kuras var izveidot vdev. Testa baseini no
Varat izveidot testa pÅ«lu no retajiem failiem tikai dažu sekunžu laikÄ, taÄu neaizmirstiet pÄc tam izdzÄst visu pÅ«lu un tÄ komponentus.
PieÅemsim, ka vÄlaties astoÅu disku serveri un plÄnojat izmantot 10 TB (~ 9300 GiB) diskus, taÄu neesat pÄrliecinÄts, kura topoloÄ£ija vislabÄk atbilst jÅ«su vajadzÄ«bÄm. IepriekÅ” minÄtajÄ piemÄrÄ mÄs dažu sekunžu laikÄ izveidojam testa pÅ«lu no retajiem failiem ā un tagad mÄs zinÄm, ka RAIDz2 vdev ar astoÅiem 10 TB diskiem nodroÅ”ina 50 TiB izmantojamÄs ietilpÄ«bas.
VÄl viena Ä«paÅ”a ierÄ«Äu klase ir SPARE. Hot-swap ierÄ«ces, atŔķirÄ«bÄ no parastajÄm ierÄ«cÄm, pieder visam kopumam, nevis vienai virtuÄlai ierÄ«cei. Ja kÄds pÅ«la vdev neizdodas un rezerves ierÄ«ce ir pievienota pÅ«lam un ir pieejama, tÄ automÄtiski pievienosies ietekmÄtajam vdev.
Kad ir izveidots savienojums ar ietekmÄto vdev, rezerves ierÄ«ce sÄk saÅemt to datu kopijas vai rekonstrukcijas, kuriem vajadzÄtu bÅ«t trÅ«kstoÅ”ajÄ ierÄ«cÄ. TradicionÄlajÄ RAID to sauc par "pÄrbÅ«vi", un ZFS to sauc par "pÄrveidoÅ”anu".
Ir svarÄ«gi atzÄ«mÄt, ka rezerves ierÄ«ces neatgriezeniski neaizstÄj bojÄtas ierÄ«ces. Tas ir tikai pagaidu nomaiÅa, lai samazinÄtu laiku, kas nepiecieÅ”ams vdev degradÄcijai. PÄc tam, kad administrators ir nomainÄ«jis neveiksmÄ«go vdev ierÄ«ci, Å”ai pastÄvÄ«gajai ierÄ«cei tiek atjaunota dublÄÅ”ana, un SPARE tiek atvienots no vdev un atgriežas kÄ rezerves ierÄ«ce visam pÅ«lam.
Datu kopas, bloki un sektori
NÄkamais pamatelementu kopums, kas jÄizprot mÅ«su ZFS ceļojumÄ, ir mazÄk saistÄ«ts ar aparatÅ«ru, bet vairÄk ar to, kÄ tiek organizÄti un uzglabÄti paÅ”i dati. Å eit mÄs izlaižam dažus slÄÅus, piemÄram, metaslab, lai izvairÄ«tos no detaļu pÄrblÄ«vÄÅ”anas, vienlaikus saglabÄjot izpratni par vispÄrÄjo struktÅ«ru.
Datu kopa
Kad mÄs pirmo reizi izveidojam datu kopu, tajÄ tiek parÄdÄ«ta visa pieejamÄ baseina vieta. Tad mÄs iestatÄm kvotu un mainÄm piestiprinÄÅ”anas punktu. MaÄ£ija!
Zvol pÄrsvarÄ ir tikai datu kopa, kurai ir noÅemts failu sistÄmas slÄnis, kuru mÄs Å”eit aizstÄjam ar pilnÄ«gi normÄlu ext4 failu sistÄmu.
ZFS datu kopa ir aptuveni tÄda pati kÄ standarta uzstÄdÄ«tÄ failu sistÄma. TÄpat kÄ parasta failu sistÄma, no pirmÄ acu uzmetiena Ŕķiet, ka tÄ ir ātikai vÄl viena mapeā. Bet, tÄpat kÄ parastajÄm pievienotajÄm failu sistÄmÄm, katrai ZFS datu kopai ir savs pamata rekvizÄ«tu kopums.
PirmkÄrt, datu kopai var bÅ«t pieŔķirta kvota. Ja instalÄjat zfs set quota=100G poolname/datasetname
, tad nevarÄsit rakstÄ«t pievienotajÄ mapÄ /poolname/datasetname
vairÄk nekÄ 100 GiB.
Vai ievÄrojat slÄ«psvÄ«tru esamÄ«bu un neesamÄ«bu katras rindas sÄkumÄ? Katrai datu kopai ir sava vieta gan ZFS hierarhijÄ, gan sistÄmas stiprinÄjuma hierarhijÄ. ZFS hierarhijÄ nav slÄ«psvÄ«tras ā jÅ«s sÄkat ar pÅ«la nosaukumu un pÄc tam ceļu no vienas datu kopas uz nÄkamo. PiemÄram, pool/parent/child
datu kopai ar nosaukumu child
zem vecÄkdatu kopas parent
baseinÄ ar radoÅ”u nosaukumu pool
.
PÄc noklusÄjuma datu kopas pievienoÅ”anas punkts bÅ«s lÄ«dzvÄrtÄ«gs tÄs nosaukumam ZFS hierarhijÄ ar slÄ«psvÄ«tru sÄkumÄ ā kopas nosaukums pool
uzstÄdÄ«ts kÄ /pool
, datu kopa parent
uzstÄdÄ«ts iekÅ”Ä /pool/parent
un bÄrna datu kopu child
uzstÄdÄ«ts iekÅ”Ä /pool/parent/child
. TomÄr datu kopas sistÄmas stiprinÄjuma punktu var mainÄ«t.
Ja mÄs norÄdÄm zfs set mountpoint=/lol pool/parent/child
, tad datu kopa pool/parent/child
uzstÄdÄ«ts sistÄmÄ kÄ /lol
.
Papildus datu kopÄm jÄmin apjomi (zvols). SÄjums ir aptuveni tÄds pats kÄ datu kopa, izÅemot to, ka tam faktiski nav failu sistÄmas ā tÄ ir tikai bloka ierÄ«ce. PiemÄram, varat izveidot zvol
Ar nosaukumu mypool/myzvol
, pÄc tam formatÄjiet to ar ext4 failu sistÄmu un pÄc tam pievienojiet Å”o failu sistÄmu ā tagad jums ir ext4 failu sistÄma, taÄu ar visiem ZFS droŔības lÄ«dzekļiem! Tas var Ŕķist muļķīgi vienÄ datorÄ, taÄu tas ir daudz saprÄtÄ«gÄks kÄ aizmugursistÄma, eksportÄjot iSCSI ierÄ«ci.
Bloki
Failu attÄlo viens vai vairÄki bloki. Katrs bloks tiek saglabÄts vienÄ virtuÄlajÄ ierÄ«cÄ. Bloka izmÄrs parasti ir vienÄds ar parametru rekordlielums, bet to var samazinÄt lÄ«dz 2^ashift, ja tajÄ ir metadati vai neliels fails.
MÄs tieÅ”Äm tieÅ”Äm MÄs nejokojam par milzÄ«go sodu par veiktspÄju, ja iestatÄt pÄrÄk zemu pÄrbÄ«di
ZFS pÅ«lÄ visi dati, tostarp metadati, tiek glabÄti blokos. MaksimÄlais bloka lielums katrai datu kopai ir definÄts Ä«paÅ”umÄ recordsize
(rekordizmÄrs). Ieraksta lielums var mainÄ«ties, taÄu tas nemainÄ«s neviena bloka lielumu vai atraÅ”anÄs vietu, kas jau ir ierakstÄ«ta datu kopÄ ā tas ietekmÄ tikai jaunus blokus, kad tie tiek ierakstÄ«ti.
Ja nav norÄdÄ«ts citÄdi, paÅ”reizÄjais noklusÄjuma ieraksta lielums ir 128 KiB. Tas ir sava veida grÅ«ts kompromiss, kurÄ sniegums nebÅ«s ideÄls, taÄu vairumÄ gadÄ«jumu tas nebÅ«s briesmÄ«gi. Recordsize
var iestatÄ«t uz jebkuru vÄrtÄ«bu no 4K lÄ«dz 1M (ar papildu iestatÄ«jumiem recordsize
varat instalÄt vÄl vairÄk, taÄu tÄ reti ir laba ideja).
JebkurÅ” bloks attiecas tikai uz viena faila datiem ā jÅ«s nevarat saspiest divus dažÄdus failus vienÄ blokÄ. Katrs fails sastÄv no viena vai vairÄkiem blokiem atkarÄ«bÄ no tÄ lieluma. Ja faila lielums ir mazÄks par ieraksta lielumu, tas tiks saglabÄts mazÄkÄ blokÄ ā piemÄram, bloks ar 2 KiB failu aizÅems tikai vienu 4 kiB sektoru diskÄ.
Ja fails ir pietiekami liels, lai prasÄ«tu vairÄkus blokus, visi Ŕī faila ieraksti bÅ«s lieli recordsize
- ieskaitot pÄdÄjo ierakstu, kura galvenÄ daļa var bÅ«t
zvol sÄjumiem Ä«paÅ”uma nav recordsize
- tÄ vietÄ viÅiem ir lÄ«dzvÄrtÄ«gs Ä«paÅ”ums volblocksize
.
Sektori
PÄdÄjais, visvienkÄrÅ”Äkais elements ir sektors. TÄ ir mazÄkÄ fiziskÄ vienÄ«ba, ko var ierakstÄ«t resursdatorÄ vai nolasÄ«t no tÄs. VairÄkas desmitgades lielÄkajÄ daÄ¼Ä disku tika izmantoti 512 baitu sektori. MÅ«sdienÄs lielÄkÄ daļa disku ir konfigurÄti 4 KiB sektoriem, un daži ā Ä«paÅ”i SSD ā ir konfigurÄti 8 KiB vai pat lielÄkiem sektoriem.
ZFS ir funkcija, kas ļauj manuÄli iestatÄ«t sektora izmÄru. Å is Ä«paÅ”ums ashift
. Nedaudz mulsinoÅ”i, ashift ir divu jauda. PiemÄram, ashift=9
nozÄ«mÄ sektora lielumu 2^9 jeb 512 baiti.
ZFS pieprasa operÄtÄjsistÄmai detalizÄtu informÄciju par katru blokierÄ«ci, kad tÄ tiek pievienota jaunam vdev, un teorÄtiski automÄtiski iestata ashift atbilstoÅ”i, pamatojoties uz Å”o informÄciju. DiemžÄl daudzi diskdziÅi melo par sava sektora lielumu, lai saglabÄtu saderÄ«bu ar Windows XP (kas nespÄja saprast diskus ar cita lieluma sektoru).
Tas nozÄ«mÄ, ka ZFS administratoram ir ļoti ieteicams zinÄt savu ierÄ«Äu faktisko sektora lielumu un manuÄli iestatÄ«t ashift
. Ja pÄrbÄ«de ir iestatÄ«ta pÄrÄk maza, lasÄ«Å”anas/rakstÄ«Å”anas operÄciju skaits astronomiski palielinÄs. TÄtad 512 baitu "sektoru" rakstÄ«Å”ana reÄlam 4 KiB sektoram nozÄ«mÄ, ka ir jÄieraksta pirmais "sektors", pÄc tam jÄizlasa 4 KiB sektors, jÄmaina tas ar otru 512 baitu "sektoru", jÄraksta atpakaļ uz jauno. 4 KiB sektors un tÄ tÄlÄk katram ierakstam.
ReÄlajÄ pasaulÄ Å”Äds sods ietekmÄ Samsung EVO SSD, uz kuriem tas bÅ«tu jÄattiecina ashift=13
, taÄu Å”ie SSD melo par to sektora lielumu, un tÄpÄc noklusÄjuma vÄrtÄ«ba ir iestatÄ«ta uz ashift=9
. Ja vien pieredzÄjis sistÄmas administrators nemaina Å”o iestatÄ«jumu, Å”is SSD darbojas lÄnÄk parastais magnÄtiskais HDD.
SalÄ«dzinÄjumam, par lielu ashift
soda praktiski nav. Nav reÄla veiktspÄjas trÄpÄ«juma, un neizmantotÄs vietas pieaugums ir bezgalÄ«gi neliels (vai nulle, ja ir iespÄjota saspieÅ”ana). TÄpÄc mÄs ļoti iesakÄm instalÄt pat tos diskus, kas izmanto 512 baitu sektorus ashift=12
vai pat ashift=13
ar pÄrliecÄ«bu raudzÄ«ties nÄkotnÄ.
ÄŖpaÅ”ums ashift
ir instalÄta katrai virtuÄlajai ierÄ«cei vdev, un ne baseinam, kÄ daudzi cilvÄki kļūdaini domÄ - un pÄc instalÄÅ”anas nemainÄs. Ja nejauÅ”i trÄpÄ«ja ashift
Kad baseinam pievienojat jaunu vdev, jÅ«s esat neatgriezeniski piesÄrÅojis Å”o baseinu ar zemas veiktspÄjas ierÄ«ci, un parasti nav citas iespÄjas, kÄ iznÄ«cinÄt baseinu un sÄkt no jauna. Pat vdev dzÄÅ”ana neglÄbs jÅ«s no bojÄta iestatÄ«juma ashift
!
KopÄÅ”anas uz rakstÄ«Å”anas mehÄnisms
Ja parastajai failu sistÄmai ir jÄpÄrraksta dati, tÄ modificÄ katru bloku, kur tas atrodas
KopÄÅ”anas un rakstÄ«Å”anas failu sistÄma ieraksta jaunu bloka versiju un pÄc tam atbloÄ·Ä veco versiju
Abstrakti, ja mÄs ignorÄjam bloku faktisko fizisko izvietojumu, mÅ«su ādatu komÄtaā vienkÄrÅ”ojas lÄ«dz ādatu tÄrpamā, kas pÄrvietojas no kreisÄs puses uz labo pieejamÄs telpas kartÄ.
Tagad mÄs varam iegÅ«t labu priekÅ”statu par kopÄÅ”anas un rakstÄ«Å”anas momentuzÅÄmumu darbÄ«bu ā katrs bloks var piederÄt vairÄkiem momentuzÅÄmumiem, un tas saglabÄsies, lÄ«dz tiks iznÄ«cinÄti visi saistÄ«tie momentuzÅÄmumi.
Copy on Write (CoW) mehÄnisms ir galvenais pamats tam, kas padara ZFS par tik pÄrsteidzoÅ”u sistÄmu. PamatjÄdziens ir vienkÄrÅ”s ā ja jÅ«s lÅ«dzat tradicionÄlajai failu sistÄmai mainÄ«t failu, tÄ darÄ«s tieÅ”i to, ko lÅ«dzÄt. Ja prasÄ«sit kopÄÅ”anas-uzrakstÄ«Å”anas failu sistÄmai izdarÄ«t to paÅ”u, tÄ pateiks ālabiā, taÄu tÄ jums melos.
TÄ vietÄ kopÄÅ”anas un rakstÄ«Å”anas failu sistÄma ieraksta jaunu modificÄtÄ bloka versiju un pÄc tam atjaunina faila metadatus, lai atsaistÄ«tu veco bloku un saistÄ«tu to ar jauno bloku, kuru tikko uzrakstÄ«jÄt.
VecÄ bloka atsaistÄ«Å”ana un jaunÄ bloka saistÄ«Å”ana tiek veikta ar vienu darbÄ«bu, tÄpÄc to nevar pÄrtraukt - ja atiestatÄ«sit baroÅ”anu pÄc tam, kad tas ir noticis, jums ir jauna faila versija, un, ja jÅ«s atiestatÄt baroÅ”anu iepriekÅ”, tad jums ir vecÄ versija. JebkurÄ gadÄ«jumÄ failu sistÄmÄ nebÅ«s konfliktu.
KopÄÅ”ana uz rakstÄ«Å”anas ZFS notiek ne tikai failu sistÄmas lÄ«menÄ«, bet arÄ« diska pÄrvaldÄ«bas lÄ«menÄ«. Tas nozÄ«mÄ, ka ZFS ierakstÄ nav jutÄ«gs pret atstarpÄm (
ZIL: ZFS nodomu žurnÄls
ZFS apstrÄdÄ sinhrono ierakstu Ä«paÅ”Ä veidÄ - tas uz laiku, bet nekavÄjoties saglabÄ tos ZIL, pirms vÄlÄk tos pastÄvÄ«gi ieraksta kopÄ ar asinhronajiem rakstiem.
Parasti ZIL ierakstÄ«tie dati nekad netiek atkÄrtoti lasÄ«ti. Bet tas ir iespÄjams pÄc sistÄmas kļūmes
SLOG jeb sekundÄrÄ LOG ierÄ«ce ir vienkÄrÅ”i Ä«paÅ”s un vÄlams ļoti Ätrs vdev, kurÄ ZIL var glabÄt atseviŔķi no galvenÄs krÄtuves.
PÄc avÄrijas visi netÄ«rie dati ZIL tiek atskaÅoti atkÄrtoti ā Å”ajÄ gadÄ«jumÄ ZIL ir ieslÄgts SLOG, tÄpÄc tas tiek atskaÅots tur.
Ir divas galvenÄs rakstÄ«Å”anas kategorijas: sinhronÄ (sinhronÄ) un asinhronÄ (asinhronÄ). LielÄkajai daļai darba slodžu lielÄkÄ daļa ierakstu ir asinhroni ā failu sistÄma ļauj tos apkopot un izdot pa daļÄm, samazinot sadrumstalotÄ«bu un ievÄrojami palielinot caurlaidspÄju.
Sinhronie ieraksti ir pavisam cita lieta. Kad lietojumprogramma pieprasa sinhronu rakstÄ«Å”anu, tÄ paziÅo failu sistÄmai: "Jums tas ir jÄievieto nemainÄ«gÄ atmiÅÄ tieÅ”i tagad, un lÄ«dz tam es neko vairÄk nevaru darÄ«t. TÄpÄc sinhronÄ rakstÄ«Å”ana nekavÄjoties jÄievieto diskÄ ā un, ja tas palielina sadrumstalotÄ«bu vai samazina caurlaidspÄju, lai tÄ bÅ«tu.
ZFS apstrÄdÄ sinhrono rakstÄ«Å”anu savÄdÄk nekÄ parastÄs failu sistÄmas ā tÄ vietÄ, lai nekavÄjoties izskalotu tos parastajÄ krÄtuvÄ, ZFS ievieto tos Ä«paÅ”Ä krÄtuves apgabalÄ, ko sauc par ZFS nolÅ«ku žurnÄlu jeb ZIL. ViltÄ«ba ir tÄda, ka Å”ie ieraksti arÄ« paliek atmiÅÄ, tiek apkopoti kopÄ ar parastajiem asinhronÄs rakstÄ«Å”anas pieprasÄ«jumiem, lai vÄlÄk tiktu izskaloti krÄtuvÄ kÄ pilnÄ«gi parastas TXG (transakciju grupas).
NormÄlas darbÄ«bas laikÄ ZIL tiek rakstÄ«ts un nekad vairs netiek lasÄ«ts. Kad pÄc dažiem mirkļiem ZIL ieraksti tiek ievietoti galvenajÄ krÄtuvÄ parastajos TXG no RAM, tie tiek atdalÄ«ti no ZIL. VienÄ«gais gadÄ«jums, kad kaut kas tiek nolasÄ«ts no ZIL, ir, importÄjot pÅ«lu.
Ja notiek ZFS kļūme ā operÄtÄjsistÄmas avÄrija vai strÄvas padeves pÄrtraukums ā, kamÄr ZIL ir dati, Å”ie dati tiks nolasÄ«ti nÄkamÄs pÅ«la importÄÅ”anas laikÄ (piemÄram, kad tiek restartÄta kļūmjpÄrlÄces sistÄma). Viss, kas atrodas ZIL, tiks nolasÄ«ts, sagrupÄts TXG, pievienots galvenajam veikalam un pÄc tam importÄÅ”anas procesa laikÄ atdalÄ«ts no ZIL.
Viena no vdev palÄ«gu klasÄm tiek saukta par LOG vai SLOG, sekundÄro LOG ierÄ«ci. Tam ir viens uzdevums - nodroÅ”inÄt baseinu ar atseviŔķu un, vÄlams, daudz ÄtrÄku, ar ļoti augstu rakstÄ«Å”anas pretestÄ«bu, vdev ierÄ«ci ZIL glabÄÅ”anai, nevis glabÄt ZIL galvenajÄ vdev krÄtuvÄ. Pats ZIL uzvedas vienÄdi neatkarÄ«gi no uzglabÄÅ”anas vietas, bet, ja vdev ar LOG ir ļoti augsta rakstÄ«Å”anas veiktspÄja, tad sinhronÄ rakstÄ«Å”ana bÅ«s ÄtrÄka.
Vdev ar LOG pievienoÅ”ana pÅ«lam nedarbojas nevar uzlabot asinhronÄs rakstÄ«Å”anas veiktspÄju - pat ja jÅ«s piespiežat visas rakstÄ«Å”anas uz ZIL ar zfs set sync=always
, tie joprojÄm bÅ«s saistÄ«ti ar galveno TXG krÄtuvi tÄdÄ paÅ”Ä veidÄ un tÄdÄ paÅ”Ä tempÄ kÄ bez žurnÄla. VienÄ«gais tieÅ”ais veiktspÄjas uzlabojums ir sinhronais rakstÄ«Å”anas latentums (jo lielÄks žurnÄla Ätrums padara darbÄ«bas ÄtrÄkas sync
).
TomÄr vidÄ, kurÄ jau ir nepiecieÅ”ams daudz sinhrono ierakstu, vdev LOG var netieÅ”i paÄtrinÄt asinhrono rakstÄ«Å”anu un nekeÅ”atmiÅÄ saglabÄto lasÄ«Å”anu. ZIL ierakstu izkrauÅ”ana atseviÅ”Ä·Ä vdev LOG nozÄ«mÄ mazÄku strÄ«du par IOPS primÄrajÄ krÄtuvÄ, kas zinÄmÄ mÄrÄ uzlabo visu lasÄ«Å”anas un rakstÄ«Å”anas veiktspÄju.
MomentuzÅÄmumi
KopÄÅ”anas un rakstÄ«Å”anas mehÄnisms ir arÄ« nepiecieÅ”ams pamats ZFS atomu momentuzÅÄmumiem un pakÄpeniskai asinhronai replikÄcijai. AktÄ«vajai failu sistÄmai ir rÄdÄ«tÄja koks, kas atzÄ«mÄ visus ierakstus ar paÅ”reizÄjiem datiem ā veicot momentuzÅÄmumu, jÅ«s vienkÄrÅ”i izveidojat Ŕī rÄdÄ«tÄja koka kopiju.
Kad ieraksts tiek pÄrrakstÄ«ts aktÄ«vajÄ failu sistÄmÄ, ZFS vispirms ieraksta jauno bloka versiju neizmantotÄ vietÄ. PÄc tam atdala bloka veco versiju no paÅ”reizÄjÄs failu sistÄmas. Bet, ja kÄds momentuzÅÄmums atsaucas uz vecu bloku, tas joprojÄm paliek nemainÄ«gs. Vecais bloks faktiski netiks atjaunots kÄ brÄ«va vieta, kamÄr netiks iznÄ«cinÄti visi momentuzÅÄmumi, kas atsaucas uz Å”o bloku!
ReplikÄcija
Mana Steam bibliotÄka 2015. gadÄ bija 158 GiB, un tajÄ bija 126 927 faili. Tas ir diezgan tuvu rsync optimÄlajai situÄcijai - ZFS replikÄcija tÄ«klÄ bija "tikai" par 750% ÄtrÄka.
TajÄ paÅ”Ä tÄ«klÄ viena 40 GB Windows 7 virtuÄlÄs maŔīnas attÄla faila replicÄÅ”ana ir pavisam cits stÄsts. ZFS replikÄcija ir 289 reizes ÄtrÄka nekÄ rsync ā vai ātikaiā 161 reizi ÄtrÄka, ja esat pietiekami gudrs, lai izsauktu rsync, izmantojot slÄdzi --inplace.
Kad VM attÄls tiek mÄrogots, rsync problÄmas ar to mÄrogo. 1,9 TiB izmÄrs nav tik liels mÅ«sdienu virtuÄlÄs maŔīnas attÄlam, taÄu tas ir pietiekami liels, lai ZFS replikÄcija bÅ«tu 1148 reizes ÄtrÄka nekÄ rsync, pat ar argumentu rsync --inplace.
Kad bÅ«sit sapratis, kÄ darbojas momentuzÅÄmumi, bÅ«s viegli saprast replikÄcijas bÅ«tÄ«bu. TÄ kÄ momentuzÅÄmums ir vienkÄrÅ”i ierakstu norÄdes koks, no tÄ izriet, ka, ja mÄs to darÄm zfs send
momentuzÅÄmums, tad mÄs nosÅ«tÄm Å”o koku un visus ar to saistÄ«tos ierakstus. Kad mÄs izturÄsim Å”o zfs send
Š² zfs receive
mÄrÄ·a objektÄ tas ieraksta gan faktisko bloka saturu, gan rÄdÄ«tÄju koku, kas atsaucas uz blokiem uz mÄrÄ·a datu kopu.
OtrajÄ viss kļūst vÄl interesantÄks zfs send
. Tagad mums ir divas sistÄmas, no kurÄm katra satur poolname/datasetname@1
, un jÅ«s uzÅemat jaunu momentuzÅÄmumu poolname/datasetname@2
. TÄpÄc jÅ«su avota baseinÄ datasetname@1
Šø datasetname@2
, un mÄrÄ·a pÅ«lÄ ir tikai pirmais momentuzÅÄmums datasetname@1
.
Jo starp avotu un mÄrÄ·i mums ir kopÄ«gs momentuzÅÄmums datasetname@1
, mÄs to varam papildu zfs send
tam virsÅ«. Kad mÄs sakÄm sistÄmai zfs send -i poolname/datasetname@1 poolname/datasetname@2
, tas salÄ«dzina divus rÄdÄ«tÄju kokus. Visas norÄdes, kas pastÄv tikai @2
, protams, attiecas uz jauniem blokiem ā tÄpÄc mums bÅ«s nepiecieÅ”ams Å”o bloku saturs.
AttÄlÄ sistÄmÄ, apstrÄde pakÄpeniski send
tikpat vienkÄrÅ”i. Vispirms mÄs ierakstÄm visus straumÄ iekļautos jaunos ierakstus send
un pÄc tam pievienojiet norÄdes Å”iem blokiem. Voila, mums ir @2
jaunajÄ sistÄmÄ!
ZFS asinhronÄ inkrementÄlÄ replikÄcija ir milzÄ«gs uzlabojums salÄ«dzinÄjumÄ ar iepriekÅ”ÄjÄm metodÄm, kas nav balstÄ«tas uz momentuzÅÄmumiem, piemÄram, rsync. Abos gadÄ«jumos tiek pÄrsÅ«tÄ«ti tikai mainÄ«tie dati, taÄu vispirms ir jÄveic rsync lasÄ«t no diska visus datus abÄs pusÄs, lai pÄrbaudÄ«tu summu un salÄ«dzinÄtu to. Turpretim ZFS replikÄcija nelasa neko citu kÄ tikai rÄdÄ«tÄju kokus un visus blokus, kas nav attÄloti kopÄjÄ momentuzÅÄmumÄ.
IebÅ«vÄta kompresija
KopÄÅ”anas-uz-rakstÄ«Å”anas mehÄnisms arÄ« vienkÄrÅ”o iebÅ«vÄto saspieÅ”anas sistÄmu. TradicionÄlÄ failu sistÄmÄ saspieÅ”ana ir problemÄtiska - gan vecÄ versija, gan jaunÄ mainÄ«to datu versija atrodas vienÄ telpÄ.
Ja uzskatÄt, ka faila vidÅ« ir datu fragments, kas sÄk darboties kÄ nulles megabaits no 0x00000000 un tÄ tÄlÄk, to ir ļoti viegli saspiest vienÄ diska sektorÄ. Bet kas notiks, ja Å”o nulles megabaitu aizstÄsim ar megabaitu nesaspiežamu datu, piemÄram, JPEG vai pseidogadÄ«juma troksni? PÄkÅ”Åi Å”im datu megabaitam bÅ«s nepiecieÅ”ams nevis viens, bet 256 4 KiB sektori, un Å”ajÄ diska vietÄ ir rezervÄts tikai viens sektors.
ZFS Ŕīs problÄmas nav, jo modificÄtie ieraksti vienmÄr tiek ierakstÄ«ti neizmantotÄ vietÄ - sÄkotnÄjais bloks aizÅem tikai vienu 4 KiB sektoru, un jauna ierakstÄ«Å”ana aizÅems 256, taÄu tÄ nav problÄma - nesen modificÄts fragments no faila "vidus" tiktu ierakstÄ«ts neizmantotÄ vietÄ neatkarÄ«gi no tÄ, vai tÄ lielums ir mainÄ«jies vai nÄ, tÄpÄc tÄ ir pilnÄ«gi normÄla situÄcija ZFS.
IebÅ«vÄtÄ ZFS saspieÅ”ana pÄc noklusÄjuma ir atspÄjota, un sistÄma piedÄvÄ pievienojamus algoritmus, tostarp LZ4, gzip (1-9), LZJB un ZLE.
- LZ4 ir straumÄÅ”anas algoritms, kas piedÄvÄ ÄrkÄrtÄ«gi Ätru saspieÅ”anu un dekompresiju, kÄ arÄ« veiktspÄjas priekÅ”rocÄ«bas vairumam lietoÅ”anas gadÄ«jumu ā pat ar diezgan lÄniem CPU.
- GZIP ir cienÄ«jams algoritms, ko zina un mÄ«l visi Unix lietotÄji. To var ieviest ar saspieÅ”anas lÄ«meni no 1 lÄ«dz 9, palielinot saspieÅ”anas pakÄpi un CPU lietojumu, tuvojoties 9. lÄ«menim. Algoritms ir labi piemÄrots visiem teksta (vai citiem ļoti saspiežamiem) lietoÅ”anas gadÄ«jumiem, taÄu bieži vien rada CPU problÄmas pretÄjÄ gadÄ«jumÄ - izmantojiet to piesardzÄ«gi, Ä«paÅ”i augstÄkÄ lÄ«menÄ«.
- LZJB - oriÄ£inÄls algoritms ZFS. Tas ir novecojis un vairs nevajadzÄtu lietot, LZ4 ir visÄdÄ ziÅÄ pÄrÄks.
- SLIKTI ā nulles lÄ«meÅa kodÄjums, nulles lÄ«meÅa kodÄjums. Tas vispÄr neskar parastos datus, bet saspiež lielas nulles. NoderÄ«ga pilnÄ«bÄ nesaspiežamÄm datu kopÄm (piemÄram, JPEG, MP4 vai citiem jau saspiestiem formÄtiem), jo tÄ ignorÄ nesaspiežamos datus, bet saspiež neizmantoto vietu iegÅ«tajos ierakstos.
MÄs iesakÄm LZ4 kompresiju gandrÄ«z visos lietoÅ”anas gadÄ«jumos; veiktspÄjas sods, strÄdÄjot ar nesaspiežamiem datiem, ir ļoti mazs, un izaugsmi tipisku datu veiktspÄja ir nozÄ«mÄ«ga. VirtuÄlÄs maŔīnas attÄla kopÄÅ”ana jaunai Windows operÄtÄjsistÄmas instalÄÅ”anai (svaigi instalÄta operÄtÄjsistÄma, pagaidÄm nav datu) ar compression=lz4
pagÄja par 27% ÄtrÄk nekÄ ar compression=none
Uz
ARC - adaptÄ«vÄ nomaiÅas keÅ”atmiÅa
ZFS ir vienÄ«gÄ mums zinÄmÄ modernÄ failu sistÄma, kas izmanto savu lasÄ«Å”anas keÅ”atmiÅas mehÄnismu, nevis paļaujas uz operÄtÄjsistÄmas lapas keÅ”atmiÅu, lai saglabÄtu nesen lasÄ«to bloku kopijas RAM.
Lai gan vietÄjÄ keÅ”atmiÅa nav bez problÄmÄm, ZFS nevar atbildÄt uz jauniem atmiÅas pieŔķirÅ”anas pieprasÄ«jumiem tikpat Ätri kÄ kodols, tÄpÄc jauns izsaukums malloc()
atmiÅas pieŔķirÅ”ana var neizdoties, ja tai nepiecieÅ”ama RAM, ko paÅ”laik aizÅem ARC. Bet ir labi iemesli, lai vismaz Å”obrÄ«d izmantotu savu keÅ”atmiÅu.
Visas zinÄmÄs mÅ«sdienu operÄtÄjsistÄmas, tostarp MacOS, Windows, Linux un BSD, izmanto LRU (vismazÄk izmantoto) algoritmu, lai ieviestu lapas keÅ”atmiÅu. Å is ir primitÄ«vs algoritms, kas pÄc katras lasÄ«Å”anas nospiež keÅ”atmiÅÄ saglabÄto bloku "rindas augÅ”daļÄ" un pÄc vajadzÄ«bas nospiež blokus "rindas apakÅ”Ä", lai pievienotu jaunas keÅ”atmiÅas kļūdas (blokus, kas bÅ«tu jÄlasa no diska, nevis no keÅ”atmiÅas) uz augÅ”u.
Parasti algoritms darbojas labi, taÄu sistÄmÄs ar lielÄm darba datu kopÄm LRU viegli noved pie sagrauÅ”anas ā tiek izspiesti bieži nepiecieÅ”amie bloki, lai atbrÄ«votu vietu blokiem, kas nekad vairs netiks nolasÄ«ti no keÅ”atmiÅas.
TÄ visa gala rezultÄts ir keÅ”atmiÅa ar daudz augstÄku trÄpÄ«jumu attiecÄ«bu ā attiecÄ«ba starp keÅ”atmiÅas trÄpÄ«jumiem (nolasÄ«ti no keÅ”atmiÅas) un garÄm (nolasÄ«ti no diska). Å Ä« ir ÄrkÄrtÄ«gi svarÄ«ga statistika ā ne tikai paÅ”i keÅ”atmiÅas trÄpÄ«jumi tiek apkalpoti par lieluma kÄrtÄm ÄtrÄk, bet arÄ« keÅ”atmiÅas kļūdas var tikt apkalpotas ÄtrÄk, jo jo vairÄk ir keÅ”atmiÅas trÄpÄ«jumu, jo mazÄk vienlaicÄ«gu pieprasÄ«jumu diskÄ un mazÄks latentums Å”iem atlikuÅ”ajiem izlaidumiem. kas jÄapkopj ar disku.
SecinÄjums
Tagad, kad esam apskatÄ«juÅ”i ZFS pamata semantiku ā kÄ darbojas kopÄÅ”ana un rakstÄ«Å”ana, kÄ arÄ« attiecÄ«bas starp krÄtuves pÅ«liÅiem, virtuÄlajÄm ierÄ«cÄm, blokiem, sektoriem un failiem ā esam gatavi apspriest reÄlo veiktspÄju ar reÄli skaitļi.
NÄkamajÄ daÄ¼Ä mÄs apskatÄ«sim spoguļattÄlu vdev un RAIDz kopu faktisko veiktspÄju, salÄ«dzinot savÄ starpÄ, kÄ arÄ« salÄ«dzinÄjumÄ ar tradicionÄlajÄm Linux kodola RAID topoloÄ£ijÄm, kuras esam pÄrbaudÄ«juÅ”i.
SÄkumÄ mÄs vÄlÄjÄmies aptvert tikai pamata lietas - paÅ”as ZFS topoloÄ£ijas, bet pÄc tam tÄds MÄs bÅ«sim gatavi runÄt par progresÄ«vÄku ZFS konfigurÄciju un noregulÄÅ”anu, tostarp par vdev papildu tipu izmantoÅ”anu, piemÄram, L2ARC, SLOG un Special Allocation.
Avots: www.habr.com