數(shù)據(jù)倉庫組件Data-Stash:助力區(qū)塊鏈節(jié)點“輕裝上陣”
當(dāng)下,數(shù)據(jù)在全球經(jīng)濟(jì)運轉(zhuǎn)中的價值日益凸顯,與傳統(tǒng)的土地、勞動力、資本、技術(shù)等并列,成為重要生產(chǎn)要素。
數(shù)據(jù)最終的價值來源于治理。只有經(jīng)過采集、清洗、分析和處理后的數(shù)據(jù),才能在流通中更順暢地使用,其價值才能得到更充分地挖掘。同時,隨著區(qū)塊鏈技術(shù)的蓬勃發(fā)展,區(qū)塊鏈漸趨規(guī)模化應(yīng)用,鏈上數(shù)據(jù)總量呈指數(shù)級增長,其中蘊(yùn)藏的巨大價值,也需要通過高效、規(guī)范的數(shù)據(jù)治理,才能得到充分彰顯。
在區(qū)塊鏈數(shù)據(jù)治理方面,微眾銀行區(qū)塊鏈基于多年技術(shù)研究和應(yīng)用實踐經(jīng)驗,研發(fā)了一套數(shù)據(jù)治理通用組件(WeBankBlockchain-Data),多維提升開發(fā)、運營、運維效率,實現(xiàn)數(shù)據(jù)從要素到資源的轉(zhuǎn)化。
目前,該套組件由數(shù)據(jù)倉庫組件(Data-Stash)、數(shù)據(jù)導(dǎo)出組件(Data-Export)、數(shù)據(jù)對賬組件(Data-Reconcile)三個相互獨立、可插拔、可靈活組裝的子組件構(gòu)成,所有代碼和文檔均于2020年12月正式對外開源。詳情可參考開源公告。
三個子組件面向不同角色解決相應(yīng)的數(shù)據(jù)治理需求,業(yè)務(wù)、運營、開發(fā)、運維等不同角色,如何快速上手使用?我們將通過系列文章,抽絲剝繭解析每一個子組件的關(guān)鍵特性和使用方式。本文介紹數(shù)據(jù)倉庫組件Data-Stash,歡迎大家積極體驗并將使用訴求或優(yōu)化建議反饋給我們。
??認(rèn)識Data-Stash
隨著區(qū)塊鏈業(yè)務(wù)不斷運行,累積的海量鏈上數(shù)據(jù)會對區(qū)塊鏈節(jié)點乃至網(wǎng)絡(luò)的運維帶來挑戰(zhàn)。
數(shù)據(jù)倉庫組件Data-Stash為上述難題提供解決方案,通過為節(jié)點在外部生成全量數(shù)據(jù)備份,實現(xiàn)海量數(shù)據(jù)高效治理。
具體而言,節(jié)點通過數(shù)據(jù)裁剪實現(xiàn)冷熱數(shù)據(jù)分離,鏈上僅保留熱數(shù)據(jù),冷數(shù)據(jù)則通過全量備份獲取,以此節(jié)省節(jié)點空間。冷熱數(shù)據(jù)分離后,交易的驗證、執(zhí)行僅依賴于鏈上熱數(shù)據(jù),從而提升交易執(zhí)行性能。
對于新節(jié)點加入網(wǎng)絡(luò)后數(shù)據(jù)的同步,只需要從全量備份拉取數(shù)據(jù),實現(xiàn)數(shù)據(jù)高效同步,其間不占用區(qū)塊鏈網(wǎng)絡(luò)帶寬,免去冗長的同步過程,減少節(jié)點數(shù)據(jù)同步的等待時間,使得節(jié)點可以快速加入?yún)^(qū)塊鏈網(wǎng)絡(luò)并正常工作。
目前該組件支持區(qū)塊鏈底層平臺FISCO BCOS v2.7.1及以上版本。
??Data-Stash關(guān)鍵特性一覽
作為一個數(shù)據(jù)治理工具,Data-Stash可為區(qū)塊鏈底層平臺提供節(jié)點數(shù)據(jù)擴(kuò)容、備份、裁剪和高效同步的能力,具有斷點續(xù)傳、可信驗證、易于使用等優(yōu)點。用戶可基于Binlog協(xié)議同步區(qū)塊鏈底層節(jié)點全量數(shù)據(jù),進(jìn)而實現(xiàn)全量數(shù)據(jù)備份、冷熱數(shù)據(jù)分離、節(jié)點快速同步,適合節(jié)點有海量數(shù)據(jù)等運維場景。
1)節(jié)點賬本全量備份
Data-Stash通過解析節(jié)點生成的Binlog,可以在節(jié)點外生成鏈上數(shù)據(jù)的全量備份。隨后,節(jié)點運維人員可對鏈上數(shù)據(jù)進(jìn)行裁剪,達(dá)到節(jié)省空間、提升性能的效果。對于裁剪后缺失的冷數(shù)據(jù),節(jié)點會通過amdb從全量備份讀取。節(jié)點還可以通過fisco-sync工具,將數(shù)據(jù)重新導(dǎo)回到節(jié)點,恢復(fù)完整的節(jié)點,而不必從區(qū)塊鏈網(wǎng)絡(luò)拉取數(shù)據(jù)。

