摘 要:隨著web2.0技術(shù)的興起,NoSQL數(shù)據(jù)庫得到了廣泛的發(fā)展和應(yīng)用。本文從初學(xué)者的角度出發(fā),針對(duì)傳統(tǒng)數(shù)據(jù)庫的瓶頸,從讀寫速度、擴(kuò)展性、運(yùn)營成本、數(shù)據(jù)容量等方面對(duì)NoSQL數(shù)據(jù)庫進(jìn)行了分析,并對(duì)常見的幾種NoSQL數(shù)據(jù)庫進(jìn)行了研究。
關(guān)鍵詞:NoSQL;web2.0;Cassandra;MongoDB
中圖分類號(hào):TP311.13
1 NoSQL的起源和發(fā)展
當(dāng)今的互聯(lián)網(wǎng)時(shí)代是一個(gè)數(shù)據(jù)大爆炸的時(shí)代,電子商務(wù)、掃描文件、微博、音視頻產(chǎn)生的數(shù)據(jù)文件每天都在快速增多。淘寶網(wǎng)每天被瀏覽的店鋪和商品記錄超過30億條,每天的成交記錄和客戶評(píng)價(jià)有上千萬條。優(yōu)酷網(wǎng)每天收到的運(yùn)營數(shù)據(jù)總量已達(dá)T級(jí),目前的歷史運(yùn)營數(shù)據(jù)已達(dá)數(shù)百TB。據(jù)研究公司IDC預(yù)測(cè),2020年全球的電子數(shù)據(jù)總量將達(dá)到35ZB,比當(dāng)前的電子數(shù)據(jù)增加44倍。電子數(shù)據(jù)格式的多元化發(fā)展和規(guī)模的飛速增長(zhǎng),使傳統(tǒng)數(shù)據(jù)庫的技術(shù)面臨著新的挑戰(zhàn),主要體現(xiàn)在以下幾個(gè)方面:
1.1 讀寫慢。web2.0網(wǎng)站要實(shí)時(shí)處理用戶的動(dòng)態(tài)信息,在數(shù)據(jù)量達(dá)到一定規(guī)模時(shí),關(guān)系型數(shù)據(jù)庫由于并發(fā)的負(fù)載過高而容易發(fā)生死鎖問題,此時(shí)系統(tǒng)的讀寫速度將會(huì)嚴(yán)重下滑。
1.2 數(shù)據(jù)庫的擴(kuò)展性不足。web2.0結(jié)構(gòu)的數(shù)據(jù)庫不方便直接擴(kuò)展,對(duì)傳統(tǒng)數(shù)據(jù)庫的硬件升級(jí),必須要做停機(jī)維護(hù),這對(duì)web2.0網(wǎng)站來講是不允許的。
1.3 建設(shè)和運(yùn)營成本高。傳統(tǒng)的企業(yè)級(jí)數(shù)據(jù)庫價(jià)格驚人,在實(shí)際的項(xiàng)目中其價(jià)格隨著系統(tǒng)規(guī)模的擴(kuò)大而不斷上升,所以在服務(wù)器集群中,高昂的建設(shè)和運(yùn)營成本成為其發(fā)展的瓶頸。
1.4 有限的支撐容量。很多web2.0網(wǎng)站每天的信息量達(dá)上千萬條,查詢大的數(shù)據(jù)表格可以通過分表、分庫等方法解決,但是由此也加重了數(shù)據(jù)備份和擴(kuò)容的復(fù)雜性。
NoSQL是在新形勢(shì)下出現(xiàn)的一種非關(guān)系型數(shù)據(jù)庫的總稱,它用全新的存儲(chǔ)方式,簡(jiǎn)化了數(shù)據(jù)交互,減少編寫、調(diào)試的代碼量,對(duì)海量數(shù)據(jù)實(shí)現(xiàn)高效存儲(chǔ)和高效訪問,同時(shí)它的開源免費(fèi)也降低了企業(yè)的運(yùn)營成本,Google、Facebook、Twitter和Amazon等知名公司都開發(fā)和使用NoSQL系統(tǒng)來解決海量數(shù)據(jù)存儲(chǔ)問題。
2 NoSQL數(shù)據(jù)庫的優(yōu)勢(shì)
現(xiàn)在主流的NoSQL數(shù)據(jù)庫有Cassandra、BigTable、Dynamo、SimpleDB、CouchDB、MongoDB和Redis等。Google公司使用的就是BigTable數(shù)據(jù)庫,Amazon公司使用的是Dynamo數(shù)據(jù)庫。NoSQL數(shù)據(jù)庫對(duì)比傳統(tǒng)關(guān)系數(shù)據(jù)庫,其優(yōu)勢(shì)主要體現(xiàn)在以下幾個(gè)方面:
2.1 數(shù)據(jù)庫的開發(fā)效率高。在設(shè)計(jì)上NoSQL數(shù)據(jù)庫和傳統(tǒng)的數(shù)據(jù)庫有很大的不同。傳統(tǒng)應(yīng)用程序的開發(fā)中,需要在內(nèi)存數(shù)據(jù)結(jié)構(gòu)和關(guān)系數(shù)據(jù)庫的映射上花費(fèi)大量的精力和時(shí)間。NoSQL數(shù)據(jù)庫更符合應(yīng)用程序的需求,部分NoSQL數(shù)據(jù)庫可以在硬盤上直接操作,簡(jiǎn)化了數(shù)據(jù)的交互,減少了編寫、調(diào)試程序的工作量。
2.2 數(shù)據(jù)庫的擴(kuò)展能力強(qiáng)?,F(xiàn)在企業(yè)通常使用更小、更便宜的計(jì)算機(jī)組成集群來構(gòu)建數(shù)據(jù)庫,NoSQL數(shù)據(jù)庫的設(shè)計(jì)正是針對(duì)服務(wù)器集群,所以更適合大規(guī)模數(shù)據(jù)的處理。
2.3 數(shù)據(jù)庫的開發(fā)成本低廉。因?yàn)镹oSQL數(shù)據(jù)庫主要都是開源軟件,所以沒有昂貴的開發(fā)成本。在項(xiàng)目開發(fā)中很多企業(yè)為了節(jié)省成本而選擇NoSQL數(shù)據(jù)庫。
2.4 數(shù)據(jù)模型靈活。在關(guān)系數(shù)據(jù)庫里,數(shù)據(jù)有固定的結(jié)構(gòu),通過各種操作互相關(guān)聯(lián),對(duì)大型的表格增刪字段非常麻煩。NoSQL的存儲(chǔ)只有一對(duì)鍵值或數(shù)組,無需事先建立字段,任何時(shí)候都可以存儲(chǔ)自定義的數(shù)據(jù)格式。
3 NoSQL數(shù)據(jù)庫的主要產(chǎn)品
3.1 Cassandra。Cassandra是由Facebook公司開發(fā)的開源式數(shù)據(jù)庫,具有模式靈活、擴(kuò)展性強(qiáng)、多數(shù)據(jù)中心識(shí)別、支持分布式讀寫等特點(diǎn)。Cassandra被Digg、Twitter等多家互聯(lián)網(wǎng)知名公司使用,是目前非常流行的一種NoSQL數(shù)據(jù)庫系統(tǒng)。用Cassandra存儲(chǔ)數(shù)據(jù),不必提前確定字段,在系統(tǒng)運(yùn)行時(shí)可以隨意增加和刪除字段。用Cassandra擴(kuò)展系統(tǒng)容量,可以為服務(wù)器集群直接指向新的成員,不需要重新啟動(dòng),或者遷移數(shù)據(jù)。用Cassandra布置多數(shù)據(jù)中心識(shí)別,每條記錄都會(huì)在備用的數(shù)據(jù)中心復(fù)制備份。用Cassandra的分布式讀寫功能,可以隨時(shí)隨地集中讀寫數(shù)據(jù),不會(huì)有單點(diǎn)失敗。
3.2 MongoDB。MongoDB是一種面向文檔存儲(chǔ)的優(yōu)秀數(shù)據(jù)庫系統(tǒng),用c++語言編寫。MongoDB的查詢語法功能強(qiáng)大。使用類似JSON的BSON作為數(shù)據(jù)存儲(chǔ)和傳輸?shù)母袷?。BSON支持嵌套對(duì)象和數(shù)組。對(duì)復(fù)雜查詢要求不高的情況下,MongoDB可以作為MySQL的替代品。它具有分布式的特點(diǎn),支持海量數(shù)據(jù)的存儲(chǔ),并且對(duì)海量數(shù)據(jù)具有良好的讀寫性能。據(jù)測(cè)試,當(dāng)數(shù)據(jù)量達(dá)到50GB以上的時(shí)候,在訪問速度方面MongoDB是MySQL的10倍以上,在并發(fā)讀寫方面,每秒可以處理讀寫請(qǐng)求0.5萬-1.5萬次。MongoDB無法管理內(nèi)存,它把內(nèi)存大小交給操作系統(tǒng)來管理,在系統(tǒng)運(yùn)行時(shí)必須在操作系統(tǒng)中監(jiān)控內(nèi)存的使用情況。
3.3 Redis。Redis是用c語言編寫的面向key-value存儲(chǔ)的數(shù)據(jù)庫系統(tǒng),具有持久存儲(chǔ)、高性能、高并發(fā)性等優(yōu)勢(shì)。Redis系統(tǒng)在內(nèi)存中進(jìn)行操作,通過異步操作定期把數(shù)據(jù)庫輸出到硬盤上保存,它能提供每秒超過10萬次的讀寫頻率,是目前性能最快的Key-Value數(shù)據(jù)庫。Redis支持多種數(shù)據(jù)類型的操作,包括Strings,Lists,Hashes,Sets及Ordered Sets。單個(gè)value值的最大限制是1GB,Redis能實(shí)現(xiàn)多種功能,比如要實(shí)現(xiàn)一個(gè)輕量級(jí)的高性能消息隊(duì)列服務(wù),可以用List來做FIFO雙向鏈表,它還能完成排序等高級(jí)功能。Redis數(shù)據(jù)庫不能用作海量數(shù)據(jù)的高性能讀寫,因?yàn)镽edis數(shù)據(jù)庫的容量受到物理內(nèi)存的限制,所以它通常局限于較小數(shù)據(jù)量的高性能操作和運(yùn)算上。
4 結(jié)束語
NoSQL雖然發(fā)展迅速,但是和Oracle、SQL等傳統(tǒng)數(shù)據(jù)庫相比,還存在一些不足。比如:NoSQL產(chǎn)品大多都是開源軟件,提供的功能有限,維護(hù)工作只能由企業(yè)自身來完成。NoSQL項(xiàng)目中數(shù)據(jù)的完整性很難實(shí)現(xiàn)。NoSQL提供的分布式設(shè)計(jì)對(duì)中小企業(yè)來講暫時(shí)還用不到。
傳統(tǒng)的數(shù)據(jù)庫和NoSQL可以在不同的項(xiàng)目中使用,形成互補(bǔ)。對(duì)于結(jié)構(gòu)穩(wěn)定,結(jié)構(gòu)化程度高的數(shù)據(jù),可以采用關(guān)系型數(shù)據(jù)庫管理;對(duì)于結(jié)構(gòu)化程度不高,可以通過水平、垂直關(guān)系關(guān)聯(lián)信息內(nèi)容的數(shù)據(jù),可以采用層次化數(shù)據(jù)模型管理;對(duì)于數(shù)據(jù)量超大的文件,數(shù)據(jù)之間的依賴關(guān)系較少,可以采用NoSQL數(shù)據(jù)庫管理。
總之,NoSQL在web2.0網(wǎng)站中的強(qiáng)勁表現(xiàn),對(duì)數(shù)據(jù)庫產(chǎn)業(yè)的發(fā)展,既是機(jī)遇,也是挑戰(zhàn)。在互聯(lián)網(wǎng)發(fā)展的推動(dòng)下,NoSQL數(shù)據(jù)庫的前景值得期待。
參考文獻(xiàn):
[1]陸嘉恒.大數(shù)據(jù)挑戰(zhàn)與NoSQL數(shù)據(jù)庫技術(shù)/大數(shù)據(jù)叢書[M].北京:電子工業(yè)出版社,2013.
[2](?。┑偻呃?深入NoSQL[M].北京:人民郵電出版社,2012.
[3](美)塞得拉吉,福勒.NoSQL精粹[M].北京:機(jī)械工業(yè)出版社,2013.
作者簡(jiǎn)介:高源(1980-),男,湖北武漢人,講師,研究方向:計(jì)算機(jī)網(wǎng)絡(luò)工程與智能樓宇技術(shù)、數(shù)據(jù)存儲(chǔ)與數(shù)據(jù)挖掘技術(shù)。
作者單位:武漢職業(yè)技術(shù)學(xué)院 計(jì)算機(jī)學(xué)院,武漢 430074