
Lugupeetud kogukond! See artikkel keskendub sadade miljonite vĂ€ikeste failide tĂ”husale salvestamisele ja toomisele. Selles etapis pakutakse lĂ”plikku lahendust POSIX-iga ĂŒhilduvatele failisĂŒsteemidele, millel on tĂ€ielik lukkude tugi, sealhulgas kobarlukud, ja nĂ€iliselt isegi ilma karkudeta.
Nii et ma kirjutasin selleks otstarbeks oma kohandatud serveri.
Selle ĂŒlesande elluviimise kĂ€igus Ă”nnestus meil pĂ”hiprobleem lahendada ja samal ajal sÀÀsta kettaruumi ja RAM-i, mida meie klastri failisĂŒsteem halastamatult kulutas. Tegelikult on selline failide arv kahjulik mis tahes rĂŒhmitatud failisĂŒsteemile.
Idee on selline:
Lihtsamalt öeldes laaditakse serveri kaudu ĂŒles vĂ€ikesed failid, need salvestatakse otse arhiivi ja sealt ka loetakse ning suured failid asetatakse kĂ”rvuti. Skeem: 1 kaust = 1 arhiiv, kokku on meil mitu miljonit vĂ€ikeste failidega arhiive, mitte mitusada miljonit faili. Ja seda kĂ”ike rakendatakse tĂ€ielikult, ilma skriptideta vĂ”i faile tar/zip-arhiivi panemata.
PĂŒĂŒan lĂŒhidalt teha, vabandan juba ette, kui postitus on pikk.
KÔik sai alguse sellest, et ma ei leidnud maailmast sobivat serverit, mis suudaks HTTP-protokolli kaudu saadud andmeid otse arhiividesse salvestada, ilma tavaarhiividele ja objektide salvestamisele omaste puudusteta. Ja otsingu pÔhjuseks oli mastaapseks kasvanud 10 serverist koosnev Origin-klaster, kuhu oli kogunenud juba 250,000,000 XNUMX XNUMX vÀikest faili ja kasvutrend ei kavatsenud peatuda.
Neile, kellele artikleid lugeda ei meeldi, on vÀike dokumentatsioon lihtsam:
Đž .
Ja docker samal ajal, nĂŒĂŒd on igaks juhuks vĂ”imalus ainult nginxiga sees:
docker run -d --restart=always -e host=localhost -e root=/var/storage
-v /var/storage:/var/storage --name wzd -p 80:80 eltaline/wzdJĂ€rgmine:
Kui faile on palju, on vaja mĂ€rkimisvÀÀrseid ressursse ja kĂ”ige hullem on see, et osa neist lĂ€heb raisku. NĂ€iteks rĂŒhmitatud failisĂŒsteemi (antud juhul MooseFS) kasutamisel vĂ”tab fail olenemata selle tegelikust suurusest alati vĂ€hemalt 64 KB. See tĂ€hendab, et 3, 10 vĂ”i 30 KB suuruste failide jaoks on kettal vaja 64 KB. Kui faile on veerand miljardit, kaotame 2â10 terabaiti. Uusi faile ei saa lĂ”putult luua, kuna MooseFS-il on piirang: mitte rohkem kui 1 miljard iga faili ĂŒhe koopiaga.
Failide arvu kasvades on metaandmete jaoks vaja palju RAM-i. SSD-draivide kulumisele aitavad kaasa ka sagedased suured metaandmete tÔmmised.
wZD server. Panime ketastel asjad korda.
Server on kirjutatud Go. Esiteks oli mul vaja failide arvu vÀhendada. Kuidas seda teha? Arhiveerimise tÔttu, kuid antud juhul ilma tihendamiseta, kuna minu failid on lihtsalt tihendatud pildid. Appi tuli BoltDB, mis tuli siiski oma puudustest kÔrvaldada, see kajastub dokumentatsioonis.
Kokku jÀi minu puhul veerand miljardi faili asemel alles vaid 10 miljonit Bolti arhiivi. Kui mul oleks vÔimalus muuta praegust kataloogifaili struktuuri, oleks vÔimalik seda vÀhendada ligikaudu 1 miljoni failini.
KÔik vÀikesed failid pakitakse Bolti arhiividesse, mis saavad automaatselt kataloogide nimed, kus nad asuvad, ja kÔik suured failid jÀÀvad arhiivide kÔrvale, neid pole mÔtet pakkida, see on kohandatav. VÀikesed arhiveeritakse, suured jÀetakse muutmata. Server töötab mÔlemaga lÀbipaistvalt.
wZD-serveri arhitektuur ja funktsioonid.