2)多維度賬本校驗
數(shù)據(jù)倉庫組件在讀取某節(jié)點日志后,會進(jìn)行多重校驗,以防出現(xiàn)節(jié)點賬本信息被損害、被篡改、共識系統(tǒng)異常等情況。
校驗是多維度的,整體可分為對比校驗和區(qū)塊鏈校驗。對比校驗是指Data-Stash會拉取多個節(jié)點的賬本進(jìn)行對比,確認(rèn)賬本內(nèi)容一致后才可以入庫;區(qū)塊鏈校驗是指驗證區(qū)塊鏈本身,包括哈希檢查、簽名檢查、狀態(tài)根檢查等。

3)備份數(shù)據(jù)可信存儲
Data-Stash每處理完一個區(qū)塊,都會為此時的全量備份生成一個哈希值作為檢查點。該檢查點會為存儲增信,適用于全量備份庫之間的校驗等場景。
例如,不同機(jī)構(gòu)生成了各自的全量備份,現(xiàn)在想比對各自備份數(shù)據(jù)是否一致,各機(jī)構(gòu)只需要提取出最新區(qū)塊高度的檢查點進(jìn)行比對,如一致,則表示備份內(nèi)容完全相同。
4)斷點續(xù)傳
在實際運行中,F(xiàn)ISCO BCOS會生成許多Binlog,這些Binlog無論是體積、數(shù)目,都具有相當(dāng)規(guī)模,如果每一次運行都重復(fù)下載、解析,會造成性能浪費。為此,我們設(shè)計了斷點續(xù)傳機(jī)制,組件會持續(xù)記錄解析的進(jìn)度,每次運行時都會從上一次斷點處運行,而不會重新開始。
5)易于使用
Data-Stash以jar包的形式提供服務(wù),用戶可通過jar包或bash腳本運行。開發(fā)者只需要做最少化配置,默認(rèn)情況下,只需要配置nginx地址、全量數(shù)據(jù)庫地址,程序即可運行。
此外,Data-Stash還允許用戶進(jìn)行更高級的配置設(shè)置,例如修改批插入次數(shù)、輪詢間隔等。
??Data-Stash如何進(jìn)行數(shù)據(jù)治理?
Data-Stash是助力海量數(shù)據(jù)治理的第一環(huán),通過生成節(jié)點全量備份,以滿足冷熱分離、高效同步、監(jiān)管審計等需求。
1)實現(xiàn)冷熱數(shù)據(jù)分離
隨著時間推移,節(jié)點會積累越來越多的賬本數(shù)據(jù),如果節(jié)點體積不受控制的增長,最終會將節(jié)點服務(wù)器侵蝕殆盡,造成不良影響。對此,開發(fā)者可以使用數(shù)據(jù)倉庫服務(wù)來實現(xiàn)冷熱數(shù)據(jù)分離。
- 確保節(jié)點已經(jīng)開啟Binlog,如果節(jié)點未開啟Binlog并已在運行,可先停止節(jié)點,刪除群組數(shù)據(jù)、開啟Binlog后再重啟節(jié)點,節(jié)點即可重新同步并生成Binlog。
- 準(zhǔn)備好一個第三方數(shù)據(jù)庫,啟動Data-Stash服務(wù),將節(jié)點Binlog持續(xù)導(dǎo)入到該數(shù)據(jù)庫中,實現(xiàn)全量備份。
- 開發(fā)者可對鏈上數(shù)據(jù)做一定劃分,可將節(jié)點上不常用數(shù)據(jù)刪除,特別是對于存證這樣關(guān)聯(lián)性較弱的業(yè)務(wù),保留近期數(shù)據(jù)即可。
- 為了讓節(jié)點運行不受影響,用戶需要保證啟用amdb,這樣缺失的冷數(shù)據(jù)會自動從數(shù)據(jù)倉庫讀取,完成節(jié)點瘦身。
啟用amdb請參考:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/data_governance.html#amdb-proxy
2)實現(xiàn)節(jié)點高效同步
在區(qū)塊鏈業(yè)務(wù)運行時,經(jīng)常有節(jié)點同步或升級的需求。例如,服務(wù)器因為某些故障需要被下線回收,或者需要更換磁盤,此時需要對服務(wù)器或磁盤數(shù)據(jù)進(jìn)行同步,重新運行節(jié)點需要從區(qū)塊鏈網(wǎng)絡(luò)里同步數(shù)據(jù),若待同步數(shù)據(jù)很大,例如幾十G、幾百G,就會使得數(shù)據(jù)恢復(fù)時間冗長,而且還會占滿區(qū)塊鏈的網(wǎng)絡(luò)帶寬,使得整個系統(tǒng)長時間停滯。
開發(fā)者可通過Data-Stash實現(xiàn)節(jié)點同步:
- 開發(fā)者需要通過Data-Stash生成全量數(shù)據(jù)備份。
- 當(dāng)需要節(jié)點同步時,開發(fā)者可以通過FISCO BCOS項目下的fisco sync數(shù)據(jù)同步工具,將數(shù)據(jù)倉庫導(dǎo)回到節(jié)點。這一過程不依賴于任何其他節(jié)點,所以同步不會占用區(qū)塊鏈的網(wǎng)絡(luò)資源。
fisco sync數(shù)據(jù)同步工具參考鏈接:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/data_governance.html#fisco-sync
3)監(jiān)管、審計、追溯
對于監(jiān)管方而言,要求賬本數(shù)據(jù)完整、可查詢,但區(qū)塊鏈自身的賬本數(shù)據(jù)庫不一定滿足該需求。例如出于節(jié)點瘦身、數(shù)據(jù)分片等需求,節(jié)點上可能僅存儲部分賬本數(shù)據(jù);出于寫性能的需要,區(qū)塊鏈會選擇rocksdb等數(shù)據(jù)庫,但這類數(shù)據(jù)庫在讀性能上不具備優(yōu)勢。
此時,監(jiān)管方可以對某個節(jié)點運行數(shù)據(jù)倉庫服務(wù)導(dǎo)出完整的全量備份,由于關(guān)系型數(shù)據(jù)庫的采用,查詢也十分便捷。同時,在全量備份過程中,我們采用的多維度校驗機(jī)制具有易于驗證的優(yōu)勢,可防止節(jié)點運維惡意修改賬本信息欺騙監(jiān)管方,更好地滿足監(jiān)管需求。
??Data-Stash整體架構(gòu)
FISCO BCOS節(jié)點在共識過程中持續(xù)獲取新的區(qū)塊,并更新自己的賬本狀態(tài),此外還會生成Binlog日志,以記錄該區(qū)塊對應(yīng)的狀態(tài)變動,外界可以通過nginx訪問到這些Binlog日志。
與此同時,Data-Stash會不斷輪詢nginx以下載最新的Binlog日志到本地,并進(jìn)行解析,解析出區(qū)塊變動信息后會進(jìn)行校驗,防止錯誤的Binlog被導(dǎo)入。校驗通過后,區(qū)塊變動數(shù)據(jù)會存儲到指定的持久化系統(tǒng)中,這樣該系統(tǒng)就成為了節(jié)點賬本的全量備份。
Data-Stash還會為每一個區(qū)塊生成對應(yīng)的檢查點,為全量備份增信。本地被處理完的Binlog也會被清理掉。
Data-Stash的整體運行模式如下:

