Spuert effizient Honnerte vu Millioune kleng Dateien. Self-Hosted Léisung

Spuert effizient Honnerte vu Millioune kleng Dateien. Self-Hosted Léisung

Léif Gemeinschaft, Dësen Artikel konzentréiert sech op effizient späicheren an honnerte vu Millioune kleng Dateien zréckzéien. Op dëser Etapp gëtt d'endgülteg Léisung fir POSIX-kompatibel Dateiesystemer proposéiert mat voller Ënnerstëtzung fir Spären, inklusiv Clusterschloss, a scheinbar souguer ouni Krutchen.

Also hunn ech meng eegen personaliséiert Server fir dësen Zweck geschriwwen.
Am Laf vun der Ëmsetzung vun dëser Aufgab hu mir et fäerdeg bruecht den Haaptproblem ze léisen, a gläichzäiteg Erspuernisser op Disk Space an RAM z'erreechen, wat eise Cluster Dateisystem onermiddlech verbraucht huet. Eigentlech ass sou eng Zuel vu Dateien schiedlech fir all Clusterdateisystem.

D'Iddi ass dës:

An einfache Wierder, kleng Dateien ginn iwwer de Server eropgelueden, se ginn direkt an d'Archiv gespäichert, an och dovun gelies, a grouss Dateie ginn niewentenee plazéiert. Schema: 1 Dossier = 1 Archiv, am Ganzen hu mir e puer Milliounen Archiven mat klenge Fichieren, an net e puer honnert Millioune Fichieren. An all dëst ass voll ëmgesat, ouni Scripten oder Dateien an Tar / Zip Archiven ze setzen.

Ech probéieren et kuerz ze halen, ech entschëllege mech am Viraus wann de Post laang ass.

Et huet alles ugefaang mat der Tatsaach, datt ech kee passenden Server op der Welt konnt fannen, deen d'Donnéeën, déi iwwer den HTTP-Protokoll kritt goufen, direkt an d'Archiven späicheren, ouni d'Nodeeler, déi an der konventioneller Archiven an der Objektlagerung inherent sinn. An de Grond fir d'Sich war den Origin-Cluster vun 10 Serveren, déi zu enger grousser Skala gewuess sinn, an deenen 250,000,000 kleng Dateien scho accumuléiert waren, an de Wuesstumstrend wäert net ophalen.

Fir déi, déi net gär Artikele liesen, ass e bëssen Dokumentatioun méi einfach:

hei и hei.

An Docker zur selwechter Zäit, elo gëtt et eng Optioun nëmme mat nginx bannen just am Fall:

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ächst:

Wann et vill Dateie gëtt, gi bedeitend Ressourcen gebraucht, an dat schlëmmst ass datt e puer vun hinnen verschwenden. Zum Beispill, wann Dir e Cluster Dateiesystem benotzt (an dësem Fall, MooseFS), hëlt d'Datei, onofhängeg vun hirer aktueller Gréisst, ëmmer op d'mannst 64 KB. Dat ass, fir Dateien vun 3, 10 oder 30 KB grouss sinn 64 KB op der Disk néideg. Wann et e Véierel vun enger Milliard Dateie gëtt, verléiere mir vun 2 op 10 Terabytes. Et wäert net méiglech sinn nei Dateien onbestëmmt ze kreéieren, well MooseFS eng Begrenzung huet: net méi wéi 1 Milliard mat enger Replika vun all Datei.

Wéi d'Zuel vun de Fichier eropgeet, ass vill RAM fir Metadaten gebraucht. Heefeg grouss Metadaten Dumps droen och zur Verschleiung vun SSD Drive bäi.

wZD Server. Mir setzen d'Saachen op den Disken an Uerdnung.

De Server ass a Go geschriwwen. Éischtens, ech brauch d'Zuel vun de Fichieren ze reduzéieren. Wéi maachen et? Wéinst Archivéieren, awer an dësem Fall ouni Kompressioun, well meng Dateie just kompriméiert Biller sinn. BoltDB koum zur Rettung, déi nach aus senge Mängel éliminéiert gouf, dat gëtt an der Dokumentatioun reflektéiert.

