前言
區塊鏈的全複製、擴充套件性等問題,使得業務向鏈上遷移會考慮採用兩層設計,有基於區塊鏈的合約層和鏈下拓展層,鏈下層承擔擴充套件鏈上能力。在兩層系統中,業務的存證或者協調資料在鏈上,鏈下拓展層會儲存完整資料內容,並參與業務計算。
隨著業務的持續,鏈下節點的資料會逐漸累積,越來越大,資料的增長速度甚至會超過儲存介質容量增長的速度,而不得不為節點提供更大的高效能磁碟,當資料增長突破容量限定後會影響系統性能與業務持續性;鏈上合約層,當狀態資料資料累積到一定資料量級會導致系統吞吐量下降、鏈上資料查詢變慢,服務質量下降。
另一方面,雙層系統無法和一般的資料儲存系統(MySQL儲存系統)一樣進行“select-insert-delete”式的歸檔。合約資料涉及多個業務參與方,鏈上資料和鏈下的錨定、關聯關係不能被破壞等約束。
為解決這些問題,我們對兩層系統的資料歸檔進行了一定的實踐,當合約層以及拓展層資料停止改變或不被頻繁使用時,對其進行遷移,減少合約狀態資料、讓出拓展層節點主儲存空間,提升系統的效能和服務質量。
什麼是資料歸檔?-----資料歸檔過程和目標
為了詳述資料歸檔來龍去脈,我們需要了解幾個簡單的概念,首先,需要瞭解備份和歸檔的區別:
- 備份(backup):儲存在非易失性儲存介質上的資料集合,在原始資料丟失、損壞或不可用時,可以從備份系統訪問或從備份資料中恢復,也稱為副本。備份同時保護了所有生產系統的活躍的和非活躍的資料。我們通常說的備份,類似“複製“操作。
- 歸檔(archive):將不再活躍但必須保留的資料移動到另一個儲存系統,以便釋放節點主儲存,提高系統性能。
歸檔的資料是生產資料的子集,一般,將歸檔資料轉存到專用系統,歸檔類似”剪下“操作。在兩層系統語境下,歸檔意味著將合約的狀態資料以及資料錨定的鏈下系統資料作為一個整體進行歸檔。
對資料歸檔,我們要達到如下目標:
1)獨立的資料歸檔支援合約,用於索引鏈上的資料,包括3方面內容:資料指紋、更新時間、關聯方;
2)一個歸檔模組以及獨立歸檔服務:使用統一的架構,將資料遷移到一致的位置;
3)歸檔後的資料需要進行統一管理和一致的訪問;減少運維歸檔資料所需的成本,同時需要保護歸檔資料的安全性;
4)歸檔後的資料具有索引和搜尋功能,能更有效、快捷地對歸檔的資料訪問並利用;
5)相關歸檔的恢復:可以將某次歸檔恢復到生產環境。
一般的資料歸檔的過程:select-insert-delete,建立一個新的資料庫-歸檔庫,然後在歸檔庫建立與生產庫相同的表;不斷查詢生產庫資料記錄,同步複製到歸檔庫;生產庫刪除已經複製的資料記錄。雖然資料歸檔過程非常簡單,但是設計資料歸檔的方案,我們必須想清楚以下幾個問題?
- 歸檔前:那些資料可以歸檔?資料適合歸檔嗎?歸檔庫如何選型?
- 歸檔執行階段:資料歸檔過程需要不斷的讀寫生產庫,這個過程將會大量使用的網路、IO,那為了防止對線上業務造成壓力,資料歸檔一般只在業務低峰期執行。
- 歸檔後:資料冪等被破壞,資料歸檔導致生成資料缺失,會對業務造成影響。針對歸檔的過程和目標。
綜上,我們將提出設計和實現契合自身架構特點的歸檔方案。
歸檔方案實踐
趣鏈科技自研的區塊鏈隱私計算平臺BitXMesh,將區塊鏈與隱私計算技術深度融合,支援鏈上鍊下協同的資料共享和隱私計算。
BitXMesh是一個兩層架構系統。包括區塊鏈合約層,鏈上部署有資料共享合約、聯邦計算協調合約等,鏈下拓展層由BitXMesh節點組成並提供資料共享、聯邦計算等能力。從資料的維度看,整個系統由合約資料及合約資料錨定、節點內的資料以及支撐節點能力、逐漸累積的業務功能資料組成。歸檔資料的時候需要考慮:鏈上資料和節點本地資料,資料之間的錨定關係,以及本地資料的關聯關係。同時,資料型別也是需要考慮的,節點內有檔案、K/V型別的資料,這些資料歸檔需要存放在不同的歸檔庫中。
BitXMesh資料歸檔元件包含:內部的歸檔模組(Archiver module)、鏈上資料歸檔支援合約、儲存對接元件(對接BitXMesh K/V儲存,鏈互動模組)、歸檔庫(儲存歸檔資料)。其中,鏈上資料歸檔支援合約是為了兩層系統協同歸檔而構建的合約,合約主要功能是進行鏈上資料的索引以及按時間進行引用計算,便於定位鏈上資料。整個歸檔模組元件及其構成,如下圖。
針對K/V型別的資料,選擇BadgerDB作為歸檔庫,存放BitXMesh歸檔的K/V資料;對檔案資料,使用IPFS作為歸檔儲存,同時檔案的元資訊儲存在Badger DB歸檔庫;整個歸檔資料項的標識ID都會記錄在歸檔摘要檔案中,歸檔摘要檔案記錄了整個歸檔的元資訊,該檔案也可以提供給基於BitXMesh開發的業務系統使用,將業務系統的資料也進行歸檔。整個歸檔過程如下:
1)首先,歸檔庫初始化。指定歸檔庫儲存路徑,會在該目錄下建立K/VBadger DB庫以及儲存大檔案的ipfs,這兩個庫的建立尤其關鍵,歸檔的資料儲存於兩個庫中,後續可開發應用對歸檔的資料進行管理。
2)其次,執行歸檔。目前,按“時間區間”進行歸檔,分為兩個階段:鏈上資料及與鏈上錨定的節點資料的歸檔、鏈下節點資料歸檔。
- 鏈上資料及與鏈上錨定的節點資料的歸檔:該步驟需要歸檔支援合約的支援,歸檔支援合約主要儲存鏈上資料的標識資訊(資料ID)以及資料儲存時間。當歸檔時,先查詢該合約得到需要歸檔的資料列表,根據這個資料列表,去歸檔節點與其錨定的資料。整個過程包括查詢-寫入-刪除,查詢鏈上資料和鏈下資料,將查詢得到的資料資訊寫入到歸檔庫,一旦寫入成功,將摘要寫入到歸檔摘要檔案,最後刪除資料。
- 鏈下節點資料歸檔:該步驟歸檔節點的業務資料,落到時間區間的資料即可執行查詢-寫入-刪除操作。一旦碰到檔案資料,需要查詢元資訊,寫入K/V歸檔庫,再取檔案block寫入到ipfs歸檔系統。
3)最後,資源回收和落盤操作。上面兩步已經將符合時間範圍的資料進行歸檔,之後需要將歸檔模組訪問節點資料的連線斷開,歸檔庫也需要關閉資料訪問連線。歸檔摘要檔案落到磁碟。
在進行了一次歸檔操作後,歸檔庫中的資料可以透過歸檔服務進行訪問,類似業務系統的做法,將歸檔庫作為backend資料儲存,透過HTTP介面訪問這些歸檔的資料。
總結
資料歸檔是針對大量資料累積的系統,對資料進行有計劃的遷移,當資料停止改變或不被頻繁使用時,透過資料歸檔把它們轉存到別的地方,讓出儲存空間,提升系統的效能。本文以BitXMesh資料歸檔模組為例,對鏈上-鏈下兩層架構系統的資料歸檔進行實踐,將歸檔融入到系統功能,完成了歸檔使用統一的架構,將資料遷移到一致的位置,歸檔後的資料需要進行,統一管理和一致的訪問目標。