TrĂŒkkök nagy szĂĄmĂș aprĂł fĂĄjlok kezelĂ©sĂ©hez

A cikk ötlete vĂ©letlenĂŒl szĂŒletett egy kommentĂĄrban folyĂł vitĂĄbĂłl. „NĂ©hĂĄny szĂł az inode-rĂłl”.

TrĂŒkkök nagy szĂĄmĂș aprĂł fĂĄjlok kezelĂ©sĂ©hez

A belsƑ sajĂĄtossĂĄga szolgĂĄltatĂĄsaink mƱködĂ©sĂ©nek, hogy hatalmas mennyisĂ©gƱ kicsi fĂĄjl tĂĄrolĂĄsĂĄval foglalkozunk. Jelenleg körĂŒlbelĂŒl több szĂĄz terabĂĄjt ilyen adatunk van. RĂĄakadtunk nĂ©hĂĄny nyilvĂĄnvalĂł Ă©s nem annyira nyilvĂĄnvalĂł nehĂ©zsĂ©gre, de sikeresen megoldottuk azokat.

Ezért megosztom tapasztalatainkat, håtha valakinek hasznos lesz.

ElsƑ problĂ©ma: „Nincs elĂ©g hely az eszközön”

Mint a fent említett cikkben említettem, a probléma az, hogy a fåjlrendszerben van szabad blokk, azonban az inode-k elfogytak.

Az hasznĂĄlt Ă©s szabad inodok szĂĄmĂĄt a következƑ paranccsal lehet ellenƑrizni: df -ih:

TrĂŒkkök nagy szĂĄmĂș aprĂł fĂĄjlok kezelĂ©sĂ©hez

Nem fogom Ășjra elmondani a cikket, ha röviden szeretnĂ©m összefoglalni, a lemezen vannak blokkok közvetlenĂŒl az adatok szĂĄmĂĄra, valamint blokkok a meta-informĂĄciĂłk szĂĄmĂĄra, ezek az inode-ok (index csomĂłpont). SzĂĄmuk a fĂĄjlrendszer inicializĂĄlĂĄsakor van megadva (az ext2-rƑl Ă©s annak örököseirƑl van szĂł), Ă©s azutĂĄn nem vĂĄltozik. Az adatok Ă©s az inode-ok közötti egyensĂșlyt statisztikai adatok alapjĂĄn szĂĄmoljĂĄk ki, azonban a mi esetĂŒnkben, ahol sok kicsi fĂĄjl van, az egyensĂșlynak inkĂĄbb az inode-ok szĂĄmĂĄnak irĂĄnyĂĄba kell eltolĂłdnia - ezekbƑl több kell.

Linuxban mĂĄr elƑre lĂĄttak kĂŒlönbözƑ egyensĂșlyozĂĄsi lehetƑsĂ©geket, Ă©s ezek a kalkulĂĄlt konfigurĂĄciĂłk a /etc/mke2fs.conf.
fĂĄjlban talĂĄlhatĂłk.

Íme nĂ©hĂĄny pĂ©lda a fĂĄjlbĂłl:

    small = {
        blocksize = 1024
        inode_size = 128
        inode_ratio = 4096
    }

    big = {
        inode_ratio = 32768
    }

    largefile = {
        inode_ratio = 1048576
        blocksize = -1
    }

A megfelelƑ felhasznĂĄlĂĄsi lehetƑsĂ©get az „-T” opciĂłval vĂĄlaszthatjuk ki a mke2fs hĂ­vĂĄsĂĄnĂĄl. Ezen kĂ­vĂŒl kĂ©zi paramĂ©terezĂ©st is lehetƑsĂ©ges, ha nincs kĂ©sz megoldĂĄs.

Tovåbbi részletek talålhatók a mke2fs.conf és mke2fs.