Am Ganzen, amplaz vun engem Véierel vun enger Milliard Fichieren, a mengem Fall waren et nëmmen 10 Millioune Bolt Archive lénks. Wann ech d'Méiglechkeet hätt déi aktuell Verzeechnesdateistruktur z'änneren, wier et méiglech, se op ongeféier 1 Millioun Dateien ze reduzéieren.

All kleng Dateie ginn an Bolt Archive gepackt, déi automatesch d'Nimm vun den Verzeichnisser kréien, an deenen se lokaliséiert sinn, an all grouss Dateie bleiwen nieft den Archiven; et ass kee Sënn fir se ze packen, dëst ass personaliséierbar. Déi kleng ginn archivéiert, déi grouss bleiwen onverännert. De Server funktionnéiert transparent mat deenen zwee.

Architektur a Feature vum wZD Server.

Spuert effizient Honnerte vu Millioune kleng Dateien. Self-Hosted Léisung

De Server funktionnéiert ënner Linux, BSD, Solaris an OSX Betribssystemer. Ech hu just fir AMD64 Architektur ënner Linux getest, awer et soll fir ARM64, PPC64, MIPS64 funktionnéieren.

Haaptfeatures:

  • Multithreading;
  • Multiserver, Feeler Toleranz a Laaschtbalancéierung ubitt;
  • Maximal Transparenz fir de Benotzer oder Entwéckler;
  • Ënnerstëtzt HTTP Methoden: GET, HEAD, PUT a DELETE;
  • Kontroll vum Lies- a Schreifverhalen iwwer Client Header;
  • Ënnerstëtzung fir flexibel virtuell Hosten;
  • Ënnerstëtzt CRC Datenintegritéit beim Schreiwen / Liesen;
  • Semi-dynamesch Puffer fir minimal Erënnerung Konsum an optimal Reseau Leeschtung tuning;
  • Verspéidt Datenkomprimatioun;
  • Zousätzlech gëtt e Multi-threaded Archiver wZA ugebueden fir Dateien ze migréieren ouni de Service ze stoppen.

Echt Erfahrung:

Ech hunn de Server an den Archiver op Live Daten zanter laanger Zäit entwéckelt an getest, elo ass et erfollegräich op engem Cluster operéiert deen 250,000,000 kleng Dateien (Biller) an 15,000,000 Verzeichnisser op getrennten SATA Drive enthält. E Cluster vun 10 Serveren ass en Origin Server deen hannert engem CDN Netzwierk installéiert ass. Fir et ze servéieren, ginn 2 Nginx Server + 2 wZD Server benotzt.

Fir déi, déi entscheeden dëse Server ze benotzen, wier et schlau, d'Verzeechnesstruktur ze plangen, wann zoutreffend, virum Gebrauch. Loosst mech direkt reservéieren datt de Server net geduecht ass alles an en 1 Bolt Archiv ze kräischen.

Leeschtung Testen:

Wat méi kleng d'Gréisst vun der zippeder Datei ass, dest méi séier GET a PUT Operatioune ginn drop gemaach. Loosst eis d'Gesamtzäit fir HTTP Client Schreiwen mat normale Dateien a Bolt Archiven vergläichen, souwéi Liesen. Schafft mat Dateie vu Gréissten 32 KB, 256 KB, 1024 KB, 4096 KB an 32768 KB gëtt verglach.

Wann Dir mat Bolt Archiven schafft, gëtt d'Datenintegritéit vun all Datei iwwerpréift (CRC gëtt benotzt), virun der Opnam an och no der Opnam, on-the-fly Liesen an Neiberechnung geschitt, dëst féiert natierlech Verspéidungen, awer den Haapt Saach ass Datesécherheet.

Ech hunn Performance Tester op SSD fiert, well Tester op SATA fiert net e kloeren Ënnerscheed.

Grafike baséiert op Testresultater:

