FISCO BCOS 2.0原理解析: 分佈式存儲架構設計

FISCO BCOS 2.0新增對分佈式數據存儲的支持,克服了本地化數據存儲的諸多限制。

在FISCO BCOS 1.0中,節點採用MPT數據結構,通過LevelDB將數據存儲於本地,這種模式受限於本地磁盤大小,當業務量增大時數據會急劇膨脹,要進行數據遷移也非常複雜,給數據存儲帶來較大的成本和維護難度。

爲了突破性能的瓶頸,我們在FISCO BCOS 2.0中,對底層的存儲進行了重新設計,實現了分佈式存儲,使用不同於MPT的方式來實現追溯,帶來了性能上的提升。

 

先誇誇分佈式存儲方案的優點:

  • 支持多種存儲引擎,選用高可用的分佈式存儲系統,可以支持數據簡便快速地擴容;

  • 將計算和數據隔離,節點故障不會導致數據異常;

  • 數據在遠端存儲,數據可以在更安全的隔離區存儲,這在很多場景中非常有意義;

  • 分佈式存儲不僅支持Key-Value形式,還支持SQL方式,使得業務開發更爲簡便;

  • 世界狀態的存儲從原來的MPT存儲結構轉爲分佈式存儲,避免了世界狀態急劇膨脹導致性能下降的問題;

  • 優化了數據存儲的結構,更節約存儲空間。

 

從MPT存儲到分佈式存儲

 

MPT存儲

MPT(Merkle Paricia Trie),來自以太坊,對外接口爲Key-Value,使用前綴樹來存儲數據,是FISCO BCOS 1.0的存儲模式。

MPT是前綴樹結構,樹中的每個葉子節點允許有最多16個子葉子節點,葉子節點有一個HASH字段,由該葉子的所有子葉子節點HASH運算得出。樹根有唯一的HASH值,標識整棵樹的HASH。

以太坊的全局狀態數據,保存在MPT樹中,狀態數據由賬號組成。賬號在MPT中是一個葉子節點,賬號數據包括Nonce、Balance、CodeHash和StorageRoot。任意一個賬號字段發生變化時,會導致該賬號所在的葉子的HASH發生變化,從該葉子直到頂部的所有葉子的HASH都會變化,最後導致頂部的StateRoot變化。

由此可見,任何賬戶的任意字段變化,都會導致StateRoot的變化,StateRoot能唯一標識以太坊的全局狀態。

MPT可以實現輕客戶端和數據追溯,通過StateRoot可以查詢到區塊的狀態。

MPT帶來了大量HASH的計算,打散了底層數據存儲的連續性。在性能方面,MPT State存在着天然的劣勢。

可以說,MPT State追求極致的可證明性和可追溯性,對性能和可擴展性做了一定的妥協。

 

分佈式存儲

FISCO BCOS 2.0在保持存儲接口兼容性的同時,引入了高擴展性、高吞吐量、高可用、高性能的分佈式存儲。

分佈式存儲(Advanced Mass Database,AMDB):重新抽象了區塊鏈的底層存儲模型,實現了類SQL的抽象存儲接口,支持多種後端數據庫,包括KV數據庫和關係型數據庫。 

引入了分佈式存儲後,數據讀寫請求不經過MPT,直接訪問存儲,結合緩存機制,存儲性能相比基於MPT的存儲有大幅提升。MPT數據結構仍然保留,僅做爲可選方案。

分佈式存儲支持MySQL等關係型數據庫,支持MySQL集羣、分庫分表等平行擴展方式,理論上存儲容量無限。

 

分佈式存儲架構

State層(State)

抽象了智能合約的存儲訪問接口,由EVM調用,分爲StorageState和MPTState。StorageState爲分佈式存儲的適配層,MPTState爲老的MPT適配層,FISCO BCOS默認使用StorageState。

分佈式存儲層(Table)

抽象了分佈式存儲的類SQL接口,由State層和Precompiled調用。分佈式存儲層抽象了存儲的增刪改查接口,把區塊鏈的核心數據分類存儲到不同的表中。

驅動層(Storage)

實現具體的數據庫訪問邏輯,包括LevelDB和MySQL。

 

分佈式存儲名詞解釋

Table

存儲表中的所有數據。Table中存儲分佈式存儲主key到對應Entries的映射,可以基於分佈式存儲主key進行增刪改查,支持條件篩選。

Entries

Entries中存放主Key相同的Entry,數組。分佈式存儲的主Key與Mysql中的主key不同,分佈式存儲主key用於標示Entry屬於哪個key,相同key的Entry會存放在同一個Entries中。

Entry

對應於表中的一行,每行以列名作爲key,對應的值作爲value,構成KV結構。每個Entry擁有自己的分佈式存儲主key,不同Entry允許擁有相同的分佈式存儲主key。

Condition

Table中的“刪改查”接口可傳入條件,支持“等於”“大於”“小於”等過濾邏輯,接口根據條件對數據進行篩選後進行相應操作,返回結果數據。如果條件爲空,則不做任何篩選。

 

舉例

以某公司員工領用物資登記表爲例,解釋上述名詞

  • 表中Name是分佈式存儲主key。

  • 表中的每一行爲一個Entry。一共有4個Entry,每個Entry有三個字段。

  • Table中以Name爲主key,存有3個Entries對象。第1個Entries中存有Alice的2條記錄,第2個Entries中存有Bob的1條記錄,第3個Entries中存有Chris的一條記錄。

  • 調用Table類的查詢接口時,查接口需要指定分佈式存儲主key和條件,設置查詢的分佈式存儲主key爲Alice,條件爲price > 40,會查詢出Entry1。

 

分佈式存儲表分類

表中的所有entry,都會有_status_,_num_,_hash_內置字段。

系統表

系統表默認存在,由存儲驅動保證系統表的創建。

用戶表

用戶CRUD合約所創建的表,以_user_<TableName>爲表名,底層自動添加_user_前綴。

StorageState賬戶表

_contract_data_+Address+_作爲表名。表中存儲外部賬戶相關信息。表結構如下:

 

總結

FISCO BCOS發佈至今,歷經大量真實業務實踐。分佈式存儲在持續改進的過程中,總結出適合於金融業務、高性能、高可用性和高可擴展的存儲模型,架構愈發穩定成熟,未來分佈式存儲將繼續作爲區塊鏈系統的基石,支持區塊鏈系統的發展。


 

我們鼓勵機構成員、開發者等社區夥伴參與開源共建事業,有你在一起,會更了不起。多樣參與方式:

1 進入微信社羣,隨時隨地與圈內最活躍、最頂尖的團隊暢聊技術話題(進羣請添加小助手微信,微信ID:fiscobcosfan);

2 訂閱我們的公衆號:“FISCO BCOS開源社區”,我們爲你準備了開發資料庫、最新FISCO BCOS動態、活動、大賽等信息;

3 來Meetup與開發團隊面對面交流,FISCO BCOS正在全國舉辦巡迴Meetup,深圳、北京、上海、成都……歡迎您公衆號在菜單欄【找活動】中找到附近的Meetup,前往結識技術大咖,暢聊硬核技術;

4 參與代碼貢獻,您可以在Github提交Issue進行問題交流,歡迎向FISCO BCOS提交Pull Request,包括但不限於文檔修改、修復發現的bug、提交新的功能特性。

代碼貢獻指引:

https://github.com/FISCO-BCOS/FISCO-BCOS/blob/master/docs/CONTRIBUTING_CN.md

 

PS/

本文首發於公衆號【FISCO BCOS開源社區】,如轉載請註明出處,原創不易,謝謝珍惜

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章