
KjÊre fellesskap, Denne artikkelen vil fokusere pÄ effektiv lagring og henting av hundrevis av millioner smÄ filer. PÄ dette stadiet er den endelige lÞsningen foreslÄtt for POSIX-kompatible filsystemer med full stÞtte for lÄser, inkludert klyngelÄser, og tilsynelatende til og med uten krykker.
SÄ jeg skrev min egen tilpassede server for dette formÄlet.
I lÞpet av implementeringen av denne oppgaven klarte vi Ä lÞse hovedproblemet, og samtidig oppnÄ besparelser i diskplass og RAM, som klyngefilsystemet vÄrt nÄdelÞst forbrukte. Faktisk er et slikt antall filer skadelig for ethvert klynget filsystem.
Tanken er denne:
Med enkle ord lastes smÄ filer opp gjennom serveren, de lagres direkte i arkivet, og leses ogsÄ fra det, og store filer legges side om side. Opplegg: 1 mappe = 1 arkiv, totalt har vi flere millioner arkiver med smÄ filer, og ikke flere hundre millioner filer. Og alt dette er implementert fullt ut, uten noen skript eller Ä legge filer i tar/zip-arkiver.
Jeg skal prÞve Ä holde det kort, jeg beklager pÄ forhÄnd hvis innlegget blir langt.
Det hele startet med at jeg ikke kunne finne en passende server i verden som kunne lagre data mottatt via HTTP-protokollen direkte inn i arkiver, uten de ulempene som ligger i konvensjonelle arkiver og objektlagring. Og grunnen til sÞket var Origin-klyngen pÄ 10 servere som hadde vokst til stor skala, der 250,000,000 XNUMX XNUMX smÄ filer allerede hadde samlet seg, og veksttrenden kom ikke til Ä stoppe.
For de som ikke liker Ă„ lese artikler, er litt dokumentasjon enklere:
Đž .
Og docker pÄ samme tid, nÄ er det et alternativ bare med nginx inne i tilfelle:
docker run -d --restart=always -e host=localhost -e root=/var/storage
-v /var/storage:/var/storage --name wzd -p 80:80 eltaline/wzdNeste:
Hvis det er mange filer, trengs det betydelige ressurser, og det verste er at noen av dem er bortkastet. For eksempel, nÄr du bruker et klynget filsystem (i dette tilfellet MooseFS), tar filen, uavhengig av den faktiske stÞrrelsen, alltid opp minst 64 KB. Det vil si at for filer pÄ 3, 10 eller 30 KB kreves det 64 KB pÄ disk. Hvis det er en kvart milliard filer, taper vi fra 2 til 10 terabyte. Det vil ikke vÊre mulig Ä lage nye filer pÄ ubestemt tid, siden MooseFS har en begrensning: ikke mer enn 1 milliard med en replika av hver fil.
Etter hvert som antallet filer Þker, trengs det mye RAM for metadata. Hyppige store metadatadumper bidrar ogsÄ til slitasje pÄ SSD-stasjoner.
wZD server. Vi setter ting i orden pÄ diskene.
Serveren er skrevet i Go. FÞrst av alt trengte jeg Ä redusere antall filer. Hvordan gjÞre det? PÄ grunn av arkivering, men i dette tilfellet uten komprimering, siden filene mine bare er komprimerte bilder. BoltDB kom til unnsetning, som fortsatt mÄtte elimineres fra sine mangler, dette gjenspeiles i dokumentasjonen.
Totalt, i stedet for en kvart milliard filer, var det i mitt tilfelle bare 10 millioner Bolt-arkiver igjen. Hvis jeg hadde muligheten til Ă„ endre gjeldende katalogfilstruktur, ville det vĂŠrt mulig Ă„ redusere den til omtrent 1 million filer.
Alle smÄ filer pakkes inn i Bolt-arkiver, som automatisk mottar navnene pÄ katalogene de er plassert i, og alle store filer forblir ved siden av arkivene; det er ingen vits i Ä pakke dem, dette kan tilpasses. SmÄ arkiveres, store blir stÄende uendret. Serveren fungerer transparent med begge.
Arkitektur og funksjoner til wZD-serveren.