A fent emlĂ­tett cikkben nem Ă©rintett sajĂĄtossĂĄg - megadhatĂł az adatok blokkjĂĄnak mĂ©rete. NyilvĂĄnvalĂł, hogy nagy fĂĄjlok esetĂ©n Ă©rdemesebb nagyobb blokkmĂ©retet vĂĄlasztani, mĂ­g kisebb fĂĄjlok esetĂ©n a kisebb a megfelelƑ.

Ugyanakkor Ă©rdemes figyelembe venni egy Ă©rdekes sajĂĄtossĂĄgot, mint a processzor architektĂșrĂĄja.
Valamikor azt fontolgattam, hogy a nagyobb fĂ©nykĂ©pekhez nagyobb blokk mĂ©ret lenne szĂŒksĂ©ges. Ez mĂ©g otthoni körĂŒlmĂ©nyek között törtĂ©nt, egy WD nevĂ©vel ellĂĄtott hĂĄzi tĂĄrolĂłn, ARM architektĂșrĂĄn. Nem sokĂĄig gondolkodtam, Ă©s a blokk mĂ©retet 8k-ra vagy 16k-ra ĂĄllĂ­tottam a standard 4k helyett, miutĂĄn elƑször lemĂ©rtem a megtakarĂ­tĂĄst. És minden csodĂĄlatosan mƱködött, egĂ©szen addig, amĂ­g magĂĄnak a tĂĄrolĂłnak nem lett volna hibĂĄja, miközben a lemez Ă©pen maradt. Amikor a lemezt egy klasszikus szĂĄmĂ­tĂłgĂ©pbe ĂĄllĂ­tottam, amelyben egy hagyomĂĄnyos Intel processzor volt, meglepetĂ©s Ă©rt: nem tĂĄmogatott blokk mĂ©ret. Bajban voltunk. Az adatok megvoltak, minden rendben, de olvasni lehetetlen volt. Az i386 processzorok Ă©s hasonlĂłk nem tudnak olyan blokk mĂ©retekkel dolgozni, amelyek nem felelnek meg a memĂłriaoldal mĂ©retĂ©nek, ami pontosan 4k. ÖsszessĂ©gĂ©ben az ĂŒgy vĂ©gĂŒl felhasznĂĄlĂłi tĂ©rbƑl szĂĄrmazĂł segĂ©dprogramokkal zĂĄrult, minden lassĂș Ă©s szomorĂș volt, de az adatokat megmentettĂŒk. Akinek Ă©rdekes – keressen rĂĄ a segĂ©dprogram nevĂ©re. fuseext2. TanulsĂĄg: vagy minden esetet elƑre ĂĄtgondolni, vagy ne Ă©pĂ­tsĂŒnk magunkbĂłl szuperhƑst, Ă©s hasznĂĄljuk a hĂĄztartĂĄsok szĂĄmĂĄra szolgĂĄlĂł szabvĂĄnyos beĂĄllĂ­tĂĄsokat.

UPD. Egy felhasznĂĄlĂłi megjegyzĂ©s alapjĂĄn berez kijavĂ­tom, hogy az i386 esetĂ©ben a blokk mĂ©ret nem haladhatja meg a 4k-t, de nem szĂŒksĂ©ges, hogy pontosan 4k legyen, tehĂĄt 1k Ă©s 2k is megengedett.

Tehåt, hogyan oldottuk meg a problémåkat.

ElƑször is, a problĂ©mĂĄval akkor szembesĂŒltĂŒnk, amikor a sok terabĂĄjtos lemez tele volt adatokkal, Ă©s a fĂĄjlrendszer konfigurĂĄciĂłjĂĄt nem tudtuk megvĂĄltoztatni.

MĂĄsodsorban sĂŒrgƑs megoldĂĄsra volt szĂŒksĂ©g.