Server töötab operatsioonisĂŒsteemide juhtimisel Linux, BSD, Solaris ja OSX. Testisin ainult AMD64 arhitektuuri all Linux, aga see peaks töötama ka ARM64, PPC64 ja MIPS64 puhul.
PÔhijooned:
- MitmelÔimeline;
- Multiserver, mis pakub tÔrketaluvust ja koormuse tasakaalustamist;
- maksimaalne lÀbipaistvus kasutaja vÔi arendaja jaoks;
- Toetatud HTTP-meetodid: GET, HEAD, PUT ja DELETE;
- Lugemis- ja kirjutamiskÀitumise juhtimine kliendipÀiste kaudu;
- Paindlike virtuaalsete hostide tugi;
- Toetage CRC andmete terviklikkust kirjutamisel/lugemisel;
- PooldĂŒnaamilised puhvrid minimaalse mĂ€lutarbimise ja optimaalse vĂ”rgu jĂ”udluse hÀÀlestamiseks;
- EdasilĂŒkatud andmete tihendamine;
- Lisaks pakutakse failide migreerimiseks ilma teenust peatamata mitme lÔimega arhiivi wZA.
TÔeline kogemus:
Olen serverit ja arhiveerijat arendanud ja testinud reaalajas andmetel pĂ€ris pikka aega, nĂŒĂŒd töötab see edukalt klastris, mis sisaldab 250,000,000 15,000,000 10 vĂ€ikest faili (pilti), mis asuvad 2 2 XNUMX kataloogis eraldi SATA-draividel. XNUMX serverist koosnev klaster on CDN-vĂ”rgu taha installitud Origin-server. Selle teenindamiseks kasutatakse XNUMX Nginxi serverit + XNUMX wZD serverit.
Neil, kes otsustavad seda serverit kasutada, oleks mÔistlik enne kasutamist planeerida kataloogistruktuur, kui see on asjakohane. Lubage mul teha kohe reservatsioon, et server ei ole mÔeldud kÔike 1 Bolti arhiivi toppima.
JÔudluskatse:
Mida vÀiksem on ZIP-faili suurus, seda kiiremini tehakse sellega GET- ja PUT-operatsioone. VÔrdleme HTTP-kliendi kirjutamise koguaega tavafailide ja Bolti arhiividega, aga ka lugemist. VÔrreldakse tööd failidega suurusega 32 KB, 256 KB, 1024 KB, 4096 KB ja 32768 KB.
Bolti arhiividega töötades kontrollitakse iga faili andmete terviklikkust (kasutatakse CRC-d), enne salvestamist ja ka pĂ€rast salvestamist toimub kĂ€igupealt lugemine ja ĂŒmberarvutamine, see toob loomulikult kaasa viivitusi, kuid peamine on andmete turvalisus.
Viisin lÀbi SSD-draivide jÔudlustestid, kuna SATA-draivide testid ei nÀita selget erinevust.
Testimistulemustel pÔhinevad graafikud:


Nagu nÀete, on vÀikeste failide puhul arhiveeritud ja mittearhiveeritud failide lugemis- ja kirjutamisaegade erinevus vÀike.
32 MB suuruste failide lugemise ja kirjutamise testimisel saame hoopis teistsuguse pildi:

Failide lugemise ajavahe on 5-25 ms. Salvestamisega on asi hullem, vahe on ca 150 ms. Kuid sel juhul pole vaja suuri faile ĂŒles laadida, seda pole lihtsalt mĂ”tet teha, need vĂ”ivad elada arhiividest eraldi.
*Tehniliselt saate seda serverit kasutada NoSQL-i nĂ”udvate ĂŒlesannete jaoks.
PÔhimeetodid wZD serveriga töötamiseks:
Tavalise faili laadimine:
curl -X PUT --data-binary @test.jpg http://localhost/test/test.jpgFaili ĂŒleslaadimine Bolti arhiivi (kui ei ĂŒletata serveri parameetrit fmaxsize, mis mÀÀrab maksimaalse failimahu, mida saab arhiivi kaasata; selle ĂŒletamisel laaditakse fail ĂŒles tavapĂ€raselt arhiivi kĂ”rvale):
curl -X PUT -H "Archive: 1" --data-binary @test.jpg http://localhost/test/test.jpgFaili allalaadimine (kui kettal ja arhiivis on sama nimega faile, siis allalaadimisel on vaikimisi prioriteet arhiveerimata failile):
curl -o test.jpg http://localhost/test/test.jpgFaili allalaadimine Bolti arhiivist (sunnitud):
curl -o test.jpg -H "FromArchive: 1" http://localhost/test/test.jpgTeiste meetodite kirjeldused on dokumentatsioonis.
Server toetab praegu ainult HTTP-protokolli, see ei tööta veel HTTPS-iga. Samuti ei toetata POST meetodit (pole veel otsustatud, kas seda on vaja vÔi mitte).
Kes lĂ€htekoodi sĂŒveneb, see leiab sealt butterscotchâi, see ei meeldi kĂ”igile, aga ma ei sidunud pĂ”hikoodi veebiraamistiku funktsioonidega, vĂ€lja arvatud katkestuste töötleja, nii et edaspidi saan selle peaaegu iga jaoks kiiresti ĂŒmber kirjutada mootor.
Tegema:
- Oma replikaatori ja turustaja + geo arendamine, et seda saaks kasutada suurtes sĂŒsteemides ilma klastri failisĂŒsteemideta (kĂ”ik tĂ€iskasvanutele)
- Metaandmete tÀieliku tagurpidi taastamise vÔimalus, kui need on tÀielikult kadunud (turustaja kasutamisel)
- Native protokoll, mis vĂ”imaldab kasutada pĂŒsivaid vĂ”rguĂŒhendusi ja draivereid erinevate programmeerimiskeelte jaoks
- TÀpsemad vÔimalused NoSQL komponendi kasutamiseks
- Erinevat tĂŒĂŒpi pakkimised (gzip, zstd, snappy) Bolti arhiivides olevate failide vĂ”i vÀÀrtuste ja tavaliste failide jaoks
- Erinevat tĂŒĂŒpi failide vĂ”i vÀÀrtuste krĂŒptimine Bolti arhiivides ja tavaliste failide jaoks
- Hilinenud serveripoolne video teisendamine, sealhulgas GPU-s
Mul on kÔik olemas, loodan, et see server on kellelegi kasulik, BSD-3 litsents, topeltautoriÔigus, sest kui poleks ettevÔtet, kus ma töötan, poleks serverit kirjutatud. Olen ainus arendaja. Oleksin tÀnulik kÔigi leitud vigade ja funktsioonitaotluste eest.
Allikas: www.habr.com
