Storio cannoedd o filiynau o ffeiliau bach yn effeithlon. Datrysiad hunangynhaliol

Storio cannoedd o filiynau o ffeiliau bach yn effeithlon. Datrysiad hunangynhaliol

Annwyl Gymuned, Bydd yr erthygl hon yn canolbwyntio ar storio ac adalw cannoedd o filiynau o ffeiliau bach yn effeithlon. Ar hyn o bryd, cynigir yr ateb terfynol ar gyfer systemau ffeiliau sy'n gydnaws Γ’ POSIX gyda chefnogaeth lawn ar gyfer cloeon, gan gynnwys cloeon clwstwr, ac yn Γ΄l pob golwg hyd yn oed heb faglau.

Felly ysgrifennais fy gweinydd arferiad fy hun at y diben hwn.
Wrth weithredu'r dasg hon, fe wnaethom lwyddo i ddatrys y brif broblem, ac ar yr un pryd cyflawni arbedion yn y gofod disg a RAM, yr oedd ein system ffeiliau clwstwr yn ei ddefnyddio'n ddidrugaredd. Mewn gwirionedd, mae nifer o'r fath o ffeiliau yn niweidiol i unrhyw system ffeiliau clystyru.

Y syniad yw hyn:

Mewn geiriau syml, mae ffeiliau bach yn cael eu llwytho i fyny trwy'r gweinydd, maent yn cael eu cadw'n uniongyrchol i'r archif, a hefyd yn darllen ohono, a gosodir ffeiliau mawr ochr yn ochr. Cynllun: 1 ffolder = 1 archif, mae gennym gyfanswm o sawl miliwn o archifau gyda ffeiliau bach, ac nid rhai cannoedd o filiynau o ffeiliau. Ac mae hyn i gyd yn cael ei weithredu'n llawn, heb unrhyw sgriptiau na rhoi ffeiliau mewn archifau tar / zip.

Byddaf yn ceisio ei gadw'n fyr, ymddiheuraf ymlaen llaw os yw'r post yn hir.

Dechreuodd y cyfan gyda'r ffaith na allwn ddod o hyd i weinydd addas yn y byd a allai arbed data a dderbyniwyd trwy'r protocol HTTP yn uniongyrchol i archifau, heb yr anfanteision sy'n gynhenid ​​​​mewn archifau confensiynol a storio gwrthrychau. A'r rheswm dros y chwiliad oedd y clwstwr Tarddiad o 10 gweinydd a oedd wedi tyfu i raddfa fawr, lle roedd 250,000,000 o ffeiliau bach eisoes wedi cronni, ac nid oedd y duedd twf yn mynd i ddod i ben.

I'r rhai nad ydyn nhw'n hoffi darllen erthyglau, mae ychydig o ddogfennaeth yn haws:

yma ΠΈ yma.

A docwr ar yr un pryd, nawr mae opsiwn gyda nginx y tu mewn rhag ofn yn unig:

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

Nesaf:

Os oes llawer o ffeiliau, mae angen adnoddau sylweddol, a'r rhan waethaf yw bod rhai ohonynt yn cael eu gwastraffu. Er enghraifft, wrth ddefnyddio system ffeiliau clystyrog (yn yr achos hwn, MooseFS), mae'r ffeil, waeth beth fo'i maint gwirioneddol, bob amser yn cymryd o leiaf 64 KB. Hynny yw, ar gyfer ffeiliau o 3, 10 neu 30 KB o faint, mae angen 64 KB ar ddisg. Os oes chwarter biliwn o ffeiliau, rydym yn colli o 2 i 10 terabytes. Ni fydd yn bosibl creu ffeiliau newydd am gyfnod amhenodol, gan fod cyfyngiad ar MooseFS: dim mwy nag 1 biliwn gydag un replica o bob ffeil.

Wrth i nifer y ffeiliau gynyddu, mae angen llawer o RAM ar gyfer metadata. Mae tomenni metadata mawr aml hefyd yn cyfrannu at draul gyriannau SSD.

gweinydd wZD. Rydyn ni'n rhoi pethau mewn trefn ar y disgiau.

Mae'r gweinydd wedi'i ysgrifennu yn Go. Yn gyntaf oll, roedd angen i mi leihau nifer y ffeiliau. Sut i'w wneud? Oherwydd archifo, ond yn yr achos hwn heb gywasgu, gan mai dim ond lluniau cywasgedig yw fy ffeiliau. Daeth BoltDB i'r adwy, a oedd yn dal i orfod cael ei ddileu o'i ddiffygion, adlewyrchir hyn yn y ddogfennaeth.

