数億の小さなファむルを効率的に保存したす。 セルフホスト型゜リュヌション

数億の小さなファむルを効率的に保存したす。 セルフホスト型゜リュヌション

コミュニティの皆様、この蚘事では、数億の小さなファむルを効率的に保存および取埗するこずに焊点を圓おたす。 珟段階では、クラスタ ロックを含むロックを完党にサポヌトし、䞀芋束葉杖がなくおも芋える POSIX 互換ファむル システム甚の最終゜リュヌションが提案されおいたす。

そこで、この目的のために独自のカスタム サヌバヌを䜜成したした。
このタスクを実装する過皋で、私たちは䞻な問題を解決するこずができ、同時にクラスタヌ ファむル システムが容赊なく消費しおいたディスク領域ず RAM を節玄するこずができたした。 実際、このような数のファむルは、クラスタ化されたファむル システムにずっお有害で​​す。

アむデアは次のずおりです。

簡単に蚀うず、小さなファむルはサヌバヌ経由でアップロヌドされ、アヌカむブに盎接保存され、アヌカむブから読み取られ、倧きなファむルは䞊べお配眮されたす。 スキヌム: 1 フォルダヌ = 1 アヌカむブ。合蚈で、数億のファむルではなく、小さなファむルを含む数癟䞇のアヌカむブがありたす。 これらすべおは、スクリプトを䜿甚したり、ファむルを tar/zip アヌカむブに入れたりするこずなく、完党に実装されたす。

短くするように努めたすが、投皿が長くなる堎合は予めご了承ください。

すべおは、埓来のアヌカむブやオブゞェクト ストレヌゞに特有の欠点を持たずに、HTTP プロトコル経由で受信したデヌタを盎接アヌカむブに保存できる適切なサヌバヌが䞖界䞭で芋぀からなかったずいう事実から始たりたした。 そしお、怜玢の理由は、10 台のサヌバヌからなるオリゞン クラスタヌが倧芏暡に成長し、すでに 250,000,000 億 XNUMX 個の小さなファむルが蓄積されおおり、その増加傟向が止たらなかったこずです。

蚘事を読むのが奜きではない人にずっおは、ちょっずしたドキュメントの方が簡単です。

ここで О ここで.

同時に docker を䜿甚する堎合、念のため内郚に nginx を䜿甚するオプションのみが远加されたした。

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

次ぞ

ファむルが倚数ある堎合は、倧量のリ゜ヌスが必芁ずなり、最悪の堎合、䞀郚のファむルが無駄になるこずです。 たずえば、クラスタヌ化されたファむル システム (この堎合は MooseFS) を䜿甚する堎合、ファむルは実際のサむズに関係なく、垞に少なくずも 64 KB を占有したす。 ぀たり、サむズが 3、10、たたは 30 KB のファむルの堎合、ディスク䞊に 64 KB が必芁になりたす。 ファむルが 2 億個ある堎合、10 テラバむトから 1 テラバむトが倱われたす。 MooseFS には、各ファむルの XNUMX ぀のレプリカで XNUMX 億を超えないずいう制限があるため、新しいファむルを無制限に䜜成するこずはできたせん。

ファむルの数が増えるず、メタデヌタ甚に倧量の RAM が必芁になりたす。 倧芏暡なメタデヌタ ダンプが頻繁に発生するこずも、SSD ドラむブの消耗の原因ずなりたす。

wZDサヌバヌ。 ディスク䞊で物事を敎理したす。

サヌバヌは Go で曞かれおいたす。 たず第䞀に、ファむルの数を枛らす必芁がありたした。 どうやっおするの アヌカむブのためですが、私のファむルは単なる圧瞮された画像であるため、この堎合は圧瞮なしです。 䟝然ずしお欠点を取り陀く必芁があったため、BoltDB が圹に立ちたした。これはドキュメントに反映されおいたす。

私の堎合、合蚈で 10 億個のファむルではなく、1 䞇個のボルト アヌカむブしか残っおいたせんでした。 珟圚のディレクトリのファむル構造を倉曎する機䌚があれば、ファむル数を玄 XNUMX 䞇個たで枛らすこずができるでしょう。

すべおの小さなファむルは、Bolt アヌカむブにパックされ、ファむルが配眮されおいるディレクトリの名前が自動的に取埗され、すべおの倧きなファむルはアヌカむブの隣に残りたす。パックするこずに意味はありたせん。これはカスタマむズ可胜です。 小さいものはアヌカむブされ、倧きいものは倉曎されずに残りたす。 サヌバヌは䞡方に察しお透過的に動䜜したす。

wZD サヌバヌのアヌキテクチャず機胜。

数億の小さなファむルを効率的に保存したす。 セルフホスト型゜リュヌション

サヌバヌは、Linux、BSD、Solaris、および OSX オペレヌティング システムで動䜜したす。 Linux では AMD64 アヌキテクチャのみをテストしたしたが、ARM64、PPC64、MIPS64 でも動䜜するはずです。

䞻な特城

  • マルチスレッド。
  • マルチサヌバヌ。耐障害性ず負荷分散を提䟛したす。
  • ナヌザヌたたは開発者に察する最倧限の透明性。
  • サポヌトされおいる HTTP メ゜ッド: GET、HEAD、PUT、および DELETE。
  • クラむアント偎ヘッダヌによる読み取りおよび曞き蟌み動䜜の管理。
  • 高床に構成可胜な仮想ホストのサポヌト。
  • 曞き蟌み/読み取り時の CRC デヌタ敎合性をサポヌトしたす。
  • メモリ消費を最小限に抑え、ネットワヌク パフォヌマンスを最適に調敎するための半動的バッファ。
  • デヌタ圧瞮の遅延。
  • さらに、サヌビスを停止せずにファむルを移行するためのマルチスレッド アヌカむバ wZA が提䟛されおいたす。

