劉丹 任浩然
摘 要:隨著大數據云計算技術逐步成為數字經濟的基礎設施,規模化、業務化、智能化的海量數據的存儲在面對快速變化的業務需求和多元化的查詢需求時,越來越不能靈活地根據業務需求進行快速的迭代更新,對多元化查詢需求的快速響應和容錯變得越來越困難。傳統的關系型數據庫支持ACID,對成熟的業務系統有著良好的支持,一旦核心的業務出錯可以立即回滾;互聯網的業務追求擁抱變化,追求快速響應和迭代以及結果的最終一致和容錯性。在此背景下,文章提出一種新的多元且靈活的數據庫大數據量的存儲結構,其支持國內外絕大多數主流的數據計算引擎,在索引和多元化查詢方面的表現也更加優異,可以更好地容錯和快速迭代更新。
關鍵詞:關系型數據庫;多元查詢;存儲結構
0? ? 引言
關系型數據庫憑借其優秀的行列二維表的關系數據模型,在互聯網和工業領域被廣泛地使用,主流的關系型數據庫是Oracle,MySQL等,它們在業務成熟且流程固定的場景下,存儲和應用非常標準和規范化。
通用的SQL語言可以支持很多復雜場景下的業務需求,關系代數為了維護ACID的強一致性,其必須預先定義固定二維表,缺乏靈活性和容錯性,近年來NoSQL類的數據庫應運而生,在高并發讀寫和降低硬盤I/O方面有了很大的速度優勢,容易擴展。本文在對比研究了關系型和NoSQL數據庫的數據存儲結構后,提出一種新的多元且靈活的大數據量的存儲結構,其支持大數據生態的各種主流的開源數據計算引擎,能夠快速迭代,在索引和多元化查詢方面也有著不錯的表現。
1? ? 關系型數據庫數據存儲結構
1.1? B-Tree
B-Tree是一種多路搜索樹的數據結構,它由樹的簡單結構演變而來,將左右子樹分為多叉的樹形結構,數據在每個節點都存在但不存儲數據的副本,搜索性能和二叉查找樹的級別相當,但整個樹的高度比二叉的平衡查找樹低,從而避免了磁盤的多次讀取,適用于存儲和搜索數據。關系型數據庫通常使用B-Tree的結構作為非聚簇索引的底層數據結構,先查到聚簇索引的主鍵值,然后通過聚簇索引的主鍵值查找到真正行的詳細數據。
1.2? B+Tree
B+Tree[1]也是一種多路搜索樹,它是由B-Tree的數據結構演變而來,把所有的數據放到了葉子節點,葉子節點之間加入了一個個指針指向下一個葉子的地址,在做范圍數據查找時具有優勢。關系型數據庫通常使用B+Tree的結構作為聚簇索引的底層數據結構,盡量將主鍵存儲在B+Tree的非葉子節點中,如果其中的某個查詢在業務場景中使用得很頻繁,可以考慮遵循最左的子樹的索引覆蓋的原則將多個字段作為聯合索引優化查詢的性能。
2? ? NoSQL數據庫數據存儲結構
2.1? KeyValue存儲
數據的存取都直接通過定義好的Key。在不需要實物支持和固定模式的情況下,注重對大數據讀寫性能的提升,目前主要的KV數據庫有Memcached,Redis等。Memcached支持多種語言并保證分布的均勻性,Redis是將所有的KV都存于內存,速度很快,值的類型也比其他數據庫的類型豐富。此類KV數據庫適用于消息隊列、實時系統和高頻讀低頻寫的場景。
2.2? 列存儲
查詢密集型的OLAP[2]場景下,對表的數據一般是取某幾列的數據,對數據表的讀取按行讀非常消耗性能,因為并不需要行中的所有數據,一般是按列去存儲數據。列存儲可以對相同數據類型的數據進行壓縮但在增加、刪除、修改數據頻繁的OLTP場景下不太適用。傳統RDBMS應對復雜關系運算、關系挖掘能力有限,列存儲讓服務器具備橫向擴展的能力,在批處理下可以顯著地減少CPU的使用率。
2.3? JSON存儲
JSON直觀簡單不依賴于位置,目前主流的JSON類數據庫是MongoDB和SequoiaDB。前者面向集合的設計理念能夠做到靈活的模式;后者使用交互式的JSON格式定義。JSON類型的存儲帶來的靈活性得益于其直觀簡單的數據格式。
3? ? 多元靈活的存儲結構
結構化的數據最為常見,格式固定,支持高吞吐寫入以及大規模存儲,想要多元靈活的大數據結構化的存儲,采用集中式的存儲模式,作為業務數據庫的大寬表,離線批量計算的流入和流出需要支持到PB級別。固定的組合查詢許多的維度表會經常發生變化,大寬表機制不能完全解決問題,因此使用MPP的方式對單個查詢進行同步,限制數據量,以避免非常昂貴的、沒有意義的計算。查詢進入MPP時,采用MurmurHash算法,算出一個值作為指紋值。Meta信息中,存儲該指紋值和行數。通過定期執行任務,去同步該查詢數據,同入MPP一樣,遍歷每行每列,算出新的指紋值。如果指紋值不變,則結束;反之,將該查詢重新入庫,記住新的指紋值,在新數據入MPP庫的時候不重復計算,以得到最好的性能,從而支持多元靈活的大數據結構化的存儲。無法結構化的數據,例如圖片、文件、視頻一般使用HDFS[2]存儲,沿用成熟的HDFS方式采用面向資源的分布式系統架構設計,所有組件都可擴展,避免因單點失效的故障問題。將非結構化數據以文件的方式存儲在文件系統中,同時將指向文件路徑存儲在數據庫表中,這種方式數據讀寫的速度較快。
4? ? 結語
本文研究了多種業內主流的傳統關系型數據庫和NoSQL的存儲結構,在面對快速變化的業務需求和多元化的查詢需求時,提出一種多元且靈活的數據庫大數據量的存儲結構,在索引和多元化查詢方面的表現更加優異,可以更好地容錯和快速迭代更新。但還存在一些不足,該存儲結構數據派生能力弱不能做到數據寫入主存儲后會由主存儲再向輔存儲進行同步、運維復雜核心依賴是Zookeeper和HDFS,需要經驗豐富的專業團隊運維管理和熱點處理能力差無法保證數據訪問的熱度均勻,這些是以后工作的方向和重點。
[參考文獻]
[1]WANG C,BRIHADISWARAN G,JIANG X,et al.Circ-Tree: A B+-Tree variant with circular design for persistent memory[J].IEEE Transactions on Computers,2021(99):1.
[2]SOUNTHARRAJAN S,RAJAN C,SANKARANANTH S,et al.HDFS-based parallel and scalable pattern mining using clouds for incremental data[J].International Journal of Computer Aided Engineering and Technology,2020(1/2):28.
(編輯 王雪芬)