Yn gyfan gwbl, yn lle chwarter biliwn o ffeiliau, yn fy achos i dim ond 10 miliwn o archifau Bolt oedd ar Γ΄l. Pe bawn yn cael y cyfle i newid y strwythur ffeil cyfeiriadur presennol, byddai'n bosibl ei leihau i tua 1 miliwn o ffeiliau.

Mae pob ffeil fach wedi'i phacio i mewn i archifau Bolt, sy'n derbyn enwau'r cyfeiriaduron y maent wedi'u lleoli ynddynt yn awtomatig, ac mae pob ffeil fawr yn aros wrth ymyl yr archifau; nid oes unrhyw bwynt eu pacio, mae hyn yn addasadwy. Mae rhai bach yn cael eu harchifo, rhai mawr yn cael eu gadael heb eu newid. Mae'r gweinydd yn gweithio'n dryloyw gyda'r ddau.

PensaernΓ―aeth a nodweddion y gweinydd wZD.

Storio cannoedd o filiynau o ffeiliau bach yn effeithlon. Datrysiad hunangynhaliol

Mae'r gweinydd yn gweithredu o dan systemau gweithredu Linux, BSD, Solaris ac OSX. Dim ond am bensaernΓ―aeth AMD64 a brofais o dan Linux, ond dylai weithio i ARM64, PPC64, MIPS64.

Prif nodweddion:

  • Multithreading;
  • Multiserver, gan ddarparu goddefgarwch bai a chydbwyso llwyth;
  • Y tryloywder mwyaf i'r defnyddiwr neu'r datblygwr;
  • Dulliau HTTP Γ’ chymorth: GET, HEAD, RHOI a DILEU;
  • Rheoli ymddygiad darllen ac ysgrifennu trwy benawdau cleientiaid;
  • Cefnogaeth i westeion rhithwir hyblyg;
  • Cefnogi cywirdeb data CRC wrth ysgrifennu/darllen;
  • Clustogau lled-ddeinamig ar gyfer y defnydd lleiaf posibl o gof a thiwnio perfformiad rhwydwaith gorau posibl;
  • Gohirio cywasgu data;
  • Yn ogystal, cynigir archifydd aml-edau wZA ar gyfer mudo ffeiliau heb atal y gwasanaeth.

Profiad Go Iawn:

Rwyf wedi bod yn datblygu a phrofi'r gweinydd a'r archifydd ar ddata byw ers amser maith, nawr mae'n gweithredu'n llwyddiannus ar glwstwr sy'n cynnwys 250,000,000 o ffeiliau bach (lluniau) sydd wedi'u lleoli mewn 15,000,000 o gyfeiriaduron ar yriannau SATA ar wahΓ’n. Mae clwstwr o 10 gweinydd yn weinydd Tarddiad sydd wedi'i osod y tu Γ΄l i rwydwaith CDN. Er mwyn ei wasanaethu, defnyddir 2 weinydd Nginx + 2 weinydd wZD.

I'r rhai sy'n penderfynu defnyddio'r gweinydd hwn, byddai'n ddoeth cynllunio strwythur y cyfeiriadur, os yw'n berthnasol, cyn ei ddefnyddio. Gadewch imi wneud archeb ar unwaith nad yw'r gweinydd wedi'i fwriadu i glymu popeth i mewn i archif 1 Bolt.

Profi perfformiad:

Po leiaf yw maint y ffeil wedi'i sipio, y cyflymaf y bydd gweithrediadau GET a PUT yn cael eu perfformio arni. Gadewch i ni gymharu cyfanswm yr amser ar gyfer ysgrifennu cleient HTTP i ffeiliau rheolaidd ac archifau Bolt, yn ogystal Γ’ darllen. Cymharir gwaith gyda ffeiliau o feintiau 32 KB, 256 KB, 1024 KB, 4096 KB a 32768 KB.

Wrth weithio gydag archifau Bolt, mae cywirdeb data pob ffeil yn cael ei wirio (defnyddir CRC), cyn cofnodi a hefyd ar Γ΄l cofnodi, mae darllen ac ailgyfrifo ar-y-hedfan yn digwydd, mae hyn yn naturiol yn cyflwyno oedi, ond y prif beth yw diogelwch data.

Cynhaliais brofion perfformiad ar yriannau SSD, gan nad yw profion ar yriannau SATA yn dangos gwahaniaeth clir.

Graffiau yn seiliedig ar ganlyniadau profion:

