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