Serveren opererer under kontroll av operativsystemer Linux, BSD, Solaris og OSX. Jeg testet bare for AMD64-arkitekturen under Linux, men det burde ogsÄ fungere for ARM64, PPC64, MIPS64.
Hovedtrekkene:
- Multithreading;
- Multiserver, gir feiltoleranse og lastbalansering;
- Maksimal Äpenhet for brukeren eller utvikleren;
- StĂžttede HTTP-metoder: GET, HEAD, PUT og DELETE;
- Kontroll av lese- og skriveatferd via klientoverskrifter;
- StĂžtte for fleksible virtuelle verter;
- StÞtt CRC-dataintegritet nÄr du skriver/leser;
- Semidynamiske buffere for minimalt minneforbruk og optimal justering av nettverksytelse;
- Utsatt datakomprimering;
- I tillegg tilbys en multi-threaded archiver wZA for Ă„ migrere filer uten Ă„ stoppe tjenesten.
Virkelig erfaring:
Jeg har utviklet og testet serveren og arkiveren pÄ live data i ganske lang tid, nÄ fungerer den med suksess pÄ en klynge som inkluderer 250,000,000 15,000,000 10 smÄ filer (bilder) plassert i 2 2 XNUMX kataloger pÄ separate SATA-stasjoner. En klynge pÄ XNUMX servere er en Origin-server installert bak et CDN-nettverk. For Ä betjene den brukes XNUMX Nginx-servere + XNUMX wZD-servere.
For de som bestemmer seg for Ă„ bruke denne serveren, vil det vĂŠre lurt Ă„ planlegge katalogstrukturen, hvis aktuelt, fĂžr bruk. La meg ta en reservasjon med en gang at serveren ikke er ment Ă„ stappe alt inn i et 1 Bolt-arkiv.
Ytelsestesting:
Jo mindre stÞrrelsen pÄ den zippede filen er, desto raskere utfÞres GET- og PUT-operasjoner pÄ den. La oss sammenligne den totale tiden for HTTP-klientskriving med vanlige filer og Bolt-arkiver, samt lesing. Arbeid med filer i stÞrrelsene 32 KB, 256 KB, 1024 KB, 4096 KB og 32768 KB sammenlignes.
NÄr man jobber med Bolt-arkiver, sjekkes dataintegriteten til hver fil (CRC brukes), fÞr opptak og ogsÄ etter opptak skjer det avlesning og omberegning underveis, dette medfÞrer naturligvis forsinkelser, men det viktigste er datasikkerhet.
Jeg gjennomfÞrte ytelsestester pÄ SSD-stasjoner, siden tester pÄ SATA-stasjoner ikke viser en klar forskjell.
Grafer basert pÄ testresultater:


Som du kan se, for smÄ filer er forskjellen i lese- og skrivetider mellom arkiverte og ikke-arkiverte filer liten.
Vi fÄr et helt annet bilde nÄr vi tester lesing og skriving av filer pÄ 32 MB:

Tidsforskjellen mellom lesing av filer er innenfor 5-25 ms. Med opptak gÄr det verre, forskjellen er omtrent 150 ms. Men i dette tilfellet er det ikke nÞdvendig Ä laste opp store filer; det er rett og slett ingen vits i Ä gjÞre det; de kan leve atskilt fra arkivene.
*Teknisk kan du bruke denne serveren til oppgaver som krever NoSQL.
Grunnleggende metoder for Ă„ jobbe med wZD-server:
Laster en vanlig fil:
curl -X PUT --data-binary @test.jpg http://localhost/test/test.jpgOpplasting av en fil til Bolt-arkivet (hvis serverparameteren fmaxsize, som bestemmer den maksimale filstĂžrrelsen som kan inkluderes i arkivet, ikke overskrides; hvis den overskrides, vil filen bli lastet opp som vanlig ved siden av arkivet):
curl -X PUT -H "Archive: 1" --data-binary @test.jpg http://localhost/test/test.jpgNedlasting av en fil (hvis det er filer med samme navn pÄ disken og i arkivet, blir den uarkiverte filen prioritert ved nedlasting som standard):
curl -o test.jpg http://localhost/test/test.jpgLaste ned en fil fra Bolt-arkivet (tvungen):
curl -o test.jpg -H "FromArchive: 1" http://localhost/test/test.jpgBeskrivelser av andre metoder finnes i dokumentasjonen.
Serveren stÞtter for Þyeblikket bare HTTP-protokollen; den fungerer ikke med HTTPS ennÄ. POST-metoden stÞttes heller ikke (det er ennÄ ikke bestemt om det er nÞdvendig eller ikke).
Den som graver i kildekoden vil finne butterscotch der, ikke alle liker det, men jeg knyttet ikke hovedkoden til funksjonene til nettrammeverket, bortsett fra avbruddsbehandleren, sÄ i fremtiden kan jeg raskt omskrive den for nesten alle motor.
ToDo:
- Utvikling av egen replikator og distributĂžr + geo for mulighet for bruk i store systemer uten klyngefilsystemer (Alt for voksne)
- Mulighet for fullstendig omvendt gjenoppretting av metadata hvis de gÄr tapt (hvis du bruker en distributÞr)
- Innebygd protokoll for muligheten til Ä bruke vedvarende nettverkstilkoblinger og drivere for forskjellige programmeringssprÄk
- Avanserte muligheter for bruk av NoSQL-komponenten
- Komprimeringer av forskjellige typer (gzip, zstd, snappy) for filer eller verdier inne i Bolt-arkiver og for vanlige filer
- Kryptering av forskjellige typer for filer eller verdier inne i Bolt-arkiver og for vanlige filer
- Forsinket videokonvertering pÄ serversiden, inkludert pÄ GPU
Jeg har alt, jeg hÄper denne serveren vil vÊre nyttig for noen, BSD-3-lisens, dobbel opphavsrett, siden hvis det ikke var noe firma der jeg jobber, ville ikke serveren blitt skrevet. Jeg er den eneste utvikleren. Jeg vil vÊre takknemlig for eventuelle feil og funksjonsforespÞrsler du finner.
Kilde: www.habr.com