VĂ©gĂŒl arra a következtetĂ©sre jutottunk, hogy vĂĄltoztatnunk kell az egyensĂșlyon, csökkentve a fĂĄjlok szĂĄmĂĄt.
A fĂĄjlok szĂĄmĂĄnak csökkentĂ©sĂ©re Ășgy döntöttĂŒnk, hogy az összes fĂĄjlt egy közös archĂ­vumba helyezzĂŒk. Figyelembe vĂ©ve a specifikĂĄciĂłnkat, mindent egy archĂ­vumba gyƱjtöttĂŒnk egy adott idƑszakon belĂŒl, Ă©s naponta Ă©jszaka cron feladatot hajtottunk vĂ©gre az archivĂĄlĂĄsra.

ZIP-archĂ­vum lett kivĂĄlasztva. A korĂĄbbi cikk megjegyzĂ©sei között a tar javasolt volt, de ennek van egy nehĂ©zsĂ©ge: nem rendelkezik tĂĄblĂĄzattal, Ă©s a fĂĄjlok következetesen helyezkednek el benne (nem vĂ©letlenĂŒl hĂ­vjĂĄk «tar»-nak, ami a «Tape Archive» rövidĂ­tĂ©se, a szalagos tĂĄrolĂłk öröksĂ©ge), tehĂĄt ha a fĂĄjlt az archĂ­vum vĂ©gĂ©n szeretnĂ©nk olvasni - az archĂ­vum teljes ĂĄtolvasĂĄsa szĂŒksĂ©ges, mivel nincs eltolĂĄs az egyes fĂĄjlokhoz kĂ©pest az archĂ­vum elejĂ©hez. EzĂ©rt ez egy hosszĂș mƱvelet. A ZIP sokkal jobb: rendelkezik a keresett tĂĄblĂĄzattal Ă©s a fĂĄjlok eltolĂĄsĂĄval az archĂ­vum belsejĂ©ben, Ă©s a hozzĂĄfĂ©rĂ©si idƑ minden fĂĄjlhoz nem fĂŒgg a helyzetĂ©tƑl. A mi esetĂŒnkben a „0” tömörĂ­tĂ©si opciĂłt is be lehetett ĂĄllĂ­tani, mivel az összes fĂĄjl elƑre tömörĂ­tve volt gzip formĂĄtumban.

Az ĂŒgyfelek az nginx-en keresztĂŒl kĂŒldik le a fĂĄjlokat, Ă©s a rĂ©gi API szerint csak a fĂĄjl nevĂ©t kell megadni, pĂ©ldĂĄul az alĂĄbbiak szerint:

http://www.server.com/hydra/20170416/0453/3bd24ae7-1df4-4d76-9d28-5b7fcb7fd8e5

