Storacle - 分散型ファイルストレージ

Storacle - 分散型ファイルストレージ

始める前に出発しなければなりません 前の記事へのリンク私たちが正確に何を話しているのかが明確になるように。

この記事では、ファイルの保存を担当するレイヤーと、それを誰でもどのように使用できるかについて見ていきたいと思います。 Storacle はスタンドアロンのライブラリです、音楽とは直接の関係はありません。あらゆるファイルのストレージを整理できます。

前回の記事では、少しだけ「バレルを転がして」みました。 ipfs、しかし、これはまさに私が解決していた問題の文脈で起こりました。全体として、このプロジェクトは素晴らしいと思います。私は、タスクごとに異なるネットワークを作成できる機能を好みます。これにより、構造をより適切に整理し、個々のノードとネットワーク全体の負荷を軽減できます。 1 つのプロジェクトのフレームワーク内であっても、必要に応じて、いくつかの基準に従ってネットワークを分割して、全体の負荷を軽減することができます。

そこでstoracleはこのメカニズムを使用します 拡散可能 ネットワークを組織するため。主な特徴:

  • ファイルは任意のノードを通じてリポジトリに追加できます。
  • ファイルはブロック単位ではなく全体が保存されます。
  • 各ファイルには、その後の作業のために独自の一意のコンテンツ ハッシュがあります。
  • ファイルを複製して信頼性を高めることができます
  • 1 つのノード上のファイルの数は、ファイル システムによってのみ制限されます (例外があります。詳細は後述します)。
  • ネットワーク内のファイルの数は、ネットワーク内の有効なノードの数に応じた拡散機能によって制限されます。2 番目のバージョンでは、無限の数のノードで動作できるようになります (これについては別の記事で詳しく説明します)。

これがプログラムから一般的にどのように機能するかを示す簡単な例:

サーバ:

const  Node = require('storacle').Node;

(async () => {
  try {
    const node = new Node({
      port: 4000,
      hostname: 'localhost'
    });
    await node.init();
  }
  catch(err) {
    console.error(err.stack);
    process.exit(1);
  }
})();

クライアント:

const  Client = require('storacle').Client;

(async () => {
  try {
    const client = new  Client({
      address: 'localhost:4000'
    });
    await client.init();
    const hash = await client.storeFile('./my-file');
    const link = await client.getFileLink(hash); 
    await client.removeFile(hash);
  }
  catch(err) {
    console.error(err.stack);
    process.exit(1);
  }
})();

内観

ボンネットの下には特別なことは何もありません。ファイル数やファイルの合計サイズなどの情報はインメモリデータベースに保存され、ファイルの削除や追加時に更新されるため、ファイルシステムに頻繁にアクセスする必要がありません。例外は、特定のストレージ サイズに達したときにファイルを循環させる必要があり、新しいファイルの追加を禁止しない場合にガベージ コレクターを有効にすることです。この場合、ストレージをバイパスする必要があり、多数のファイル (> たとえば 100 万) を操作すると、かなりの負荷がかかる可能性があります。また、保存するファイルを減らして、より多くのノードを実行する方が良いでしょう。 「クリーナー」が無効になっている場合、そのような問題は発生しません。

ファイルストレージは 256 個のフォルダーと 2 レベルのネストで構成されます。ファイルは第 1 レベルのフォルダーに保存されます。つまり62500万あれば。このようなフォルダーごとに約 1000000 個のファイルが存在します (256 / sqrt(XNUMX))。

フォルダー名はファイル ハッシュから形成されるため、ハッシュがわかっていればすぐにアクセスできます。

この構造は、多数のさまざまなストレージ要件に基づいて選択されました。たとえば、1 つのフォルダーに多数のファイルが存在することが望ましくない弱いファイル システムのサポート、必要に応じてすべてのフォルダーを素早く走査するなどです。ある種の黄金の意味。

キャッシング

ファイルを追加するとき、およびファイルを受信するときに、ファイルへのリンクがキャッシュに書き込まれます。
このおかげで、ファイルを探すためにネットワーク全体を横断する必要がほとんどなくなります。これにより、リンクの受信が高速化され、ネットワークの負荷が軽減されます。キャッシュは http ヘッダー経由でも行われます。

同型性