Storio cannoedd o filiynau o ffeiliau bach yn effeithlon. Datrysiad hunangynhaliol
Storio cannoedd o filiynau o ffeiliau bach yn effeithlon. Datrysiad hunangynhaliol

Fel y gallwch weld, ar gyfer ffeiliau bach mae'r gwahaniaeth mewn amseroedd darllen ac ysgrifennu rhwng ffeiliau sydd wedi'u harchifo a heb eu harchifo yn fach.

Rydyn ni'n cael darlun hollol wahanol wrth brofi darllen ac ysgrifennu ffeiliau o 32 MB mewn maint:

Storio cannoedd o filiynau o ffeiliau bach yn effeithlon. Datrysiad hunangynhaliol

Mae'r gwahaniaeth amser rhwng darllen ffeiliau o fewn 5-25 ms. Gyda chofnodi, mae pethau'n waeth, mae'r gwahaniaeth tua 150 ms. Ond yn yr achos hwn nid oes angen uwchlwytho ffeiliau mawr; yn syml, nid oes diben gwneud hynny; gallant fyw ar wahΓ’n i'r archifau.

* Yn dechnegol, gallwch ddefnyddio'r gweinydd hwn ar gyfer tasgau sy'n gofyn am NoSQL.

Dulliau sylfaenol o weithio gyda gweinydd wZD:

Wrthi'n llwytho ffeil arferol:

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

Llwytho ffeil i fyny i'r archif Bolt (os na fydd y paramedr gweinydd fmaxsize, sy'n pennu maint mwyaf y ffeil y gellir ei gynnwys yn yr archif, yn cael ei ragori; os eir y tu hwnt iddo, bydd y ffeil yn cael ei uwchlwytho fel arfer wrth ymyl yr archif):

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

Lawrlwytho ffeil (os oes ffeiliau gyda'r un enwau ar y ddisg ac yn yr archif, yna wrth lawrlwytho, rhoddir blaenoriaeth yn ddiofyn i'r ffeil heb ei harchifo):

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

Lawrlwytho ffeil o archif Bolt (gorfodi):

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

Mae disgrifiadau o ddulliau eraill yn y ddogfennaeth.

Dogfennaeth wZD
Dogfennaeth wZA

Ar hyn o bryd mae'r gweinydd yn cefnogi'r protocol HTTP yn unig; nid yw'n gweithio gyda HTTPS eto. Nid yw'r dull POST yn cael ei gefnogi ychwaith (ni phenderfynwyd eto a oes ei angen ai peidio).

Bydd pwy bynnag sy'n cloddio i'r cod ffynhonnell yn dod o hyd i butterscotch yno, nid yw pawb yn ei hoffi, ond ni chlymais y prif god i swyddogaethau'r fframwaith gwe, ac eithrio'r triniwr ymyrraeth, felly yn y dyfodol gallaf ei ailysgrifennu'n gyflym am bron unrhyw un. injan.

Gwneud:

  • Datblygu eich atgynhyrchydd a'ch dosbarthwr eich hun + geo ar gyfer y posibilrwydd o'i ddefnyddio mewn systemau mawr heb systemau ffeiliau clwstwr (Popeth i oedolion)
  • Posibilrwydd o adferiad llwyr o fetadata yn Γ΄l os caiff ei golli'n llwyr (os ydych yn defnyddio dosbarthwr)
  • Protocol brodorol ar gyfer y gallu i ddefnyddio cysylltiadau rhwydwaith parhaus a gyrwyr ar gyfer gwahanol ieithoedd rhaglennu
  • Posibiliadau uwch ar gyfer defnyddio'r gydran NoSQL
  • Cywasgiadau o wahanol fathau (gzip, zstd, snappy) ar gyfer ffeiliau neu werthoedd y tu mewn i archifau Bolt ac ar gyfer ffeiliau rheolaidd
  • Amgryptio o wahanol fathau ar gyfer ffeiliau neu werthoedd y tu mewn i archifau Bolt ac ar gyfer ffeiliau rheolaidd
  • Oedi wrth drosi fideo ar ochr y gweinydd, gan gynnwys ar GPU

Mae gen i bopeth, rwy'n gobeithio y bydd y gweinydd hwn yn ddefnyddiol i rywun, trwydded BSD-3, hawlfraint dwbl, oherwydd pe na bai cwmni lle rwy'n gweithio, ni fyddai'r gweinydd wedi'i ysgrifennu. Fi yw'r unig ddatblygwr. Byddwn yn ddiolchgar am unrhyw chwilod a cheisiadau nodwedd a welwch.

Ffynhonnell: hab.com

Ychwanegu sylw