A fåjlok futås közbeni kicsomagolåsåhoz megtalåltuk és csatlakoztattuk az nginx-unzip-module modult (https://github.com/youzee/nginx-unzip-module) és beållítottunk két upstream-et.

Ennek eredményeként ilyen konfiguråció jött létre:

TrĂŒkkök nagy szĂĄmĂș aprĂł fĂĄjlok kezelĂ©sĂ©hez

A két hoszt a beållítåsokban így nézett ki:

server {
  listen *:8081;

  location / {
    root      /home/filestorage;
  }
}

server {
  listen *:8082;

  location ~ ^/hydra/(d+)/(\d+)/(.*)$ {
    root      /home/filestorage;
    file_in_unzip_archivefile "/home/filestorage/hydra/$1/$2.zip";
    file_in_unzip_extract "$2/$3";
    file_in_unzip;
  }
}

És a upstream konfigurĂĄciĂł a magasabb szintƱ nginx-en:

upstream storage {
  server server.com:8081;
  server server.com:8082;
}

Hogy mƱködik:

  • Az ĂŒgyfĂ©l a front nginx-re megy
  • A front nginx megprĂłbĂĄlja közvetlenĂŒl a fĂĄjlt kiszolgĂĄlni az elsƑ upstream-bƑl, azaz közvetlenĂŒl a fĂĄjlrendszerbƑl
  • Ha a fĂĄjl nem lĂ©tezik, megprĂłbĂĄlja kiszolgĂĄlni a mĂĄsodik upstream-bƑl, amely megprĂłbĂĄlja megtalĂĄlni a fĂĄjlt az archĂ­vumban

A måsodik probléma: megint «No space left on device»

Ez a mĂĄsodik problĂ©ma, amellyel akkor szembesĂŒltĂŒnk, amikor sok fĂĄjl talĂĄlhatĂł a könyvtĂĄrban.
MegprĂłbĂĄlunk lĂ©trehozni egy fĂĄjlt, a rendszer azt panaszolja, hogy nincs hely. MegvĂĄltoztatjuk a fĂĄjl nevĂ©t, Ă©s Ășjra megprĂłbĂĄljuk lĂ©trehozni.

SikerĂŒl.

KörĂŒlbelĂŒl Ă­gy nĂ©z ki:

TrĂŒkkök nagy szĂĄmĂș aprĂł fĂĄjlok kezelĂ©sĂ©hez

Az inodes ellenƑrzĂ©se nem tanĂșsĂ­tott semmit - sok szabad van belƑlĂŒk.
A hely ellenƑrzĂ©se - ugyanaz.
Arra gondoltunk, hogy talĂĄn tĂșl sok fĂĄjl van a könyvtĂĄrban, Ă©s erre van korlĂĄtozĂĄs, de ismĂ©t nem: A könyvtĂĄron belĂŒli fĂĄjlok maximĂĄlis szĂĄma: ~1,3 × 10^20

És egy fĂĄjlt is lĂ©tre lehet hozni, ha megvĂĄltoztatjuk a nevĂ©t.
Tehåt a probléma a fåjl nevében van.

A tovĂĄbbi keresgĂ©lĂ©s azt mutatta, hogy a problĂ©ma a könyvtĂĄri index Ă©pĂ­tĂ©se sorĂĄn alkalmazott hash algoritmusban rejlik, sok fĂĄjl esetĂ©n ĂŒtközĂ©sek lĂ©pnek fel, minden következmĂ©nnyel egyĂŒtt. BƑvebben itt olvashatsz: https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Hash_Tree_Directories

Ezt az opciĂłt kikapcsolhatja, de a fĂĄjlnevek szerinti keresĂ©s elƑre kiszĂĄmĂ­thatatlanul hosszĂș lehet, ha az összes fĂĄjlt vĂ©gig kell jĂĄrni.

 tune2fs -O "^dir_index" /dev/sdb3

Általånossågban, mint ideiglenes megoldås, mƱködhet.

Moral: sok fåjl a könyvtårban åltalåban rossz. Ezt nem szabad csinålni.

Ilyen esetekben ĂĄltalĂĄban fĂĄjlnevek kezdƑbetƱi vagy mĂĄs paramĂ©terek, pĂ©ldĂĄul dĂĄtumok szerint belsƑ könyvtĂĄrakat hoznak lĂ©tre, ami a legtöbb esetben segĂ­t.
De a kis fĂĄjlok összesĂ­tett szĂĄma tovĂĄbbra is problĂ©mĂĄs, mĂ©g ha könyvtĂĄrakba is soroljuk Ƒket — akkor lĂĄsd az elsƑ problĂ©mĂĄt.

Harmadik problĂ©ma: hogyan nĂ©zhetjĂŒk meg a fĂĄjlok listĂĄjĂĄt, ha sok van belƑlĂŒk?

A helyzetĂŒnkben, ahol sok fĂĄjlunk van, valahogy szembesĂŒltĂŒnk azzal a problĂ©mĂĄval, hogy hogyan nĂ©zhessĂŒk meg a könyvtĂĄr tartalmĂĄt.

A standard megoldás — a parancs ls.
OkĂ©, nĂ©zzĂŒk meg, mi törtĂ©nik 4772098 fĂĄjl esetĂ©n:


$ time ls /home/app/express.repository/offercache/ >/dev/null

real	0m30.203s
user	0m28.327s
sys	0m1.876s

30 mĂĄsodperc... ez soknak tƱnik. Az idƑ legnagyobb rĂ©sze a felhasznĂĄlĂłi tĂ©r fĂĄjljainak feldolgozĂĄsĂĄra megy el, nem pedig a mag (kernel) munkĂĄjĂĄra.

De van megoldĂĄs:


$ time find /home/app/express.repository/offercache/ >/dev/null

real	0m3.714s
user	0m1.998s
sys	0m1.717s

3 mĂĄsodperc. 10-szer gyorsabb.
HurrĂĄ!

UPD.

MĂ©g gyorsabb megoldĂĄs a felhasznĂĄlĂłtĂłl berez — a rendezĂ©s kikapcsolĂĄsa a ls


time ls -U /home/app/express.repository/offercache/ >/dev/null
real	0m2.985s
user	0m1.377s
sys	0m1.608s

Negyedik probléma: magas LA fåjlok kezelésekor

IdƑrƑl idƑre felmerĂŒl a helyzet, amikor rengeteg fĂĄjlt kell ĂĄtmĂĄsolni egyik gĂ©prƑl a mĂĄsikra. Eközben gyakran jelentƑsen megnƑ a LA, mivel minden a lemezek teljesĂ­tmĂ©nyĂ©be ĂŒtközik.

A legĂ©rtelmesebb, amit szeretnĂ©nk — SSD-t hasznĂĄlni. ValĂłban menƑ. Csak a több terabĂĄjtos SSD ĂĄra a kĂ©rdĂ©s.

De ha a lemezek normĂĄlisak, a fĂĄjlokat ĂĄt kell mĂĄsolni, Ă©s ez rĂĄadĂĄsul egy produkciĂłs rendszer, ahol a tĂșlterhelĂ©s elĂ©gedetlensĂ©get okoz az ĂŒgyfelek rĂ©szĂ©rƑl? LegalĂĄbb kĂ©t hasznos eszköz ĂĄll rendelkezĂ©sre: kellemes Ă©s ionice.

kellemes — csökkenti a folyamat prioritĂĄsĂĄt, Ă­gy a scheduler több idƑkvantumot oszt mĂĄs, magasabb prioritĂĄsĂș folyamatoknak.
Gyakorlatunkban segített a nice maximális (19 — a legalacsonyabb prioritás, -20 (mínusz 20) — a legmagasabb) beállítása.

ionice — így korrigálja a bemeneti/kimeneti (I/O scheduling) prioritást.

Ha RAID-t hasznĂĄl, Ă©s hirtelen szinkronizĂĄlnia kell (pĂ©ldĂĄul egy sikertelen ĂșjraindĂ­tĂĄs utĂĄn, vagy a RAID tömb helyreĂĄllĂ­tĂĄsa utĂĄn egy lemezcsere miatt), akkor bizonyos helyzetekben Ă©rdemes csökkenteni a szinkronizĂĄlĂĄs sebessĂ©gĂ©t, hogy a többi folyamat viszonylag megfelelƑen mƱködhessen. Ehhez segĂ­t a következƑ parancs:


echo 1000 > /proc/sys/dev/raid/speed_limit_max

Ötödik problĂ©ma: Hogyan szinkronizĂĄljunk fĂĄjlokat valĂłs idƑben

Ugyanazokkal a hatalmas mennyisĂ©gƱ fĂĄjlokkal rendelkezĂŒnk, amelyeket biztonsĂĄgi mentĂ©skĂ©nt el kell kĂŒldeni a mĂĄsodik szerverre a lehetsĂ©ges vesztesĂ©gek elkerĂŒlĂ©se Ă©rdekĂ©ben... A fĂĄjlok folyamatosan Ă­rĂłdnak, ezĂ©rt minimĂĄlis vesztesĂ©g elĂ©rĂ©se Ă©rdekĂ©ben a lehetƑ leggyorsabban kell mĂĄsolni Ƒket.

A standard megoldĂĄs: Rsync SSH-n keresztĂŒl.

Ez jĂł lehetƑsĂ©g, ha csak nem kell ezt több mĂĄsodpercenkĂ©nt megtenni. RĂĄadĂĄsul sok fĂĄjl van. MĂ©g ha nem is mĂĄsoljuk Ƒket – akkor valahogy tudnunk kell, hogy mi vĂĄltozott, Ă©s több milliĂł fĂĄjl összehasonlĂ­tĂĄsa idƑt Ă©s terhelĂ©st jelent a lemezeken.

Vagyis azonnal tudnunk kell, hogy mit kell mĂĄsolni anĂ©lkĂŒl, hogy minden alkalommal el kellene indĂ­tani az összehasonlĂ­tĂĄst.

A megoldĂĄs – lsyncd. Lsyncd — ÉlƑ szinkronizĂĄlĂł (tĂŒkör) dĂ©mon. Ez is az rsync-en keresztĂŒl mƱködik, de emellett figyeli a fĂĄjlrendszert a vĂĄltozĂĄsok szempontjĂĄbĂłl az inotify Ă©s fsevents hasznĂĄlatĂĄval, Ă©s csak azokat a fĂĄjlokat mĂĄsolja, amelyek megjelentek vagy megvĂĄltoztak.

Hatodik probléma: hogyan hatårozzuk meg, ki terheli a lemezeket

ValĂłszĂ­nƱleg mindenki tudja, de azĂ©rt a teljessĂ©g kedvéért: a lemezes alrendszer megfigyelĂ©sĂ©re a következƑ parancs ĂĄll rendelkezĂ©sre: iotop — hasonlĂł top, de megmutatja a legaktĂ­vabban hasznĂĄlt folyamatokat a lemezeken.

TrĂŒkkök nagy szĂĄmĂș aprĂł fĂĄjlok kezelĂ©sĂ©hez

EgyĂ©bkĂ©nt a rĂ©gi, jĂł öreg top is segĂ­t megĂ©rteni, hogy vannak-e problĂ©mĂĄk a lemezekkel. Ehhez kĂ©t legmegfelelƑbb paramĂ©ter van: Load Average Ă©s IOwait.

TrĂŒkkök nagy szĂĄmĂș aprĂł fĂĄjlok kezelĂ©sĂ©hez

Az elsƑ mutatja, hĂĄny folyamat vĂĄr a kiszolgĂĄlĂĄsra, ĂĄltalĂĄban ha több mint 2 van, mĂĄr valami nem stimmel. AktĂ­v biztonsĂĄgi mentĂ©s kĂ©szĂ­tĂ©sekor a hĂĄttĂ©rszerverek szĂĄmĂĄra 6-8-as Ă©rtĂ©k elfogadhatĂł, ezen tĂșl a helyzet rendellenesnek szĂĄmĂ­t.

A mĂĄsodik mutatja, mennyire van a processzor a lemezes mƱveletekkel elfoglalva. Az IOwait >10% aggodalomra ad okot, bĂĄr a speciĂĄlis terhelĂ©sprofilĂș szervereink esetĂ©n gyakran 40-50%-os stabil terhelĂ©st tapasztalunk, ami tĂ©nyleg normĂĄlis.

Ezen be is fejezem, bår biztosan sok olyan szempont van, amivel még nem talålkoztunk, örömmel vårom a kommentårokat és érdekes, valós esetek leíråsait.

ForrĂĄs: habr.com

MegbĂ­zhatĂł hosting vĂĄsĂĄrlĂĄsa weboldalak szĂĄmĂĄra, DDoS vĂ©delemmel, VPS VDS szerverek. đŸ”„ MegbĂ­zhatĂł webtĂĄrhely vĂĄsĂĄrlĂĄsa DDoS vĂ©delemmel, VPS VDS szerverek | ProHoster