其中,節(jié)點服務(wù)器需要用戶手動配置,配置好后即可調(diào)用Data-Stash進(jìn)行解析。
節(jié)點服務(wù)器
節(jié)點服務(wù)器相關(guān)的組件包括:
1)FISCO BCOS節(jié)點
FISCO BCOS節(jié)點的賬本按照mysql存儲,每新增加一個區(qū)塊,都會為mysql里添加一些數(shù)據(jù),mysql表的變化會被記錄到Binlog中,Binlog目錄被放在data/groupX/BinaryLogs目錄下,x表示群組號:

2)Nginx
FISCO BCOS節(jié)點本身并不會暴露Binlog,如果希望外界讀取到Binlog,需要借助nginx。通過在nginx中配置端口和Binlog目錄的映射,外界就可以通過該端口訪問到Binlogs。
認(rèn)識Binlog:Binlog記錄賬本的變化。在FISCO BCOS中,每得到一個新的區(qū)塊后,該區(qū)塊都會被存儲到賬本中,同時Binlog會記錄賬本的變動,并按區(qū)塊來進(jìn)行組織。每個Binlog日志會包含多個區(qū)塊對應(yīng)的變化,Binlog會以記錄的第一個區(qū)塊高度作為文件名,例如3.binlog表示該文件中的區(qū)塊以3作為起始。
下圖是Binlog的結(jié)構(gòu):

