
Kallis kogukond, see artikkel on pĂŒhendatud tĂ”husale sadade miljonite vĂ€ikeste failide salvestamisele ja kĂ€itlemisele. Selles faasis pakkume lĂ”pliku lahenduse POSIX-ĂŒh compatible failisĂŒsteemidele, mis toetab tĂ€ielikult lukustusi, sealhulgas klastrite lukustusi, ja tundub, et isegi ilma igasuguste kompromissideta.
Seega, selle eesmÀrgi saavutamiseks kirjutasin oma spetsialiseeritud serveri.
Selle ĂŒlesande elluviimise kĂ€igus Ă”nnestus lahendada peamine probleem, saavutada samal ajal diskiruumi ja RAM-i kokkuhoid, mida meie klastrifailisĂŒsteem pidevalt tarbis. TĂ”eliselt kahjulik on selline arv faile igasugusele klastrifailisĂŒsteemile.
Idee on jÀrgmine:
Lihtsalt öeldes, vĂ€iksed failid laaditakse serveri kaudu ĂŒles, salvestatakse otse arhiivi ja loetakse samuti sealt. Suured failid pannakse kĂ”rvale. Skeem: 1 kaust = 1 arhiiv, seega meil on mitmeid miljoneid arhiive vĂ€ikeste failidega, mitte sadu miljonite faile. Ja see on tĂ€ielikult ellu viidud, ilma igasuguste skriptide ja failide jaotamata tar / zip arhiividesse.
PĂŒĂŒan selgitada lĂŒhemalt, vabandan eelnevalt, kui postitus tuleb mahukas.
KÔik algas sellest, et ma ei leidnud maailmas sobivat serverit, mis suudaks andmeid salvestada HTTP protokolli kaudu otse arhiividesse, nii et ei oleks tavaliste arhiivide ja objektide salvestusruumide puudusi. Otsingute pÔhjuseks oli suures mahus laienenud Origin klaster 10 serveriga, kus oli juba kogunenud 250 000 000 vÀikest faili, ning kasvutrend ei kavatse lÔpetada.
Neile, kellele artiklite lugemine ei meeldi ja kellele vÀike dokumentatsioon on lihtsam:
ja .
Ja docker ka, praegu on saadaval variant ainult koos nginx-iga sees igaks juhuks:
docker run -d --restart=always -e host=localhost -e root=\/var\/storage
-v \/var\/storage:\/var\/storage --name wzd -p 80:80 eltaline\/wzdJĂ€tkame:
Kui faile on vĂ€ga palju, on vajalikud mĂ€rkimisvÀÀrsed ressursid, ja mis on kĂ”ige kurvem, osa neist kaob asjata. NĂ€iteks, kui kasutada klastreeritud failisĂŒsteemi (antud juhul - MooseFS), siis fail, sĂ”ltumata tegelikust suurusest, vĂ”tab alati vĂ€hemalt 64 KB. See tĂ€hendab, et failide, mille suurus on 3, 10 vĂ”i 30 KB, puhul vajatakse kettale 64 KB. Kui faile on veerand miljardit, kaotame 2 kuni 10 terabaiti. Uute failide loomine lĂ”putult ei Ă”nnestu, kuna MooseFS-is on piirang: mitte rohkem kui 1 miljard iga faili repliiki.
Failide arvu suurenedes on metainformatsiooni jaoks vajalik palju töömÀlu. Samuti suurte metainformatsiooni dump'id aitavad kaasa SSD-kettaste kulumisele.
Server wZD. Teeme kettal korda.
Server on kirjutatud Go keeles. Esiteks pidi mulle vÀhendama failide arvu. Kuidas seda teha? Arhiveerimise abil, kuid antud juhul ilma kompressioonita, kuna minu failid on sageli tihendatud pildid. Appi tuli BoltDB, mida tuli natuke parandada, see on kajastatud dokumentatsioonis.
Niisiis, minu puhul jÀi veerandi miljardi faili asemel alles ainult 10 miljonit Bolt arhive. Kui mul oleks vÔimalus muuta praegust struktuuri failide tÀitmiseks kataloogides, siis vÔiks selle vÀhendada umbes 1 miljonini.
KÔik vÀikesed failid pakitakse Bolt arhiividesse, mis saavad automaatselt katalooge, kus nad asuvad, nimeks, ja kÔik suured failid jÀÀvad arhiivide kÔrvale, neid pole mÔtet pakendada, seda saab seadistada. VÀikesed - arhiveerime, suured - jÀtame muutmata. Server töötab sujuvalt nii nende kui ka teistega.
Serveri wZD arhitektuur ja omadused.

