Filecoin - 深入理解存儲管理


Filecoin - 深入理解存儲管理

Filecoin的存儲單元稱為扇區(Sector)。對傳統硬盤結構理解的小伙伴,對這個術語應該比較親切,傳統硬盤的最小存儲單元就叫Sector。為了證明Sector的存儲,Filecoin進行了一系列的處理,傳說中的P1/P2/C1/C2。在處理過程中,一個Sector的計算會生成若干文件,最終會生成replica。相關文件是如何組織的?Cache都是由哪些文件組成,分別是多大?本文就從存儲的角度看看這些過程和邏輯。

Filecoin的存儲單元稱為扇區(Sector)。對傳統硬盤結構理解的小伙伴,對這個術語應該比較親切,傳統硬盤的最小存儲單元就叫Sector。為了證明Sector的存儲,Filecoin進行了一系列的處理,傳說中的P1/P2/C1/C2。在處理過程中,一個Sector的計算會生成若干文件,最終會生成replica。相關文件是如何組織的?Cache都是由哪些文件組成,分別是多大?本文就從存儲的角度看看這些過程和邏輯。

Filecoin的存儲管理的邏輯主要實現在sector-storage項目中。在深入理解Sector存儲邏輯之前,先講講Worker和Manager。

01 相關術語

  • Worker - 處理P1/P2/C1/C2的服務,Worker又分為兩種:local worker和remote worker。local worker處理本地服務處理,remote worker支持遠程服務處理

  • Manager - 管理多個Worker

  • Scheduler - 調度器,調度多個Worker,一個Manager通常有一個Scheduler

  • Store - Sector存儲系統

02 Sector存儲

Sector處理相關的文件存儲在Store中。Store通過sectorstore.json進行配置:

cat sectorstore.json
{
 "ID": "98bd61f8-f52d-45a3-af2c-b8596cbd693d",
 "Weight": 10,
 "CanSeal": true,
 "CanStore": true
}

CanSeal表明Store可以用來Seal(存儲Seal相關的臨時文件),CanStore表面Store可以持久存儲Seal的結果(replica)。Weight 是權重,在多個Store選擇時使用。ID是Store的UUID編號。

一個Store中存在三種存儲,分別對應三種目錄:unsealed (未封存的文件),cache(緩存文件),sealed(封存后的文件)。

03 Worker & Store

sector-storage項目的README中的這張圖很好的解釋了sector storage的各個模塊以及相互的關系:

整幅圖分為上下兩個部分:上部分是Manager,下部分是Remote Worker。Manager中包括一個Local Worker。stores.Index是所有Sector存儲的索引。Scheduler,上部分的中間,管理所有的Worker,並且調度Sector相關的存儲。

worker management APIs通過/rpc/v0的jsonRPC接口實現remote worker的管理。通過/remote的HTTP API實現存儲的Fetch操作,簡單的說,傳輸文件。specs-storage.Prover/Sealer/Storage是Manager暴露出來的接口,實現Sector的證明,封存和存儲。

每個連接到Manager的Worker會和Manager同步它的內存/CPU以及顯存的信息。Scheduler在接受到新的請求時,會針對請求(Task)的類型以及資源的需求,從當前Worker中挑選最合適的Worker進行請求的處理。如何選擇Worker,感興趣的小伙伴,可以查看selector的相關邏輯。

從存儲的角度,重新整理一下,這些關系:

以一個Manager連接兩個Worker為例。Worker只能Seal,但是不能Store。為了更清楚展示Worker之間的數據傳輸,第一個Worker只做Precommit1,第二個Worker做Precommit2和Commit。

04 Seal Task

理解Seal Task,最好對照了Sector的狀態管理一起看。對Sector狀態管理還不熟悉的小伙伴,可以查看之前的文章:

Filecoin - Sector狀態管理邏輯

const (
 TTAddPiece   TaskType = "seal/v0/addpiece"
 TTPreCommit1 TaskType = "seal/v0/precommit/1"
 TTPreCommit2 TaskType = "seal/v0/precommit/2"
 TTCommit1    TaskType = "seal/v0/commit/1"
 TTCommit2    TaskType = "seal/v0/commit/2"

 TTFinalize TaskType = "seal/v0/finalize"

 TTFetch        TaskType = "seal/v0/fetch"
 TTUnseal       TaskType = "seal/v0/unseal"
 TTReadUnsealed TaskType = "seal/v0/unsealread"
)

接下來,看看每個Seal Task對應的存儲數據的變化。

AddPiece

如果其中左邊的Worker接收到任務,AddPiece任務會在unsealed目錄中創建原始數據。

PreCommit1

PreCommit1階段,簡稱P1,針對SDR算法,計算若干層數據。如果Sector是32G,需要計算11層。對SDR算法不熟悉的小伙伴,可以看看之前的文章:

Filecoin - 為什么SDR這么慢?

經過PreCommit1,生成的數據存儲在Cache中:

PreCommit2

PreCommit2的階段,簡稱P2,生成Replica,計算Column Hash,並生成Merkle樹(tree_d, tree_c, tree_r_last)。因為P2,不在同一個Worker處理,在進行處理之前,需要先傳輸給合適的Worker,處理的結果同樣存儲在Cache中:

Commit 和Finalize

在Commit生成證明后,進入Finalize狀態,Finalize可以理解成“歸檔”。因為在Worker上沒有Store能力,刪除不需要持久化的數據,需要持久化存儲的數據,將傳輸回Manager。

05 數據存儲量

以32G的Sector為例,在處理過程中需要存儲的數據如下:

  • 原始數據 - 32G

  • 原始數據Merkle - 32G

  • P1 layer - 32*11G

  • P2 - Column Hash & tree_c - 32*2 G

  • P2 - Replica & tree_r_last - 32G + 9.2M*8

總共:512G多一點。

06 持久化數據

Sector經過P1/P2/C1/C2處理后,也就是說,經過PoREP處理后,需要持久化存儲Replica的數據和tree_r_last的數據。tree_r_last的數據需要存儲的原因是PoSt要用到。特別注意的是,tree_r_last的數據並不是完整的Merkle樹數據,刪除了其中一些層的數據。

32G的Sector,對應的tree_r_last分成了8棵子樹,每棵子樹是8叉樹,默認存儲的時候,忽略了最低的兩層。也就是,去除最低兩層的存儲量為:

所以每棵子樹的存儲數據為4G*0.00223 = 9.13M。

也就是說,Sector持久化存儲比例在1.0022左右。

總結:

Filecoin存儲管理的邏輯主要在sector-storage中。Sector的處理任務,可以通過多個Worker完成。每個Worker的存儲目錄結構一致,Sector數據可以在多個Worker之間通過Http服務傳輸。Sector處理過程中,最大的存儲需求量在512G左右。持久化存儲比例為1.0022。

本文參與登鏈社區寫作激勵計划 ,好文好收益,歡迎正在閱讀的你也加入。

原文地址:Filecoin - 深入理解存儲管理 | 登鏈社區 | 深入淺出區塊鏈技術 (learnblockchain.cn)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM