Storacle - 去中心化文件存儲

Storacle - 去中心化文件存儲

在開始之前我必須離開 連結到上一篇文章以便清楚我們到底在談論什麼。

在本文中,我想了解負責儲存文件的層,以及任何人如何使用它。 Storacle 是一個獨立的函式庫,與音樂沒有直接連結。您可以組織任何文件的儲存。

在上一篇文章中,我稍微“滾動了桶子” ipfs,但這恰恰發生在我正在解決的問題的背景下。總的來說,我認為這個項目很酷。我只是更喜歡為不同任務創建不同網路的能力。這使您可以更好地組織結構並減少單個節點和整個網路的負載。即使在一個專案的框架內,如有必要,您也可以根據某種標準將網路拆分成多個部分,從而減少整體負載。

所以storacle使用的機制 可塗抹的 用於組織網路。主要特徵:

  • 可以透過任何節點將檔案新增至儲存庫。
  • 文件被完整保存,而不是區塊保存。
  • 每個檔案都有自己獨特的內容哈希值,以便進一步處理。
  • 文件可以複製以獲得更高的可靠性
  • 一個節點上的檔案數量僅受檔案系統的限制(有一個例外,更多內容見下文)
  • 網路中的檔案數量受到可傳播能力的限制,取決於網路中有效節點的數量,在第二個版本中,網路中的檔案數量將能夠與無限數量的節點一起工作(在另一篇文章中對此有更多介紹)

程式中一般如何運作的一個簡單範例:

服務器:

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);
  }
})();

內部視圖

引擎蓋下沒有什麼特別的。有關檔案數量、總大小等資訊儲存在記憶體資料庫中,並在刪除和新增檔案時更新,因此無需頻繁存取檔案系統。一個例外是,當您需要在達到特定儲存大小時循環檔案時啟用垃圾收集器,並且不禁止新增檔案。在這種情況下,您必須繞過存儲,並且處理大量文件(> 例如一百萬)可能會導致顯著的負載。並且最好存儲更少的文件並運行更多的節點。如果停用“清潔器”,則不存在此問題。

檔案儲存由 256 個資料夾和 2 層嵌套組成。檔案儲存在二級資料夾中。也就是說,如果有1萬。每個此類資料夾中將包含約 62500 個檔案 (1000000 / sqrt(256))。

資料夾名稱由檔案雜湊形成,因此如果您知道哈希,則可以快速存取它。

選擇這種結構是基於大量不同的儲存需求:支援弱檔案系統(不希望在一個資料夾中包含許多檔案)、必要時快速遍歷所有資料夾等。某種中庸之道。

緩存

當新增檔案以及接收檔案時,檔案的連結將寫入快取。
因此,通常不需要遍歷整個網路來搜尋文件。這加快了連結的接收速度並減少了網路負載。快取也透過 http 標頭進行。

同構

客戶端是用javascript寫的,而且是同構的,可以直接在瀏覽器中使用。 
您可以上傳文件 https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js 作為腳本和訪問 視窗.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() — 建立延遲連結

將文件匯出到另一台伺服器

為了將檔案傳輸到另一個節點,您可以:

  • 只需複製整個儲存資料夾以及設定即可。 (這在將來可能行不通)
  • 僅複製包含檔案的資料夾。但是,在這種情況下,您需要執行該函數一次 節點.normalizeFilesInfo()重新計算所有資料並將其輸入資料庫。
  • 使用函數 節點.exportFiles()這將開始複製文件。

基本節點設定
啟動儲存節點時,您可以指定所有必要的設定。
我會描述最基本的,其餘的可以在Github上找到。

  • 儲存.dataSize — 包含檔案的資料夾的大小
  • 存儲.tempSize — 臨時資料夾大小
  • 存儲.autoCleanSize — 需要儲存的最小儲存大小。如果指定此參數,那麼一旦空間開始耗盡,最少使用的檔案將被刪除。
  • 檔案最大大小 — 最大檔案大小
  • 文件最小大小 — 最小檔案大小
  • 文件.preferred重複項 — 網路上檔案重複的首選數量
  • 文件.mime白名單 - 有效的文件類型
  • 文件.mime黑名單 - 無效的文件類型
  • file.ext白名單 - 有效的檔案副檔名
  • file.ext黑名單 - 無效的檔案副檔名
  • 檔案.linkCache - 各種連結快取設置

幾乎所有與尺寸相關的參數都可以以絕對值和相對值輸入。

透過命令列工作
該庫可以透過命令列使用。為此,您需要全域安裝它: npm i -g 存儲。之後,您可以從節點所在的專案目錄啟動必要的操作。例如, 儲存 -a storeFile -f ./file.txt -c ./config.js新增檔案。所有操作都可以在中找到 https://github.com/ortexx/storacle/blob/master/bin/actions.js

為什麼你可能需要這個?

  • 如果您想建立某種去中心化項目,並計劃使用方便的方法來儲存和處理文件。例如,文章開頭的連結中所描述的音樂項目使用 儲藏室.
  • 如果您從事任何其他需要以分散式方式儲存文件的專案。您可以輕鬆建立封閉網絡,靈活配置節點並在需要時新增節點。
  • 如果您只需要將網站文件儲存在某個地方,而您自己編寫所有內容則太過分了。也許這個庫比其他庫更適合您的情況。
  • 如果您有一個需要處理文件的項目,但想要從瀏覽器執行所有操作。您可以避免編寫伺服器程式碼。

我的聯繫方式:

來源: www.habr.com

添加評論