Učinkovito pohranite stotine milijuna malih datoteka. Rješenje s vlastitim hostingom

Učinkovito pohranite stotine milijuna malih datoteka. Rješenje s vlastitim hostingom

Draga zajednica, ovaj će se članak usredotočiti na učinkovito pohranjivanje i dohvaćanje stotina milijuna malih datoteka. U ovoj se fazi predlaže konačno rješenje za POSIX-kompatibilne datotečne sustave s punom podrškom za brave, uključujući klaster brave, a naizgled čak i bez štaka.

Stoga sam napisao vlastiti prilagođeni poslužitelj za ovu svrhu.
U tijeku realizacije ovog zadatka uspjeli smo riješiti glavni problem, a ujedno ostvariti uštedu prostora na disku i RAM-a koje je naš datotečni sustav klastera nemilice trošio. Zapravo, toliki broj datoteka je štetan za svaki klasterirani datotečni sustav.

Ideja je sljedeća:

Jednostavnim riječima, male datoteke se učitavaju preko poslužitelja, spremaju se izravno u arhivu i iz nje također čitaju, a velike datoteke se postavljaju jedna pored druge. Shema: 1 mapa = 1 arhiva, ukupno imamo nekoliko milijuna arhiva s malim datotekama, a ne nekoliko stotina milijuna datoteka. I sve je to implementirano u potpunosti, bez ikakvih skripti ili stavljanja datoteka u tar/zip arhive.

Pokušat ću biti kratak, unaprijed se ispričavam ako je post dugačak.

Sve je počelo činjenicom da nisam mogao pronaći odgovarajući poslužitelj na svijetu koji bi podatke primljene putem HTTP protokola mogao spremati izravno u arhivu, bez nedostataka svojstvenih konvencionalnim arhivama i objektnoj pohrani. A razlog potrage bio je Origin klaster od 10 poslužitelja koji je narastao do velikih razmjera, u kojem se već skupilo 250,000,000 malih datoteka, a trend rasta se nije namjeravao zaustaviti.

Za one koji ne vole čitati članke, malo dokumentacije je lakše:

ovdje и ovdje.

I docker u isto vrijeme, sada postoji opcija samo s nginxom unutra za svaki slučaj:

docker run -d --restart=always -e host=localhost -e root=/var/storage 
-v /var/storage:/var/storage --name wzd -p 80:80 eltaline/wzd

Sljedeća:

Ako ima puno datoteka, potrebni su značajni resursi, a najgore je što se neki od njih troše uzalud. Na primjer, kada koristite klasterirani datotečni sustav (u ovom slučaju MooseFS), datoteka, bez obzira na stvarnu veličinu, uvijek zauzima najmanje 64 KB. Odnosno, za datoteke veličine 3, 10 ili 30 KB potrebno je 64 KB na disku. Ako postoji četvrt milijarde datoteka, gubimo od 2 do 10 terabajta. Neće biti moguće beskonačno stvarati nove datoteke, budući da MooseFS ima ograničenje: ne više od 1 milijarde s jednom replikom svake datoteke.

Kako se broj datoteka povećava, potrebno je mnogo RAM-a za metapodatke. Česti veliki dumpovi metapodataka također doprinose trošenju SSD diskova.

wZD poslužitelj. Doveli smo red na diskove.

Poslužitelj je napisan u Go. Prije svega, morao sam smanjiti broj datoteka. Kako to učiniti? Zbog arhiviranja, ali u ovom slučaju bez kompresije, jer su moje datoteke samo komprimirane slike. BoltDB je došao u pomoć, koji je još uvijek morao biti uklonjen iz svojih nedostataka, to se odražava u dokumentaciji.

Ukupno je umjesto četvrt milijarde datoteka, u mom slučaju ostalo samo 10 milijuna Boltovih arhiva. Kad bih imao priliku promijeniti trenutnu strukturu datoteke direktorija, bilo bi je moguće smanjiti na približno milijun datoteka.

Sve male datoteke pakiraju se u Bolt arhive koje automatski dobivaju nazive direktorija u kojima se nalaze, a sve velike datoteke ostaju uz arhive, nema ih smisla pakirati, to se može prilagoditi. Male se arhiviraju, velike ostavljaju nepromijenjene. Poslužitelj radi transparentno s oba.

Arhitektura i značajke wZD poslužitelja.

Učinkovito pohranite stotine milijuna malih datoteka. Rješenje s vlastitim hostingom

Poslužitelj radi pod operativnim sustavima Linux, BSD, Solaris i OSX. Testirao sam samo AMD64 arhitekturu pod Linuxom, ali bi trebala raditi za ARM64, PPC64, MIPS64.

Glavne značajke:

  • Višenitnost;
  • Multiserver, pružajući toleranciju na greške i uravnoteženje opterećenja;
  • Maksimalna transparentnost za korisnika ili programera;
  • Podržane HTTP metode: GET, HEAD, PUT i DELETE;
  • Kontrola ponašanja čitanja i pisanja putem klijentskih zaglavlja;
  • Podrška za fleksibilne virtualne hostove;
  • Podržava CRC integritet podataka prilikom pisanja/čitanja;
  • Poludinamički međuspremnici za minimalnu potrošnju memorije i optimalno podešavanje performansi mreže;
  • Odgođeno sažimanje podataka;
  • Osim toga, nudi se višenitni arhivator wZA za migraciju datoteka bez zaustavljanja usluge.

