趙衛(wèi)
摘要:近年來(lái),隨著Web2.0的興起,數(shù)據(jù)呈爆發(fā)式的增長(zhǎng)NoSQL數(shù)據(jù)庫(kù)憑借其易擴(kuò)展、高性能、高可用、數(shù)據(jù)模型靈活等特點(diǎn)得到了業(yè)界的認(rèn)可和快速的發(fā)展。該文分析了NoSQL技術(shù)的獨(dú)特之處及其顯著優(yōu)勢(shì),研究各類(lèi)NoSQL技術(shù)并進(jìn)行了比較,最后對(duì)研究前景進(jìn)行展望。
關(guān)鍵詞:大數(shù)據(jù);NoSQL;數(shù)據(jù)模型
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)19-0011-03
傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)有著穩(wěn)定的性能和強(qiáng)大的功能,久經(jīng)考驗(yàn)且使用簡(jiǎn)單,同時(shí)關(guān)系型數(shù)據(jù)庫(kù)也積累了大量的成功案例。在互聯(lián)網(wǎng)的發(fā)展時(shí)期,是曾經(jīng)的領(lǐng)導(dǎo)者,它為互聯(lián)網(wǎng)的發(fā)展做出了卓越的貢獻(xiàn)。然而近幾年,隨著動(dòng)態(tài)交互網(wǎng)站W(wǎng)eb2.0的迅速興起,訪(fǎng)問(wèn)量不斷上升,傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)對(duì)此顯得力不從心,尤其是在大數(shù)據(jù)量高并發(fā)的情況下,暴露了很多難以克服的問(wèn)題。而非關(guān)系型的數(shù)據(jù)庫(kù)NoSQL有著非常高的讀寫(xiě)性能,能夠解決海量數(shù)據(jù)集合下,對(duì)多重?cái)?shù)據(jù)種類(lèi)進(jìn)行快速存儲(chǔ)和讀取的難題。
1 大數(shù)據(jù)對(duì)數(shù)據(jù)庫(kù)存儲(chǔ)技術(shù)的要求
大數(shù)據(jù)時(shí)代,隨著云服務(wù)等應(yīng)用的快速普及,對(duì)數(shù)據(jù)中心提出了革命性的需求,數(shù)據(jù)的存儲(chǔ)架構(gòu)已經(jīng)成為網(wǎng)絡(luò)服務(wù)的核心要素。另外,互聯(lián)網(wǎng)“+”等一系列應(yīng)用的推進(jìn)和發(fā)展,使各種各樣的數(shù)據(jù)成為炙手可熱的資產(chǎn)、資源。存儲(chǔ)系統(tǒng)作為數(shù)據(jù)的載體,將成為大數(shù)據(jù)基礎(chǔ)架構(gòu)中最為關(guān)鍵的核心組成之一。
基于互聯(lián)網(wǎng)大數(shù)據(jù)的應(yīng)用需求,提出了“應(yīng)用定義存儲(chǔ)”這一概念。作為核心數(shù)據(jù)基礎(chǔ)的存儲(chǔ)系統(tǒng),不再僅僅是分散的、單一的底層設(shè)備。它除了要具備高可靠性和安全性等優(yōu)異的性能之外,還要求具備并行分布、虛擬化、良好的擴(kuò)展性以及異構(gòu)資源整合等多方面的特點(diǎn),這樣才能滿(mǎn)足具備大數(shù)據(jù)特征的業(yè)務(wù)應(yīng)用需求。海量數(shù)據(jù)需要對(duì)對(duì)數(shù)據(jù)進(jìn)行高速的讀取和存儲(chǔ),同時(shí)爆發(fā)增長(zhǎng)的數(shù)據(jù)對(duì)存儲(chǔ)設(shè)備的容量提出更高的要求,我們需要充分考慮存儲(chǔ)系統(tǒng)的數(shù)據(jù)的功能集成度、安全性、穩(wěn)定性以及系統(tǒng)的易擴(kuò)展性等各方面的因素。
2 NoSQL數(shù)據(jù)庫(kù)
2.1 NoSQL數(shù)據(jù)庫(kù)的特點(diǎn)
1)易擴(kuò)展性
NoSQL數(shù)據(jù)庫(kù)雖然種類(lèi)繁多,但是它們共同的特點(diǎn)就是數(shù)據(jù)之間無(wú)關(guān)。這就使得數(shù)據(jù)庫(kù)擴(kuò)展性獲得突破性進(jìn)展,完全區(qū)別與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)。同時(shí)在架構(gòu)的層面上,硬件設(shè)備可擴(kuò)展的能力也得到極大的增強(qiáng)。
2)大數(shù)據(jù)量,高性能
NoSQL數(shù)據(jù)庫(kù)都具有非常高的并發(fā)讀寫(xiě)性能,這一點(diǎn)在海量數(shù)據(jù)的處理上表現(xiàn)的尤其明顯。這一特點(diǎn)得益于NoSQL數(shù)據(jù)庫(kù)的無(wú)關(guān)系性,它的結(jié)構(gòu)簡(jiǎn)單。我們知道,關(guān)系型數(shù)據(jù)庫(kù)使用 Query Cache,每更新一次表Cache就會(huì)失效,在web2.0時(shí)代,短時(shí)間內(nèi)會(huì)有大量數(shù)據(jù)交互頻繁的應(yīng)用,這樣一來(lái),Cache性能和效率就不高。而NoSQL的 Cache是記錄級(jí)的,是一種細(xì)粒度的Cache,所以相比較關(guān)系型數(shù)據(jù)庫(kù)而言性能就要高的多了。
3)靈活的數(shù)據(jù)模型
NoSQL不需要事先為存儲(chǔ)數(shù)據(jù)建立相應(yīng)的字段,用戶(hù)可以隨時(shí)存儲(chǔ)自定義的各種數(shù)據(jù)格式。在關(guān)系數(shù)據(jù)庫(kù)里,要給數(shù)據(jù)表里增加或者刪除字段是非常麻煩的,尤其是在大數(shù)據(jù)量的表里,增加和刪除某一字段簡(jiǎn)直就是一個(gè)噩夢(mèng)。
4)高可用
NoSQL在不太影響性能的情況下,就可以方便地實(shí)現(xiàn)高可用的架構(gòu)。比如Cassandra,HBase模型,我們甚至可以通過(guò)復(fù)制模型來(lái)實(shí)現(xiàn)NoSQL的高可用。
2.2 NoSQL數(shù)據(jù)庫(kù)分類(lèi)
1)鍵值(Key-Value)存儲(chǔ)數(shù)據(jù)庫(kù)
鍵值存儲(chǔ)型數(shù)據(jù)庫(kù)會(huì)用到Hash表,在每一個(gè)Hash表中,有一個(gè)特定的鍵和一個(gè)指針會(huì)指向特定的數(shù)據(jù)。對(duì)于應(yīng)用系統(tǒng)來(lái)說(shuō)鍵值模型的優(yōu)勢(shì)是簡(jiǎn)單、容易部署。但是假如數(shù)據(jù)庫(kù)管理員只需要對(duì)其中一部分值進(jìn)行查詢(xún)或更新操作的時(shí)候,鍵值存儲(chǔ)數(shù)據(jù)庫(kù)就顯得效率低下了。舉例如:Redis, Voldemort, .
2)列存儲(chǔ)數(shù)據(jù)庫(kù)
為了應(yīng)對(duì)分布式存儲(chǔ)的海量數(shù)據(jù),通常會(huì)用到列存儲(chǔ)數(shù)據(jù)庫(kù)。雖然在數(shù)據(jù)庫(kù)中仍然存在鍵,但不同的是它們是指向多個(gè)列,而這些列則是由列家族來(lái)安排的。舉例如:Cassandra, HBase, Riak。
3)文檔型數(shù)據(jù)庫(kù)
文檔型數(shù)據(jù)數(shù)據(jù)庫(kù)最大的特點(diǎn)在于數(shù)據(jù)模型是文檔,它們以特定的格式存儲(chǔ)在數(shù)據(jù)庫(kù)中,比如JSON。與鍵值數(shù)據(jù)庫(kù)相比較而言,文檔型數(shù)據(jù)庫(kù)的查詢(xún)效率更高一些,它被認(rèn)為是鍵值存儲(chǔ)數(shù)據(jù)庫(kù)的升級(jí)版,允許數(shù)據(jù)庫(kù)之間嵌套鍵值。舉例如:CouchDB, MongoDB。
4)圖形(Graph)數(shù)據(jù)庫(kù)
圖形數(shù)據(jù)庫(kù)同關(guān)系型數(shù)據(jù)庫(kù)最大的不同就在于,它使用了靈活多變的圖形模型,并且能夠?qū)⒃撃P蛿U(kuò)展到多個(gè)服務(wù)器上。NoSQL數(shù)據(jù)庫(kù)沒(méi)有標(biāo)準(zhǔn)的查詢(xún)語(yǔ)言(SQL),因此進(jìn)行數(shù)據(jù)庫(kù)查詢(xún)時(shí)需要制定相應(yīng)的數(shù)據(jù)模型,這就使得數(shù)據(jù)庫(kù)的可擴(kuò)展性受到一定的限制。圖1給出了目前正在使用的主要NoSQL數(shù)據(jù)庫(kù)類(lèi)型及其各自的占比。
3 與傳統(tǒng)數(shù)據(jù)庫(kù)的比較
3.1 NoSQL與關(guān)系型數(shù)據(jù)庫(kù)的比較
與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)相比,它們之間最主要的差異就是數(shù)據(jù)存儲(chǔ)的方式不同。SQL存儲(chǔ)一些格式化的數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)是表格式的,數(shù)據(jù)表之間可以彼此關(guān)聯(lián)相互協(xié)作存儲(chǔ)。這樣的結(jié)構(gòu)使得對(duì)數(shù)據(jù)的提取操作相對(duì)方便很多,這也是關(guān)系型數(shù)據(jù)庫(kù)無(wú)法突破的一個(gè)性能瓶頸。
NoSQL數(shù)據(jù)庫(kù)是大塊組合在一起的非結(jié)構(gòu)化數(shù)據(jù),因此不適合存儲(chǔ)在固定的數(shù)據(jù)表中,數(shù)據(jù)大多是以鍵值對(duì)存儲(chǔ),由于它不局限于固定的結(jié)構(gòu),因此可以減少一些時(shí)間和空間的開(kāi)銷(xiāo),從而符合大數(shù)據(jù)環(huán)境下對(duì)海量數(shù)據(jù)的快速提取和存儲(chǔ)的要求。表1比較了SQL和典型的NoSQL數(shù)據(jù)庫(kù)MongoDB之間的差異。
隨著數(shù)據(jù)的海量增長(zhǎng),數(shù)據(jù)庫(kù)需要隨著擴(kuò)展。SQL數(shù)據(jù)庫(kù)是縱向擴(kuò)展的,要提高數(shù)據(jù)庫(kù)的處理能力,就需要使用速度更快的硬件,因而最終會(huì)達(dá)到擴(kuò)展的上限。NoSQL數(shù)據(jù)庫(kù)采用橫向擴(kuò)展,分布式存儲(chǔ)數(shù)據(jù),因此可以通過(guò)增加更多的節(jié)點(diǎn)來(lái)分擔(dān)負(fù)載,這使得數(shù)據(jù)庫(kù)的擴(kuò)展成本降低,并且能夠快速有效的實(shí)現(xiàn)擴(kuò)展。
SQL數(shù)據(jù)庫(kù)提供可靠地存儲(chǔ)和處理數(shù)據(jù),但是對(duì)海量數(shù)據(jù)的高并發(fā)提取和寫(xiě)入能力顯然不夠,而NoSQL最大的優(yōu)勢(shì)是在應(yīng)對(duì)大數(shù)據(jù)方面,它用無(wú)模式方式做數(shù)據(jù)管理,所以其橫向擴(kuò)展?jié)摿κ遣皇芟薜摹?/p>
3.2 NoSQL技術(shù)特點(diǎn)
1)索引支持
關(guān)系型數(shù)據(jù)庫(kù)在設(shè)計(jì)最初主要考慮的是如何使得用戶(hù)的工作更加簡(jiǎn)單,設(shè)計(jì)者們沒(méi)有預(yù)料到今天的互聯(lián)網(wǎng)應(yīng)用竟然會(huì)對(duì)可擴(kuò)展性提出如此高的要求。不可否認(rèn),SQL語(yǔ)言的產(chǎn)生促進(jìn)了數(shù)據(jù)庫(kù)接口標(biāo)準(zhǔn)化的形成,從而產(chǎn)生了Oracle這樣的數(shù)據(jù)庫(kù)公司的,它的發(fā)展也同時(shí)帶動(dòng)了互聯(lián)網(wǎng)相關(guān)產(chǎn)業(yè)鏈的發(fā)展。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)由于其在單機(jī)存儲(chǔ)引擎上支持索引,因而大大降低了系統(tǒng)的可擴(kuò)展性。而NoSQL系統(tǒng)由于是在系統(tǒng)層面提供對(duì)索引的支持,這就使得單機(jī)存儲(chǔ)引擎更為簡(jiǎn)單和純粹,從而擊碎系統(tǒng)可擴(kuò)展的瓶頸。
2)并發(fā)事物處理
關(guān)系型數(shù)據(jù)庫(kù)有一套規(guī)范的關(guān)于事務(wù)并發(fā)處理的理論,比如說(shuō)鎖的粒度,事務(wù)的隔離級(jí)別,回滾,死鎖等等。我們發(fā)現(xiàn),互聯(lián)網(wǎng)中的大多數(shù)應(yīng)用,都是讀取多而寫(xiě)入少,并且大部分事務(wù)需求都是簡(jiǎn)單的。因此,一般采用copy-on-write技術(shù),即:?jiǎn)尉€(xiàn)程寫(xiě),多線(xiàn)程讀,并且寫(xiě)入和讀取相互不被影響。這樣的假設(shè)提高了NoSQL系統(tǒng)的性能,并使得系統(tǒng)的設(shè)計(jì)更為簡(jiǎn)單。
3)數(shù)據(jù)結(jié)構(gòu)
關(guān)系型數(shù)據(jù)庫(kù)的存儲(chǔ)引擎是一顆動(dòng)態(tài)的磁盤(pán)B+樹(shù),為了提高性能,可能需要有insert buffer聚合寫(xiě),query cache緩存讀,因而常常需要緩存管理機(jī)制,數(shù)據(jù)庫(kù)里數(shù)據(jù)的讀取和寫(xiě)入是互相影響的,因而系統(tǒng)的性能不高。然而,在NoSQL系統(tǒng)中,數(shù)據(jù)首先被寫(xiě)入到內(nèi)存,當(dāng)數(shù)據(jù)量達(dá)到一定的程度時(shí)才會(huì)dump到磁盤(pán)而生成SSTable文件。相對(duì)于關(guān)系型數(shù)據(jù)庫(kù)的動(dòng)態(tài)的B+樹(shù), SSTable就是一個(gè)排列有序的有序數(shù)組。顯而易見(jiàn),實(shí)現(xiàn)一個(gè)有序數(shù)組要比實(shí)現(xiàn)一個(gè)動(dòng)態(tài)B+樹(shù)簡(jiǎn)單且高效的多。
4)Join操作
關(guān)系型數(shù)據(jù)庫(kù)需要在存儲(chǔ)引擎層面支持Join,而NoSQL系統(tǒng)一般會(huì)根據(jù)具體的應(yīng)用實(shí)例來(lái)決定Join實(shí)現(xiàn)的方式。NoSQL基本上不進(jìn)行復(fù)雜處理,它只應(yīng)用在特定領(lǐng)域,這一點(diǎn)恰好彌補(bǔ)了關(guān)系型數(shù)據(jù)庫(kù)的不足。
4 結(jié)束語(yǔ)
在大數(shù)據(jù)信息時(shí)代,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)已經(jīng)不能適應(yīng)大規(guī)模數(shù)據(jù)高并發(fā)的操作,無(wú)法滿(mǎn)足用戶(hù)日益增長(zhǎng)的需求。而NoSQL數(shù)據(jù)庫(kù)的出現(xiàn),極大的彌補(bǔ)了關(guān)系型數(shù)據(jù)庫(kù)的不足,它靈活的數(shù)據(jù)模型,易于擴(kuò)展以及高可用的特性,能夠最大程度的節(jié)省開(kāi)發(fā)和維護(hù)成本,這使得NoSQL數(shù)據(jù)庫(kù)正在成為數(shù)據(jù)庫(kù)領(lǐng)域的重要力量。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)有著標(biāo)準(zhǔn)規(guī)范的語(yǔ)言以及對(duì)復(fù)雜事務(wù)的出色處理等優(yōu)點(diǎn),如果能將兩者緊密結(jié)合起來(lái),那么將會(huì)給web2.0的數(shù)據(jù)庫(kù)發(fā)展帶來(lái)一個(gè)新的思路,讓數(shù)據(jù)庫(kù)的發(fā)展朝著更加穩(wěn)定、安全、高效的方向前進(jìn),這也是我們接下來(lái)主要的研究方向。
參考文獻(xiàn):
[1] COULTER T. Costing: non traditional data stores versus traditional DBMS technologies[C] //Technology Management in the Energy Smart World(PICMET).2011 IEEE Proceedingt.
[2] 郭鵬.Cassandra 實(shí)戰(zhàn)[M].北京:機(jī)械工業(yè)出版社,2011.
[3] 馬帥,李建欣,胡春明.大數(shù)據(jù)科學(xué)與工程的挑戰(zhàn)與思考[J].中國(guó)計(jì)算機(jī)學(xué)會(huì)通訊,2012,8(9).
[4] 程學(xué)旗,靳小龍,王元卓,等.大數(shù)據(jù)系統(tǒng)和分析技術(shù)綜述[J].軟件學(xué)報(bào),2014,25(9).