クライアントは JavaScript で記述されており、同形であるため、ブラウザから直接使用できます。 
ファイルをアップロードできます https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js スクリプトとしてアクセスしてください window.ClientStoracle またはビルド システムなどを介してインポートします。

遅延リンク

興味深い機能は「遅延参照」です。これは、今ここで同期的に取得できるファイルへのリンクであり、ファイルがストレージ内ですでに見つかった場合には、そのファイルが取得されます。これは、サイト上で写真を表示する必要がある場合などに非常に便利です。遅延リンクを src に配置するだけです。いろいろなケースが考えられます。

クライアントAPI

  • 非同期 Client.prototype.storeFile() - ファイルの保存
  • 非同期 Client.prototype.getFileLink() — ファイルへの直接リンクを取得する
  • 非同期 Client.prototype.getFileLinks() — ファイルが存在するすべてのノードからファイルへの直接リンクのリストを取得する
  • 非同期 Client.prototype.getFileToBuffer() — ファイルをバッファに取得します
  • 非同期 Client.prototype.getFileToPath() — ファイルをファイルシステムに取得します
  • 非同期 Client.prototype.getFileToBlob() — blob 内のファイルを取得します (ブラウザー版の場合)
  • 非同期 Client.prototype.removeFile() - ファイルを削除する
  • Client.prototype.createRequestedFileLink() — 遅延リンクを作成する

ファイルを別のサーバーにエクスポートする

ファイルを別のノードに転送するには、次のことができます。

  • 保存フォルダー全体を設定とともにコピーするだけです。 (将来的には機能しなくなる可能性があります)
  • ファイルのあるフォルダーのみをコピーします。ただし、この場合、関数を一度実行する必要があります。 node.normalizeFilesInfo()すべてのデータを再計算してデータベースに入力します。
  • 使用機能 ノード.exportFiles()ファイルのコピーが開始されます。

基本的なノード設定
ストレージ ノードを起動するときに、必要な設定をすべて指定できます。
最も基本的なものについて説明します。残りは Github にあります。

  • ストレージ.データサイズ — ファイルが入っているフォルダーのサイズ
  • storage.tempSize — 一時フォルダーのサイズ
  • storage.autoCleanSize — 保持する必要がある最小ストレージ サイズ。このパラメーターを指定すると、スペースが不足し始めるとすぐに、最も使用されていないファイルが削除されます。
  • ファイル.最大サイズ — 最大ファイルサイズ
  • ファイル.minSize — 最小ファイルサイズ
  • file.preferredDuplicates — ネットワーク上のファイル重複の推奨数
  • file.mimeWhitelist - 有効なファイルタイプ
  • file.mimeBlacklist - 無効なファイルタイプ
  • file.extホワイトリスト - 有効なファイル拡張子
  • file.extブラックリスト - 無効なファイル拡張子
  • ファイル.リンクキャッシュ - さまざまなリンク キャッシュ設定

寸法に関連するほぼすべてのパラメータは、絶対値と相対値の両方で入力できます。

コマンドライン経由で作業する
ライブラリはコマンドライン経由で使用できます。これを行うには、グローバルにインストールする必要があります。 npm i -g ストレージ。この後、ノードが存在するプロジェクト ディレクトリから必要なアクションを起動できます。例えば、 storacle -a storeFile -f ./file.txt -c ./config.jsファイルを追加します。すべてのアクションは次の場所にあります。 https://github.com/ortexx/storacle/blob/master/bin/actions.js

なぜこれが必要なのでしょうか?

  • 便利な方法を使用してファイルを保存して操作する、ある種の分散プロジェクトを作成したい場合。たとえば、記事冒頭のリンクで説明されている音楽プロジェクトでは、 倉庫.
  • ファイルを分散して保存する必要がある他のプロジェクトに取り組んでいる場合。閉域ネットワークを簡単に構築し、柔軟にノードを構成し、必要に応じて新しいノードを追加できます。
  • Web サイトのファイルをどこかに保存する必要があるだけで、すべてを自分で書くのは大変な場合。おそらく、このライブラリは他のライブラリよりもあなたのケースに適しています。
  • ファイルを操作するプロジェクトがあるが、すべての操作をブラウザから実行したい場合。サーバーコードの記述を避けることができます。

私の連絡先:

出所: habr.com

コメントを追加します