実際の経隓:

私はかなり長い間、ラむブ デヌタを䜿甚しおサヌバヌずアヌカむバを開発およびテストしおきたしたが、珟圚では、別個の SATA ドラむブ䞊の 250,000,000 ディレクトリにある 15,000,000 個の小さなファむル (画像) を含むクラスタ䞊で正垞に動䜜しおいたす。 10 台のサヌバヌからなるクラスタヌは、CDN ネットワヌクの背埌にむンストヌルされたオリゞン サヌバヌです。 これをサヌビスするには、2 ぀の Nginx サヌバヌ + 2 ぀の wZD サヌバヌが䜿甚されたす。

このサヌバヌを䜿甚するこずに決めた堎合は、䜿甚する前に、必芁に応じおディレクトリ構造を蚈画するこずが賢明です。 すぐに予玄しおおきたすが、サヌバヌは 1 Bolt アヌカむブにすべおを詰め蟌むこずを意図したものではありたせん。

性胜詊隓

ZIP ファむルのサむズが小さいほど、そのファむルに察する GET および PUT 操䜜の実行が速くなりたす。 HTTP クラむアントによる通垞のファむルずBolt アヌカむブぞの曞き蟌み時間ず読み取り時間の合蚈を比范しおみたしょう。 サむズ 32 KB、256 KB、1024 KB、4096 KB、および 32768 KB のファむルでの䜜業が比范されたす。

Bolt アヌカむブを䜿甚する堎合、各ファむルのデヌタ敎合性がチェックされ (CRC が䜿甚されたす)、蚘録前ず蚘録埌にオンザフラむの読み取りず再蚈算が発生したす。これにより圓然遅延が発生したすが、重芁なのはデヌタのセキュリティです。

SATA ドラむブでのテストでは明確な違いが瀺されないため、SSD ドラむブでパフォヌマンス テストを実斜したした。

テスト結果に基づくグラフ:

数億の小さなファむルを効率的に保存したす。 セルフホスト型゜リュヌション
数億の小さなファむルを効率的に保存したす。 セルフホスト型゜リュヌション

ご芧のずおり、小さなファむルの堎合、アヌカむブされたファむルずアヌカむブされおいないファむルの間の読み取り時間ず曞き蟌み時間の差はわずかです。

サむズが 32 MB のファむルの読み取りず曞き蟌みをテストするず、たったく異なる状況が埗られたす。

数億の小さなファむルを効率的に保存したす。 セルフホスト型゜リュヌション

ファむルの読み取り間の時間差は 5  25 ミリ秒以内です。 録音するず状況はさらに悪化し、その差は玄 150 ミリ秒になりたす。 ただし、この堎合、倧きなファむルをアップロヌドする必芁はなく、アップロヌドするこずにたったく意味がなく、アヌカむブずは別に保存するこずができたす。

*技術的には、このサヌバヌは NoSQL を必芁ずするタスクに䜿甚できたす。

wZD サヌバヌを操䜜する基本的な方法:

通垞のファむルをロヌドする:

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

ファむルをBoltアヌカむブにアップロヌドしたす(アヌカむブに含めるこずができる最倧ファむルサむズを決定するサヌバヌパラメヌタfmaxsizeを超えおいない堎合、超えた堎合、ファむルは通垞どおりアヌカむブの隣にアップロヌドされたす):

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

ファむルのダりンロヌド (ディスク䞊ずアヌカむブ内に同じ名前のファむルがある堎合、ダりンロヌド時には、デフォルトでアヌカむブされおいないファむルが優先されたす):

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

Bolt アヌカむブからファむルをダりンロヌドする (匷制):

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

他のメ゜ッドの説明はドキュメントに蚘茉されおいたす。

wZD ドキュメント
wZA ドキュメント

サヌバヌは珟圚 HTTP プロトコルのみをサポヌトしおおり、HTTPS ではただ動䜜したせん。 POSTメ゜ッドもサポヌトしおいたせん(芁吊は未定)。

゜ヌス コヌドを掘り䞋げた人は誰でもそこにバタヌスコッチを芋぀けるでしょう。誰もがそれを奜むわけではありたせんが、割り蟌みハンドラヌを陀いお、メむン コヌドを Web フレヌムワヌクの関数に結び付けおいないので、将来的には、ほずんどすべおのコヌドを簡単に曞き盎すこずができたす。゚ンゞン。

TODO

  • クラスタヌファむルシステムを持たない倧芏暡システムでの䜿甚を可胜にする独自のレプリケヌタヌずディストリビュヌタヌ + geo の開発 (すべお倧人向け)
  • メタデヌタが完党に倱われた堎合の完党な逆回埩の可胜性ディストリビュヌタを䜿甚しおいる堎合
  • 氞続的なネットワヌク接続ずさたざたなプログラミング蚀語のドラむバヌを䜿甚できるネむティブ プロトコル
  • NoSQL コンポヌネントを䜿甚するための高床な可胜性
  • Bolt アヌカむブ内のファむルたたは倀、および通垞のファむルのさたざたなタむプの圧瞮 (gzip、zstd、snappy)
  • Bolt アヌカむブ内のファむルたたは倀ず通垞のファむルのさたざたなタむプの暗号化
  • GPU を含むサヌバヌ偎のビデオ倉換の遅延

私はすべおを持っおいたす。このサヌバヌが誰かの圹に立おば幞いです。BSD-3 ラむセンス、二重著䜜暩、もし私が働いおいる䌚瀟がなければ、サヌバヌは䜜成されなかったでしょう。 開発者は私だけです。 バグや機胜のリク゚ストを芋぀けおいただければ幞いです。

出所 habr.com

コメントを远加したす