數(shù)據(jù)倉庫組件
數(shù)據(jù)倉庫組件由如下幾個部分構(gòu)成:
1)下載服務(wù)Fetcher Server
下載服務(wù)會持續(xù)輪詢nginx端口,下載最新Binlog日志到本地目錄中。2)解析服務(wù)Binlog Parser
解析服務(wù)持續(xù)讀取Binlog日志,并對Binlog中的區(qū)塊信息進(jìn)行解析。3)校驗服務(wù)Binlog verifier
校驗服務(wù)用于保證數(shù)據(jù)的可信性。校驗服務(wù)會從其他節(jié)點拉取Binlog進(jìn)行對比,保證內(nèi)容的一致性,并對數(shù)據(jù)本身進(jìn)行校驗,例如對于區(qū)塊哈希校驗、區(qū)塊簽名校驗、交易根校驗等。4)存儲服務(wù)Data Storage
存儲服務(wù)按照Binlog的變動,會將其內(nèi)容應(yīng)用到數(shù)據(jù)庫中,該數(shù)據(jù)庫會包含系統(tǒng)表、合約表等,結(jié)構(gòu)上與節(jié)點保持一致,數(shù)據(jù)量上則包含節(jié)點運行至今的所有區(qū)塊鏈數(shù)據(jù)。表結(jié)構(gòu)可分為如下幾類:| 類型 | 表前綴 | 說明 |
| 系統(tǒng)表 | _sys_ | 包含區(qū)塊鏈信息,例如區(qū)塊數(shù)據(jù)(_sys_hash_2_block_)、共識狀態(tài)(_sys_consensus_)、cns(_sys_cns_)等 |
| 合約表 | c_或cp_ | 記錄合約信息,包括nonce值、合約代碼、代碼哈希等 |
| 用戶表 | _u_ | 調(diào)用CRUD合約創(chuàng)建的表 |
5)檢查點服務(wù)Checkpoint Handler每一個區(qū)塊數(shù)據(jù)的入庫存儲,都會生成一個檢查點數(shù)據(jù),該檢查點包含了前置所有區(qū)塊數(shù)據(jù)的哈希,用于額外對存儲進(jìn)行增信。
??即刻使用
上述功能所涉及的最新代碼和技術(shù)文檔已同步更新,歡迎體驗和 star 支持。如需咨詢技術(shù)問題,歡迎關(guān)注本公眾號,對話框回復(fù)【小助手】進(jìn)技術(shù)交流群。
Data-Stash github代碼庫地址碼倉庫:
https://github.com/WeBankBlockchain/Data-Stash
Data-Stash gitee代碼庫地址:https://gitee.com/WeBankBlockchain/Data-StashData-Stash 技術(shù)文檔:https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Stash/index.html首次體驗Data-Stash,可參考快速部署文檔:https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Stash/quickstart.html
向我們報告問題,歡迎提交issue:https://github.com/WeBankBlockchain/Data-Stash/issues