Server töötab Linuxi, BSD, Solaris ja OSX operatsioonisĂŒsteemide all. Olen testinud ainult AMD64 arhitektuuri Linuxi all, kuid see peaks sobima ka ARM64, PPC64 ja MIPS64 jaoks.
PÔhifunktsioonid:
- Mitme töötluse tugi;
- Mulitiserverite tugi, tagades rikkedeta töö ja koormuse tasakaalustamise;
- Maksimaalne lÀbipaistvus kasutajale vÔi arendajale;
- Toetatud HTTP meetodid: GET, HEAD, PUT ja DELETE;
- KĂ€itumise haldamine lugemise ja kirjutamise ajal kliendi pealkirjade kaudu;
- Paindlikult seadistatavate virtuaalsete hostide tugi;
- Andmete terviklikkuse tugi CRC kirjutamisel/loetamisel;
- PooldĂŒnaamilised puhverid madala mĂ€lu tarbimise ja optimaalse vĂ”rgu jĂ”udluse seadistamiseks;
- Andmete kompaktimine
- Lisaks pakutakse mitmeĂŒhendiga arhiivijat wZA failide migreerimiseks teenuse katkestamata.
Reaalne kogemus:
Olen arendanud ja testinud serverit ja arhiivijat reaalsetel andmetel ĂŒsna pikka aega, nĂŒĂŒd töötab see edukalt klastris, mis hĂ”lmab 250,000,000 vĂ€ikefaili (pilte), mis asuvad 15,000,000 kataloogis eraldi SATA-diskidel. Klastril, kuhu kuulub 10 serverit, on Origin-server, mis on paigaldatud CDN-vĂ”rgu taha. Selle teenindamiseks kasutatakse 2 Nginx serverit + 2 wZD serverit.
Neil, kes otsustavad kasutada seda serverit, tasub enne kasutamist planeerida katalooge struktuuri, kui see on asjakohane. Ătlen kohe, et server ei ole mĂ”eldud kĂ”ike ĂŒhte Bolt arhiivi toppimiseks.
JÔudlustestimine:
Mida vÀiksem on arhiivitud faili suurus, seda kiiremini toimuvad GET ja PUT toimingud. VÔrdleme HTTP kliendi tÀielikku kirjutamise aega tavalistes failides ja Bolt arhiivides ning samuti lugemist. VÔrdlus toimub failide suurustega 32 KB, 256 KB, 1024 KB, 4096 KB ja 32768 KB.
Bolt arhiivide töötlemisel kontrollitakse iga faili andmete terviklikkust (kasutatakse CRC), enne kirjutamist ja samuti pÀrast kirjutamist toimub ka lugemine ja uuesti arvutamine, see toob loomulikult kaasa viivitusi, kuid peamine - andmete turvalisus.
JÔudlusteste tegin SSD-mÀlu seadmetes, kuna SATA-diskidel ei nÀidata teste selget erinevust.
Testimistulemustest graafikud:


Nagu nÀha, on vÀikeste failide lugemise ja kirjutamise ajavahe arhiivitud ja mittearhiivitud failide vahel vÀike.
Kuid saame tÀiesti teistsuguse pildi, kui testime 32 MB suuruste failide lugemist ja kirjutamist:

Failide lugemise ajavahe on 5-25 ms. Kirjutamise puhul on olukord halvem, vahe on umbes 150 ms. Kuid antud juhul ei ole suured failid ĂŒles laadida mĂ”istetav, sel pole lihtsalt mĂ”tet, need vĂ”ivad elada eraldi arhiividest.
*Tehniliselt saab seda serverit kasutada ka NoSQL-iga seotud ĂŒlesannete jaoks.
Peamised meetodid wZD serveriga töötamiseks:
Tavalise faili laadimine:
curl -X PUT --data-binary @test.jpg http://localhost/test/test.jpgFaili ĂŒleslaadimine Bolt arhivi (kui serveri parameeter fmaxsize, mis mÀÀrab maksimaalse faili suuruse, mis saab arhivi lisatud olla, ei ĂŒleta, siis faili laaditakse ĂŒles tavaliselt koos arhiviga):
curl -X PUT -H "Archive: 1" --data-binary @test.jpg http://localhost/test/test.jpgFaili allalaadimine (kui kettal ja arhivis on faile sama nimega, siis allalaadimisel antakse vaikimisi eelis mittearhiveeritud failile):
curl -o test.jpg http://localhost/test/test.jpgFaili allalaadimine Bolt arhivist (sundimisega):
curl -o test.jpg -H "FromArchive: 1" http://localhost/test/test.jpgMuude meetodite kirjeldus on dokumendis.
Server toetab praegu ainult HTTP protokolli, HTTPS ei toimi. Samuti ei toetata POST meetodit (veel ei ole otsustatud, kas see on vajalik vÔi mitte).
Kes uurib lÀhtekoodi, leiab seal iirist, mida kÔik ei armasta, aga ma ei sidunud pÔhikoodi veebi raamistikuga funktsioonide osas, vÀlja arvatud katkestuste töötleja, seega saan edaspidi uuesti kiirelt kirjutada peaaegu igale mootorile.
ToDo:
- Oma replikatsiooni ja jaotamise arendamine + geo suuremate sĂŒsteemide jaoks, ilma klastrite FS-ita (asi tĂ”siselt)
- TÀieliku tagasipöördumise vÔimalus metaandmete tÀieliku kadumise korral (distribuutori kasutamise korral)
- Natiivprotokoll, et kasutada pĂŒsivaid vĂ”rguĂŒhendusi ja juhtmeid erinevatesse programmeerimiskeeltesse
- Laienenud vÔimalused NoSQL komponentide kasutamiseks
- Erinevate tĂŒĂŒpide kokkusurumine (gzip, zstd, snappy) failide vĂ”i Bolt arhiivide ja tavalisete failide vÀÀrtuste jaoks
- Erinevate tĂŒĂŒpide krĂŒpteerimine failide vĂ”i Bolt arhiivides ja tavalisetes failides
- EdasilĂŒkatud serveri videokonverteerimine, sealhulgas GPU-l
Minu poolt kĂ”ik, loodan, et see server on kellelegi kasulik, BSD-3 litsents, autorikaitse kahekordne, kuna kui poleks olnud ettevĂ”tet, kus ma töötan, ei oleks ma ka serverit kirjutanud. Olen arendaja ĂŒksi. Olen tĂ€nulik tĂ”statatud vigade ja funktsioonide soovituste eest.
Allikas: habr.com