Spuert effizient Honnerte vu Millioune kleng Dateien. Self-Hosted Léisung
Spuert effizient Honnerte vu Millioune kleng Dateien. Self-Hosted Léisung

Wéi Dir kënnt gesinn, fir kleng Dateien ass den Ënnerscheed am Lies- a Schreifzäiten tëscht archivéierten an net-archivéierten Dateien kleng.

Mir kréien e ganz anert Bild wann Dir Lies- a Schreifdateien vun 32 MB an der Gréisst testen:

Spuert effizient Honnerte vu Millioune kleng Dateien. Self-Hosted Léisung

Den Zäitdifferenz tëscht Liesdateien ass bannent 5-25 ms. Mat Opnam sinn d'Saachen méi schlëmm, den Ënnerscheed ass ongeféier 150 ms. Awer an dësem Fall ass et net néideg fir grouss Dateien eropzelueden, et huet einfach kee Sënn fir dat ze maachen, si kënne separat vun den Archiven liewen.

* Technesch kënnt Dir dëse Server benotze fir Aufgaben déi NoSQL erfuerderen.

Basis Methoden fir mat wZD Server ze schaffen:

Lued eng regulär Datei:

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

Eroplueden vun enger Datei an de Bolt-Archiv (wann de Serverparameter fmaxsize, deen déi maximal Dateigréisst bestëmmt, déi am Archiv ka sinn, net iwwerschratt gëtt; wann et iwwerschratt gëtt, gëtt de Fichier wéi gewinnt nieft dem Archiv eropgelueden):

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

Eng Datei eroflueden (wann et Dateien mat de selwechten Nimm op der Disk an am Archiv sinn, dann beim Download gëtt d'Prioritéit vun der net archivéierter Datei als Standard uginn):

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

E Fichier aus dem Bolt Archiv eroflueden (gezwongen):

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

Beschreiwunge vun anere Methoden sinn an der Dokumentatioun.

wZD Dokumentatioun
wZA Dokumentatioun

De Server ënnerstëtzt de Moment nëmmen den HTTP-Protokoll; et funktionnéiert nach net mat HTTPS. D'POST-Methode gëtt och net ënnerstëtzt (et ass nach net decidéiert ob se gebraucht gëtt oder net).

Wien an de Quellcode gräift, fënnt do Butterscotch, net jiddereen huet et gär, awer ech hunn den Haaptcode net un d'Funktioune vum Web-Framework gebonnen, ausser den Interrupt-Handler, also an Zukunft kann ech se séier fir bal all ëmschreiwen motor.

Ze maachen:

  • Entwécklung vun Ärem eegene Replikator an Distributeur + Geo fir d'Méiglechkeet ze benotzen a grousse Systemer ouni Cluster Dateisystemer (Alles fir Erwuessener)
  • Méiglechkeet fir komplett ëmgedréint Erhuelung vu Metadaten wann se komplett verluer sinn (wann Dir en Distributeur benotzt)
  • Native Protokoll fir d'Fäegkeet fir persistent Netzwierkverbindungen a Chauffeuren fir verschidde Programméierungssproochen ze benotzen
  • Fortgeschratt Méiglechkeeten fir den NoSQL Komponent ze benotzen
  • Kompressiounen vu verschiddenen Typen (gzip, zstd, snappy) fir Dateien oder Wäerter bannent Bolt Archiven a fir regulär Dateien
  • Verschlësselung vu verschiddenen Typen fir Dateien oder Wäerter bannent Bolt Archiven a fir regelméisseg Dateien
  • Verspéiten Server-Säit Video Konversioun, dorënner op GPU

Ech hunn alles, Ech hoffen, datt dëse Server fir een nëtzlech ass, BSD-3 Lizenz, duebel Copyright, well wann et keng Firma wier, wou ech schaffen, wier de Server net geschriwwe ginn. Ech sinn deen eenzegen Entwéckler. Ech wier dankbar fir all Bugs a Feature Ufroen déi Dir fannt.

Source: will.com

Setzt e Commentaire