CienÄ«jamÄ kopiena! Å ajÄ rakstÄ galvenÄ uzmanÄ«ba tiks pievÄrsta simtiem miljonu mazu failu efektÄ«vai glabÄÅ”anai un izgÅ«Å”anai. Å ajÄ posmÄ tiek piedÄvÄts galÄ«gais risinÄjums ar POSIX saderÄ«gÄm failu sistÄmÄm ar pilnu atbalstu slÄdzenÄm, ieskaitot kopu slÄdzenes, un Ŕķietami pat bez kruÄ·iem.
TÄpÄc Å”im nolÅ«kam es uzrakstÄ«ju savu pielÄgoto serveri.
ÄŖstenojot Å”o uzdevumu, mums izdevÄs atrisinÄt galveno problÄmu un tajÄ paÅ”Ä laikÄ panÄkt diska vietas un operatÄ«vÄs atmiÅas ietaupÄ«jumu, ko mÅ«su klastera failu sistÄma nežÄlÄ«gi patÄrÄja. Faktiski Å”Äds failu skaits ir kaitÄ«gs jebkurai kopu failu sistÄmai.
Ideja ir Å”Äda:
VienkÄrÅ”iem vÄrdiem sakot, mazie faili tiek augÅ”upielÄdÄti caur serveri, tie tiek saglabÄti tieÅ”i arhÄ«vÄ, kÄ arÄ« lasÄ«ti no tÄ, un lieli faili tiek novietoti blakus. ShÄma: 1 mape = 1 arhÄ«vs, kopÄ mums ir vairÄki miljoni arhÄ«vu ar maziem failiem, nevis vairÄki simti miljonu failu. Un tas viss tiek Ä«stenots pilnÄ«bÄ, bez skriptiem vai failu ievietoÅ”anas tar/zip arhÄ«vos.
CentīŔos rakstīt īsi, jau iepriekŔ atvainojos, ja ieraksts būs garŔ.
Viss sÄkÄs ar to, ka nevarÄju atrast pasaulÄ piemÄrotu serveri, kas ar HTTP protokolu saÅemtos datus varÄtu saglabÄt tieÅ”i arhÄ«vos, bez trÅ«kumiem, kas raksturÄ«gi parastajiem arhÄ«viem un objektu glabÄÅ”anai. Un meklÄÅ”anas iemesls bija 10 serveru Origin klasteris, kas bija izaudzis lÄ«dz lielam mÄrogam, kurÄ jau bija uzkrÄti 250,000,000 XNUMX XNUMX mazu failu, un izaugsmes tendence negrasÄ«jÄs apstÄties.
Tiem, kam nepatÄ«k lasÄ«t rakstus, neliela dokumentÄcija ir vienkÄrÅ”Äka:
Un docker tajÄ paÅ”Ä laikÄ, tagad ir iespÄja tikai ar nginx iekÅ”Ä katram gadÄ«jumam:
docker run -d --restart=always -e host=localhost -e root=/var/storage
-v /var/storage:/var/storage --name wzd -p 80:80 eltaline/wzd
NÄkamais:
Ja failu ir daudz, ir nepiecieÅ”ami ievÄrojami resursi, un vissliktÄkais ir tas, ka daži no tiem tiek izŔķiesti. PiemÄram, izmantojot klasteru failu sistÄmu (Å”ajÄ gadÄ«jumÄ MooseFS), fails neatkarÄ«gi no tÄ faktiskÄ lieluma vienmÄr aizÅem vismaz 64 KB. Tas nozÄ«mÄ, ka failiem, kuru lielums ir 3, 10 vai 30 KB, diskÄ ir nepiecieÅ”ami 64 KB. Ja ir ceturtdaļmiljards failu, mÄs zaudÄjam no 2 lÄ«dz 10 terabaitiem. Jaunus failus nevarÄs izveidot bezgalÄ«gi, jo MooseFS ir ierobežojums: ne vairÄk kÄ 1 miljards ar vienu katra faila repliku.
Palielinoties failu skaitam, metadatiem ir nepiecieÅ”ams daudz RAM. Bieža liela metadatu izgÄztuve arÄ« veicina SSD disku nodilumu.
wZD serveris. SakÄrtojÄm lietas diskos.
Serveris ir rakstÄ«ts Go. PirmkÄrt, man vajadzÄja samazinÄt failu skaitu. KÄ to izdarÄ«t? ArhivÄÅ”anas dÄļ, bet Å”ajÄ gadÄ«jumÄ bez saspieÅ”anas, jo mani faili ir tikai saspiesti attÄli. TalkÄ nÄca BoltDB, kas vÄl bija jÄnovÄrÅ” no trÅ«kumiem, tas ir atspoguļots dokumentÄcijÄ.
KopumÄ ceturtdaļmiljarda failu vietÄ manÄ gadÄ«jumÄ bija palikuÅ”i tikai 10 miljoni Bolta arhÄ«vu. Ja man bÅ«tu iespÄja mainÄ«t paÅ”reizÄjo direktoriju failu struktÅ«ru, bÅ«tu iespÄjams to samazinÄt lÄ«dz aptuveni 1 miljonam failu.
Visi mazie faili tiek iesaiÅoti Bolt arhÄ«vos, kas automÄtiski saÅem to direktoriju nosaukumus, kuros tie atrodas, un visi lielie faili paliek blakus arhÄ«viem; nav jÄgas tos iesaiÅot, tas ir pielÄgojams. Mazie tiek arhivÄti, lielie atstÄti nemainÄ«gi. Serveris darbojas pÄrredzami ar abiem.
wZD servera arhitektūra un funkcijas.
Serveris darbojas operÄtÄjsistÄmÄs Linux, BSD, Solaris un OSX. Es pÄrbaudÄ«ju tikai AMD64 arhitektÅ«ru operÄtÄjsistÄmÄ Linux, taÄu tai vajadzÄtu darboties ARM64, PPC64, MIPS64.
GalvenÄs iezÄ«mes:
- Daudzpavedienu veidoŔana;
- Multiserveris, kas nodroŔina kļūdu toleranci un slodzes līdzsvaroŔanu;
- MaksimÄla pÄrredzamÄ«ba lietotÄjam vai izstrÄdÄtÄjam;
- AtbalstÄ«tÄs HTTP metodes: GET, HEAD, PUT un DELETE;
- LasīŔanas un rakstīŔanas uzvedības kontrole, izmantojot klientu galvenes;
- Atbalsts elastÄ«giem virtuÄlajiem saimniekiem;
- AtbalstÄ«t CRC datu integritÄti rakstot/lasot;
- DaļÄji dinamiski buferi minimÄlam atmiÅas patÄriÅam un optimÄlai tÄ«kla veiktspÄjas regulÄÅ”anai;
- AtliktÄ datu blÄ«vÄÅ”ana;
- TurklÄt failu migrÄÅ”anai, neapturot pakalpojumu, tiek piedÄvÄts vairÄku pavedienu arhivÄtÄjs wZA.
ReÄla pieredze:
Es diezgan ilgu laiku izstrÄdÄju un testÄju serveri un arhivÄtÄju uz dzÄ«vajiem datiem, tagad tas veiksmÄ«gi darbojas klasterÄ«, kurÄ ir 250,000,000 15,000,000 10 mazu failu (bildes), kas atrodas 2 2 XNUMX direktorijÄs uz atseviŔķiem SATA diskdziÅiem. XNUMX serveru klasteris ir Origin serveris, kas instalÄts aiz CDN tÄ«kla. Lai to apkalpotu, tiek izmantoti XNUMX Nginx serveri + XNUMX wZD serveri.
Tiem, kas nolemj izmantot Å”o serveri, bÅ«tu prÄtÄ«gi pirms lietoÅ”anas izplÄnot direktoriju struktÅ«ru, ja tÄda ir. Ä»aujiet man uzreiz izdarÄ«t atrunu, ka serveris nav paredzÄts visu sabÄzt 1 Bolt arhÄ«vÄ.
VeiktspÄjas pÄrbaude:
Jo mazÄks ir zip faila izmÄrs, jo ÄtrÄk ar to tiek veiktas GET un PUT darbÄ«bas. SalÄ«dzinÄsim kopÄjo HTTP klienta rakstÄ«Å”anas laiku ar parastajiem failiem un Bolt arhÄ«viem, kÄ arÄ« lasÄ«Å”anu. Tiek salÄ«dzinÄts darbs ar failiem, kuru izmÄri ir 32 KB, 256 KB, 1024 KB, 4096 KB un 32768 KB.
StrÄdÄjot ar Bolt arhÄ«viem, tiek pÄrbaudÄ«ta katra faila datu integritÄte (tiek izmantots CRC), pirms ierakstÄ«Å”anas un arÄ« pÄc ierakstÄ«Å”anas notiek nolasÄ«Å”ana un pÄrrÄÄ·ins lidojumÄ, tas likumsakarÄ«gi ievieÅ” aizkavÄÅ”anos, bet galvenais ir datu droŔība.
Es veicu veiktspÄjas testus SSD diskdziÅiem, jo āāāāSATA disku testi neuzrÄda skaidru atŔķirÄ«bu.
Diagrammas, kuru pamatÄ ir testÄÅ”anas rezultÄti:
KÄ redzat, maziem failiem lasÄ«Å”anas un rakstÄ«Å”anas laika atŔķirÄ«ba starp arhivÄtajiem un nearhivÄtajiem failiem ir neliela.
PÄrbaudot lasÄ«Å”anas un rakstÄ«Å”anas failus, kuru lielums ir 32 MB, mÄs iegÅ«stam pavisam citu attÄlu:
Laika starpÄ«ba starp failu nolasÄ«Å”anu ir 5ā25 ms robežÄs. Ar ierakstÄ«Å”anu viss ir sliktÄk, atŔķirÄ«ba ir aptuveni 150 ms. Bet Å”ajÄ gadÄ«jumÄ nav nepiecieÅ”ams augÅ”upielÄdÄt lielus failus; vienkÄrÅ”i nav jÄgas to darÄ«t, tie var dzÄ«vot atseviŔķi no arhÄ«viem.
*Tehniski Ŕo serveri var izmantot uzdevumiem, kuriem nepiecieŔams NoSQL.
Pamatmetodes darbam ar wZD serveri:
Parasta faila ielÄde:
curl -X PUT --data-binary @test.jpg http://localhost/test/test.jpg
Faila augÅ”upielÄde Bolt arhÄ«vÄ (ja netiek pÄrsniegts servera parametrs fmaxsize, kas nosaka maksimÄlo faila izmÄru, ko var iekļaut arhÄ«vÄ; ja tas tiek pÄrsniegts, fails tiks augÅ”upielÄdÄts kÄ parasti blakus arhÄ«vam):
curl -X PUT -H "Archive: 1" --data-binary @test.jpg http://localhost/test/test.jpg
Faila lejupielÄde (ja diskÄ un arhÄ«vÄ ir faili ar vienÄdiem nosaukumiem, tad lejupielÄdes laikÄ prioritÄte pÄc noklusÄjuma tiek pieŔķirta nearhivÄtajam failam):
curl -o test.jpg http://localhost/test/test.jpg
Faila lejupielÄde no Bolt arhÄ«va (piespiedu kÄrtÄ):
curl -o test.jpg -H "FromArchive: 1" http://localhost/test/test.jpg
Citu metožu apraksti ir dokumentÄcijÄ.
Serveris paÅ”laik atbalsta tikai HTTP protokolu; tas vÄl nedarbojas ar HTTPS. ArÄ« POST metode netiek atbalstÄ«ta (vÄl nav izlemts, vai tÄ ir vajadzÄ«ga vai nÄ).
KurÅ” iedziļinÄs pirmkodÄ, tas tur atradÄ«s butterscotch, ne visiem tas patÄ«k, bet es galveno kodu nesaistÄ«ju ar tÄ«mekļa ietvara funkcijÄm, izÅemot pÄrtraukumu apstrÄdÄtÄju, tÄpÄc nÄkotnÄ varÄÅ”u Ätri pÄrrakstÄ«t gandrÄ«z jebkuram dzinÄjs.
Darīt:
- Sava replikatora un izplatÄ«tÄja + Ä£eogrÄfiskÄ atraÅ”anÄs vieta, lai to varÄtu izmantot lielÄs sistÄmÄs bez klasteru failu sistÄmÄm (Viss pieauguÅ”ajiem)
- IespÄja pilnÄ«bÄ atgriezt metadatus, ja tie ir pilnÄ«bÄ pazaudÄti (ja tiek izmantots izplatÄ«tÄjs)
- VietÄjais protokols iespÄjai izmantot pastÄvÄ«gus tÄ«kla savienojumus un draiverus dažÄdÄm programmÄÅ”anas valodÄm
- Papildu iespÄjas NoSQL komponenta lietoÅ”anai
- DažÄdu veidu kompresijas (gzip, zstd, snappy) failiem vai vÄrtÄ«bÄm Bolt arhÄ«vos un parastajiem failiem
- DažÄdu veidu failu vai vÄrtÄ«bu Å”ifrÄÅ”ana Bolt arhÄ«vos un parastajiem failiem
- AizkavÄta servera puses video konvertÄÅ”ana, tostarp GPU
Man ir viss, ceru, ka Å”is serveris kÄdam noderÄs, BSD-3 licence, dubultÄs autortiesÄ«bas, jo ja nebÅ«tu uzÅÄmuma, kurÄ es strÄdÄju, serveris nebÅ«tu rakstÄ«ts. Es esmu vienÄ«gais izstrÄdÄtÄjs. BÅ«Å”u pateicÄ«gs par atrastajÄm kļūdÄm un funkciju pieprasÄ«jumiem.
Avots: www.habr.com