Pravo iskustvo:

Poslužitelj i arhivar razvijam i testiram na živim podacima dosta dugo, sada uspješno radi na klasteru koji uključuje 250,000,000 malih datoteka (slika) smještenih u 15,000,000 direktorija na zasebnim SATA diskovima. Klaster od 10 poslužitelja je Origin poslužitelj instaliran iza CDN mreže. Za njegovo servisiranje koriste se 2 Nginx poslužitelja + 2 wZD poslužitelja.

Za one koji odluče koristiti ovaj poslužitelj, bilo bi mudro isplanirati strukturu direktorija, ako je primjenjivo, prije upotrebe. Dopustite mi da odmah napomenem da poslužitelj nije namijenjen da sve strpa u 1 Bolt arhivu.

Testiranje performansi:

Što je komprimirana datoteka manja, to se brže izvode operacije GET i PUT na njoj. Usporedimo ukupno vrijeme za pisanje HTTP klijenta u obične datoteke i Bolt arhive, kao i za čitanje. Uspoređuje se rad s datotekama veličine 32 KB, 256 KB, 1024 KB, 4096 KB i 32768 KB.

Prilikom rada s Bolt arhivama provjerava se integritet podataka svake datoteke (koristi se CRC), prije snimanja i nakon snimanja dolazi do očitavanja i ponovnog izračunavanja u hodu, što naravno dovodi do kašnjenja, ali glavna stvar je sigurnost podataka.

Proveo sam testove performansi na SSD pogonima, jer testovi na SATA pogonima ne pokazuju jasnu razliku.

Grafikoni temeljeni na rezultatima testiranja:

Učinkovito pohranite stotine milijuna malih datoteka. Rješenje s vlastitim hostingom
Učinkovito pohranite stotine milijuna malih datoteka. Rješenje s vlastitim hostingom

Kao što vidite, za male datoteke razlika u vremenu čitanja i pisanja između arhiviranih i ne-arhiviranih datoteka je mala.

Potpuno drugačiju sliku dobivamo pri testiranju čitanja i pisanja datoteka veličine 32 MB:

Učinkovito pohranite stotine milijuna malih datoteka. Rješenje s vlastitim hostingom

Vremenska razlika između čitanja datoteka je unutar 5-25 ms. Sa snimanjem stvari stoje gore, razlika je oko 150 ms. Ali u ovom slučaju nema potrebe za učitavanjem velikih datoteka; jednostavno nema smisla to raditi; one mogu živjeti odvojeno od arhive.

*Tehnički, ovaj poslužitelj možete koristiti za zadatke koji zahtijevaju NoSQL.

Osnovne metode rada s wZD poslužiteljem:

Učitavanje obične datoteke:

curl -X PUT --data-binary @test.jpg http://localhost/test/test.jpg

Učitavanje datoteke u Bolt arhivu (ako parametar servera fmaxsize, koji određuje maksimalnu veličinu datoteke koja može biti uključena u arhivu, nije prekoračen; ako je prekoračen, datoteka će biti učitana kao i obično pored arhive):

curl -X PUT -H "Archive: 1" --data-binary @test.jpg http://localhost/test/test.jpg

Preuzimanje datoteke (ako postoje datoteke s istim nazivima na disku iu arhivi, tada se prilikom preuzimanja prioritet prema zadanim postavkama daje nearhiviranoj datoteci):

curl -o test.jpg http://localhost/test/test.jpg

Preuzimanje datoteke iz Bolt arhive (prisilno):

curl -o test.jpg -H "FromArchive: 1" http://localhost/test/test.jpg

Opisi ostalih metoda nalaze se u dokumentaciji.

wZD dokumentacija
wZA dokumentacija

Poslužitelj trenutno podržava samo HTTP protokol; još ne radi s HTTPS-om. Metoda POST također nije podržana (još nije odlučeno je li potrebna ili ne).

Tko god kopa po izvornom kodu, naći će tu butterscotch, ne sviđa se svima, ali glavni kod nisam vezao za funkcije web okvira, osim za rukovatelja prekidima, tako da ga u budućnosti mogu brzo prepisati za gotovo sve motor.

ToDo:

  • Izrada vlastitog replikatora i distributera + geo za mogućnost korištenja u velikim sustavima bez cluster datotečnih sustava (Sve za odrasle)
  • Mogućnost potpunog povratnog oporavka metapodataka ako su potpuno izgubljeni (ako se koristi distributer)
  • Izvorni protokol za mogućnost korištenja trajnih mrežnih veza i upravljačkih programa za različite programske jezike
  • Napredne mogućnosti korištenja NoSQL komponente
  • Kompresije različitih vrsta (gzip, zstd, snappy) za datoteke ili vrijednosti unutar Bolt arhiva i za obične datoteke
  • Šifriranje različitih vrsta za datoteke ili vrijednosti unutar Bolt arhiva i za obične datoteke
  • Odgođena video konverzija na strani poslužitelja, uključujući GPU

Imam sve, nadam se da će ovaj server nekome biti od koristi, BSD-3 licenca, dupla autorska prava, jer da nema firme u kojoj radim, server ne bi bio napisan. Ja sam jedini programer. Bio bih zahvalan za sve greške i zahtjeve za značajke koje pronađete.

Izvor: www.habr.com

Dodajte komentar