Filecoin 深入理解儲存管理

2022-09-22 03:39:11 字數 3787 閱讀 6037

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。

cat sectorstore.json

canseal表明store可以用來seal(儲存seal相關的臨時檔案),canstore表面store可以持久儲存seal的結果(replica)。weight 是權重,在多個store選擇時使用。id是store的uuid編號。

乙個store中存在三種儲存,分別對應三種目錄:unsealed (未封存的檔案),cache(快取檔案),sealed(封存後的檔案)。

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。

理解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階段,簡稱p1,針對sdr演算法,計算若干層資料。如果sector是32g,需要計算11層。對sdr演算法不熟悉的小夥伴,可以看看之前的文章:

filecoin - 為什麼sdr這麼慢?

經過precommit1,生成的資料儲存在cache中:

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。

以32g的sector為例,在處理過程中需要儲存的資料如下:

總共:512g多一點。

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。

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

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...