NoSQL,指的是非關(guān)系型的數(shù)據(jù)庫。NoSQL有時(shí)也稱作Not Only SQL的縮寫,是對(duì)不同于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)庫管理系統(tǒng)的統(tǒng)稱。
尼元陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
NoSQL用于超大規(guī)模數(shù)據(jù)的存儲(chǔ)。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數(shù)據(jù))。這些類型的數(shù)據(jù)存儲(chǔ)不需要固定的模式,無需多余操作就可以橫向擴(kuò)展。
NoSQL的優(yōu)點(diǎn)/缺點(diǎn)
優(yōu)點(diǎn):
- 高可擴(kuò)展性
- 分布式計(jì)算
- 低成本
- 架構(gòu)的靈活性,半結(jié)構(gòu)化數(shù)據(jù)
- 沒有復(fù)雜的關(guān)系
缺點(diǎn):
- 沒有標(biāo)準(zhǔn)化
- 有限的查詢功能(到目前為止)
- 最終一致是不直觀的程序 (BY三人行慕課)
非常榮幸能受邀在InfoQ開辟這樣一個(gè)關(guān)于NoSQL的專欄,InfoQ是我非常尊重的一家技術(shù)媒體,同時(shí)我也希望借助InfoQ,在國內(nèi)推動(dòng)NoSQL的發(fā)展,希望跟我一樣有興趣的朋友加入進(jìn)來。這次的NoSQL專欄系列將先整體介紹NoSQL,然后介紹如何把NoSQL運(yùn)用到自己的項(xiàng)目中合適的場(chǎng)景中,還會(huì)適當(dāng)?shù)胤治鲆恍┏晒Π咐?,希望有成功使用NoSQL經(jīng)驗(yàn)的朋友給我提供一些線索和信息。 NoSQL概念隨著web2.0的快速發(fā)展,非關(guān)系型、分布式數(shù)據(jù)存儲(chǔ)得到了快速的發(fā)展,它們不保證關(guān)系數(shù)據(jù)的ACID特性。NoSQL概念在2009年被提了出來。NoSQL最常見的解釋是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一詞最早于1998年被用于一個(gè)輕量級(jí)的關(guān)系數(shù)據(jù)庫的名字。) NoSQL被我們用得最多的當(dāng)數(shù)key-value存儲(chǔ),當(dāng)然還有其他的文檔型的、列存儲(chǔ)、圖型數(shù)據(jù)庫、xml數(shù)據(jù)庫等。在NoSQL概念提出之前,這些數(shù)據(jù)庫就被用于各種系統(tǒng)當(dāng)中,但是卻很少用于web互聯(lián)網(wǎng)應(yīng)用。比如cdb、qdbm、bdb數(shù)據(jù)庫。 傳統(tǒng)關(guān)系數(shù)據(jù)庫的瓶頸 傳統(tǒng)的關(guān)系數(shù)據(jù)庫具有不錯(cuò)的性能,高穩(wěn)定型,久經(jīng)歷史考驗(yàn),而且使用簡單,功能強(qiáng)大,同時(shí)也積累了大量的成功案例。在互聯(lián)網(wǎng)領(lǐng)域,MySQL成為了絕對(duì)靠前的王者,毫不夸張的說,MySQL為互聯(lián)網(wǎng)的發(fā)展做出了卓越的貢獻(xiàn)。 在90年代,一個(gè)網(wǎng)站的訪問量一般都不大,用單個(gè)數(shù)據(jù)庫完全可以輕松應(yīng)付。在那個(gè)時(shí)候,更多的都是靜態(tài)網(wǎng)頁,動(dòng)態(tài)交互類型的網(wǎng)站不多。 到了最近10年,網(wǎng)站開始快速發(fā)展?;鸨恼搲?、博客、sns、微博逐漸引領(lǐng)web領(lǐng)域的潮流。在初期,論壇的流量其實(shí)也不大,如果你接觸網(wǎng)絡(luò)比較早,你可能還記得那個(gè)時(shí)候還有文本型存儲(chǔ)的論壇程序,可以想象一般的論壇的流量有多大。 Memcached+MySQL 后來,隨著訪問量的上升,幾乎大部分使用MySQL架構(gòu)的網(wǎng)站在數(shù)據(jù)庫上都開始出現(xiàn)了性能問題,web程序不再僅僅專注在功能上,同時(shí)也在追求性能。程序員們開始大量的使用緩存技術(shù)來緩解數(shù)據(jù)庫的壓力,優(yōu)化數(shù)據(jù)庫的結(jié)構(gòu)和索引。開始比較流行的是通過文件緩存來緩解數(shù)據(jù)庫壓力,但是當(dāng)訪問量繼續(xù)增大的時(shí)候,多臺(tái)web機(jī)器通過文件緩存不能共享,大量的小文件緩存也帶了了比較高的IO壓力。在這個(gè)時(shí)候,Memcached就自然的成為一個(gè)非常時(shí)尚的技術(shù)產(chǎn)品。 Memcached作為一個(gè)獨(dú)立的分布式的緩存服務(wù)器,為多個(gè)web服務(wù)器提供了一個(gè)共享的高性能緩存服務(wù),在Memcached服務(wù)器上,又發(fā)展了根據(jù)hash算法來進(jìn)行多臺(tái)Memcached緩存服務(wù)的擴(kuò)展,然后又出現(xiàn)了一致性hash來解決增加或減少緩存服務(wù)器導(dǎo)致重新hash帶來的大量緩存失效的弊端。當(dāng)時(shí),如果你去面試,你說你有Memcached經(jīng)驗(yàn),肯定會(huì)加分的。 Mysql主從讀寫分離 由于數(shù)據(jù)庫的寫入壓力增加,Memcached只能緩解數(shù)據(jù)庫的讀取壓力。讀寫集中在一個(gè)數(shù)據(jù)庫上讓數(shù)據(jù)庫不堪重負(fù),大部分網(wǎng)站開始使用主從復(fù)制技術(shù)來達(dá)到讀寫分離,以提高讀寫性能和讀庫的可擴(kuò)展性。Mysql的master-slave模式成為這個(gè)時(shí)候的網(wǎng)站標(biāo)配了。 分表分庫隨著web2.0的繼續(xù)高速發(fā)展,在Memcached的高速緩存,MySQL的主從復(fù)制,讀寫分離的基礎(chǔ)之上,這時(shí)MySQL主庫的寫壓力開始出現(xiàn)瓶頸,而數(shù)據(jù)量的持續(xù)猛增,由于MyISAM使用表鎖,在高并發(fā)下會(huì)出現(xiàn)嚴(yán)重的鎖問題,大量的高并發(fā)MySQL應(yīng)用開始使用InnoDB引擎代替MyISAM。同時(shí),開始流行使用分表分庫來緩解寫壓力和數(shù)據(jù)增長的擴(kuò)展問題。這個(gè)時(shí)候,分表分庫成了一個(gè)熱門技術(shù),是面試的熱門問題也是業(yè)界討論的熱門技術(shù)問題。也就在這個(gè)時(shí)候,MySQL推出了還不太穩(wěn)定的表分區(qū),這也給技術(shù)實(shí)力一般的公司帶來了希望。雖然MySQL推出了MySQL Cluster集群,但是由于在互聯(lián)網(wǎng)幾乎沒有成功案例,性能也不能滿足互聯(lián)網(wǎng)的要求,只是在高可靠性上提供了非常大的保證。 MySQL的擴(kuò)展性瓶頸 在互聯(lián)網(wǎng),大部分的MySQL都應(yīng)該是IO密集型的,事實(shí)上,如果你的MySQL是個(gè)CPU密集型的話,那么很可能你的MySQL設(shè)計(jì)得有性能問題,需要優(yōu)化了。大數(shù)據(jù)量高并發(fā)環(huán)境下的MySQL應(yīng)用開發(fā)越來越復(fù)雜,也越來越具有技術(shù)挑戰(zhàn)性。分表分庫的規(guī)則把握都是需要經(jīng)驗(yàn)的。雖然有像淘寶這樣技術(shù)實(shí)力強(qiáng)大的公司開發(fā)了透明的中間件層來屏蔽開發(fā)者的復(fù)雜性,但是避免不了整個(gè)架構(gòu)的復(fù)雜性。分庫分表的子庫到一定階段又面臨擴(kuò)展問題。還有就是需求的變更,可能又需要一種新的分庫方式。 MySQL數(shù)據(jù)庫也經(jīng)常存儲(chǔ)一些大文本字段,導(dǎo)致數(shù)據(jù)庫表非常的大,在做數(shù)據(jù)庫恢復(fù)的時(shí)候就導(dǎo)致非常的慢,不容易快速恢復(fù)數(shù)據(jù)庫。比如1000萬4KB大小的文本就接近40GB的大小,如果能把這些數(shù)據(jù)從MySQL省去,MySQL將變得非常的小。 關(guān)系數(shù)據(jù)庫很強(qiáng)大,但是它并不能很好的應(yīng)付所有的應(yīng)用場(chǎng)景。MySQL的擴(kuò)展性差(需要復(fù)雜的技術(shù)來實(shí)現(xiàn)),大數(shù)據(jù)下IO壓力大,表結(jié)構(gòu)更改困難,正是當(dāng)前使用MySQL的開發(fā)人員面臨的問題。 NOSQL的優(yōu)勢(shì)易擴(kuò)展NoSQL數(shù)據(jù)庫種類繁多,但是一個(gè)共同的特點(diǎn)都是去掉關(guān)系數(shù)據(jù)庫的關(guān)系型特性。數(shù)據(jù)之間無關(guān)系,這樣就非常容易擴(kuò)展。也無形之間,在架構(gòu)的層面上帶來了可擴(kuò)展的能力。 大數(shù)據(jù)量,高性能 NoSQL數(shù)據(jù)庫都具有非常高的讀寫性能,尤其在大數(shù)據(jù)量下,同樣表現(xiàn)優(yōu)秀。這得益于它的無關(guān)系性,數(shù)據(jù)庫的結(jié)構(gòu)簡單。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一種大粒度的Cache,在針對(duì)web2.0的交互頻繁的應(yīng)用,Cache性能不高。而NoSQL的Cache是記錄級(jí)的,是一種細(xì)粒度的Cache,所以NoSQL在這個(gè)層面上來說就要性能高很多了。 靈活的數(shù)據(jù)模型 NoSQL無需事先為要存儲(chǔ)的數(shù)據(jù)建立字段,隨時(shí)可以存儲(chǔ)自定義的數(shù)據(jù)格式。而在關(guān)系數(shù)據(jù)庫里,增刪字段是一件非常麻煩的事情。如果是非常大數(shù)據(jù)量的表,增加字段簡直就是一個(gè)噩夢(mèng)。這點(diǎn)在大數(shù)據(jù)量的web2.0時(shí)代尤其明顯。 高可用NoSQL在不太影響性能的情況,就可以方便的實(shí)現(xiàn)高可用的架構(gòu)。比如Cassandra,HBase模型,通過復(fù)制模型也能實(shí)現(xiàn)高可用。 總結(jié)NoSQL數(shù)據(jù)庫的出現(xiàn),彌補(bǔ)了關(guān)系數(shù)據(jù)(比如MySQL)在某些方面的不足,在某些方面能極大的節(jié)省開發(fā)成本和維護(hù)成本。 MySQL和NoSQL都有各自的特點(diǎn)和使用的應(yīng)用場(chǎng)景,兩者的緊密結(jié)合將會(huì)給web2.0的數(shù)據(jù)庫發(fā)展帶來新的思路。讓關(guān)系數(shù)據(jù)庫關(guān)注在關(guān)系上,NoSQL關(guān)注在存儲(chǔ)上。
什么是NoSQL
大家有沒有聽說過“NoSQL”呢?近年,這個(gè)詞極受關(guān)注??吹健癗oSQL”這個(gè)詞,大家可能會(huì)誤以為是“No!SQL”的縮寫,并深感憤怒:“SQL怎么會(huì)沒有必要了呢?”但實(shí)際上,它是“Not Only SQL”的縮寫。它的意義是:適用關(guān)系型數(shù)據(jù)庫的時(shí)候就使用關(guān)系型數(shù)據(jù)庫,不適用的時(shí)候也沒有必要非使用關(guān)系型數(shù)據(jù)庫不可,可以考慮使用更加合適的數(shù)據(jù)存儲(chǔ)。
為彌補(bǔ)關(guān)系型數(shù)據(jù)庫的不足,各種各樣的NoSQL數(shù)據(jù)庫應(yīng)運(yùn)而生。
為了更好地了解本書所介紹的NoSQL數(shù)據(jù)庫,對(duì)關(guān)系型數(shù)據(jù)庫的理解是必不可少的。那么,就讓我們先來看一看關(guān)系型數(shù)據(jù)庫的歷史、分類和特征吧。
關(guān)系型數(shù)據(jù)庫簡史
1969年,埃德加?6?1弗蘭克?6?1科德(Edgar Frank Codd)發(fā)表了劃時(shí)代的論文,首次提出了關(guān)系數(shù)據(jù)模型的概念。但可惜的是,刊登論文的《IBM Research Report》只是IBM公司的內(nèi)部刊物,因此論文反響平平。1970年,他再次在刊物《Communication of the ACM》上發(fā)表了題為“A Relational Model of Data for Large Shared Data banks”(大型共享數(shù)據(jù)庫的關(guān)系模型)的論文,終于引起了大家的關(guān)注。
科德所提出的關(guān)系數(shù)據(jù)模型的概念成為了現(xiàn)今關(guān)系型數(shù)據(jù)庫的基礎(chǔ)。當(dāng)時(shí)的關(guān)系型數(shù)據(jù)庫由于硬件性能低劣、處理速度過慢而遲遲沒有得到實(shí)際應(yīng)用。但之后隨著硬件性能的提升,加之使用簡單、性能優(yōu)越等優(yōu)點(diǎn),關(guān)系型數(shù)據(jù)庫得到了廣泛的應(yīng)用。
通用性及高性能
雖然本書是講解NoSQL數(shù)據(jù)庫的,但有一個(gè)重要的大前提,請(qǐng)大家一定不要誤解。這個(gè)大前提就是“關(guān)系型數(shù)據(jù)庫的性能絕對(duì)不低,它具有非常好的通用性和非常高的性能”。毫無疑問,對(duì)于絕大多數(shù)的應(yīng)用來說它都是最有效的解決方案。
突出的優(yōu)勢(shì)
關(guān)系型數(shù)據(jù)庫作為應(yīng)用廣泛的通用型數(shù)據(jù)庫,它的突出優(yōu)勢(shì)主要有以下幾點(diǎn):
保持?jǐn)?shù)據(jù)的一致性(事務(wù)處理)
由于以標(biāo)準(zhǔn)化為前提,數(shù)據(jù)更新的開銷很小(相同的字段基本上都只有一處)
可以進(jìn)行JOIN等復(fù)雜查詢
存在很多實(shí)際成果和專業(yè)技術(shù)信息(成熟的技術(shù))
這其中,能夠保持?jǐn)?shù)據(jù)的一致性是關(guān)系型數(shù)據(jù)庫的最大優(yōu)勢(shì)。在需要嚴(yán)格保證數(shù)據(jù)一致性和處理完整性的情況下,用關(guān)系型數(shù)據(jù)庫是肯定沒有錯(cuò)的。但是有些情況不需要JOIN,對(duì)上述關(guān)系型數(shù)據(jù)庫的優(yōu)點(diǎn)也沒有什么特別需要,這時(shí)似乎也就沒有必要拘泥于關(guān)系型數(shù)據(jù)庫了。
關(guān)系型數(shù)據(jù)庫的不足
不擅長的處理
就像之前提到的那樣,關(guān)系型數(shù)據(jù)庫的性能非常高。但是它畢竟是一個(gè)通用型的數(shù)據(jù)庫,并不能完全適應(yīng)所有的用途。具體來說它并不擅長以下處理:
大量數(shù)據(jù)的寫入處理
為有數(shù)據(jù)更新的表做索引或表結(jié)構(gòu)(schema)變更
字段不固定時(shí)應(yīng)用
對(duì)簡單查詢需要快速返回結(jié)果的處理
。。。。。。
NoSQL數(shù)據(jù)庫
為了彌補(bǔ)關(guān)系型數(shù)據(jù)庫的不足(特別是最近幾年),NoSQL數(shù)據(jù)庫出現(xiàn)了。關(guān)系型數(shù)據(jù)庫應(yīng)用廣泛,能進(jìn)行事務(wù)處理和JOIN等復(fù)雜處理。相對(duì)地,NoSQL數(shù)據(jù)庫只應(yīng)用在特定領(lǐng)域,基本上不進(jìn)行復(fù)雜的處理,但它恰恰彌補(bǔ)了之前所列舉的關(guān)系型數(shù)據(jù)庫的不足之處。
易于數(shù)據(jù)的分散
如前所述,關(guān)系型數(shù)據(jù)庫并不擅長大量數(shù)據(jù)的寫入處理。原本關(guān)系型數(shù)據(jù)庫就是以JOIN為前提的,就是說,各個(gè)數(shù)據(jù)之間存在關(guān)聯(lián)是關(guān)系型數(shù)據(jù)庫得名的主要原因。為了進(jìn)行JOIN處理,關(guān)系型數(shù)據(jù)庫不得不把數(shù)據(jù)存儲(chǔ)在同一個(gè)服務(wù)器內(nèi),這不利于數(shù)據(jù)的分散。相反,NoSQL數(shù)據(jù)庫原本就不支持JOIN處理,各個(gè)數(shù)據(jù)都是獨(dú)立設(shè)計(jì)的,很容易把數(shù)據(jù)分散到多個(gè)服務(wù)器上。由于數(shù)據(jù)被分散到了多個(gè)服務(wù)器上,減少了每個(gè)服務(wù)器上的數(shù)據(jù)量,即使要進(jìn)行大量數(shù)據(jù)的寫入操作,處理起來也更加容易。同理,數(shù)據(jù)的讀入操作當(dāng)然也同樣容易。
提升性能和增大規(guī)模
下面說一點(diǎn)題外話,如果想要使服務(wù)器能夠輕松地處理更大量的數(shù)據(jù),那么只有兩個(gè)選擇:一是提升性能,二是增大規(guī)模。下面我們來整理一下這兩者的不同。
首先,提升性能指的就是通過提升現(xiàn)行服務(wù)器自身的性能來提高處理能力。這是非常簡單的方法,程序方面也不需要進(jìn)行變更,但需要一些費(fèi)用。若要購買性能翻倍的服務(wù)器,需要花費(fèi)的資金往往不只是原來的2倍,可能需要多達(dá)5到10倍。這種方法雖然簡單,但是成本較高。
另一方面,增大規(guī)模指的是使用多臺(tái)廉價(jià)的服務(wù)器來提高處理能力。它需要對(duì)程序進(jìn)行變更,但由于使用廉價(jià)的服務(wù)器,可以控制成本。另外,以后只要依葫蘆畫瓢增加廉價(jià)服務(wù)器的數(shù)量就可以了。
不對(duì)大量數(shù)據(jù)進(jìn)行處理的話就沒有使用的必要嗎?
NoSQL數(shù)據(jù)庫基本上來說為了“使大量數(shù)據(jù)的寫入處理更加容易(讓增加服務(wù)器數(shù)量更容易)”而設(shè)計(jì)的。但如果不是對(duì)大量數(shù)據(jù)進(jìn)行操作的話,NoSQL數(shù)據(jù)庫的應(yīng)用就沒有意義嗎?
答案是否定的。的確,它在處理大量數(shù)據(jù)方面很有優(yōu)勢(shì)。但實(shí)際上NoSQL數(shù)據(jù)庫還有各種各樣的特點(diǎn),如果能夠恰當(dāng)?shù)乩眠@些特點(diǎn)將會(huì)是非常有幫助。具體的例子將會(huì)在第2章和第3章進(jìn)行介紹,這些用途將會(huì)讓你感受到利用NoSQL的好處。
希望順暢地對(duì)數(shù)據(jù)進(jìn)行緩存(Cache)處理
希望對(duì)數(shù)組類型的數(shù)據(jù)進(jìn)行高速處理
希望進(jìn)行全部保存
多樣的NoSQL數(shù)據(jù)庫
NoSQL數(shù)據(jù)庫存在著“key-value存儲(chǔ)”、“文檔型數(shù)據(jù)庫”、“列存儲(chǔ)數(shù)據(jù)庫”等各種各樣的種類,每種數(shù)據(jù)庫又包含各自的特點(diǎn)。下一節(jié)讓我們一起來了解一下NoSQL數(shù)據(jù)庫的種類和特點(diǎn)。
NoSQL數(shù)據(jù)庫是什么
NoSQL說起來簡單,但實(shí)際上到底有多少種呢?我在提筆的時(shí)候,到NoSQL的官方網(wǎng)站上確認(rèn)了一下,竟然已經(jīng)有122種了。另外官方網(wǎng)站上也介紹了本書沒有涉及到的圖形數(shù)據(jù)庫和對(duì)象數(shù)據(jù)庫等各個(gè)類別。不知不覺間,原來已經(jīng)出現(xiàn)了這么多的NoSQL數(shù)據(jù)庫啊。
本節(jié)將為大家介紹具有代表性的NoSQL數(shù)據(jù)庫。
key-value存儲(chǔ)
這是最常見的NoSQL數(shù)據(jù)庫,它的數(shù)據(jù)是以key-value的形式存儲(chǔ)的。雖然它的處理速度非???,但是基本上只能通過key的完全一致查詢獲取數(shù)據(jù)。根據(jù)數(shù)據(jù)的保存方式可以分為臨時(shí)性、永久性和兩者兼具三種。
臨時(shí)性
memcached屬于這種類型。所謂臨時(shí)性就是 “數(shù)據(jù)有可能丟失”的意思。memcached把所有數(shù)據(jù)都保存在內(nèi)存中,這樣保存和讀取的速度非常快,但是當(dāng)memcached停止的時(shí)候,數(shù)據(jù)就不存在了。由于數(shù)據(jù)保存在內(nèi)存中,所以無法操作超出內(nèi)存容量的數(shù)據(jù)(舊數(shù)據(jù)會(huì)丟失)。
在內(nèi)存中保存數(shù)據(jù)
可以進(jìn)行非常快速的保存和讀取處理
數(shù)據(jù)有可能丟失
永久性
Tokyo Tyrant、Flare、ROMA等屬于這種類型。和臨時(shí)性相反,所謂永久性就是“數(shù)據(jù)不會(huì)丟失”的意思。這里的key-value存儲(chǔ)不像memcached那樣在內(nèi)存中保存數(shù)據(jù),而是把數(shù)據(jù)保存在硬盤上。與memcached在內(nèi)存中處理數(shù)據(jù)比起來,由于必然要發(fā)生對(duì)硬盤的IO操作,所以性能上還是有差距的。但數(shù)據(jù)不會(huì)丟失是它最大的優(yōu)勢(shì)。
在硬盤上保存數(shù)據(jù)
可以進(jìn)行非常快速的保存和讀取處理(但無法與memcached相比)
數(shù)據(jù)不會(huì)丟失
兩者兼具
Redis屬于這種類型。Redis有些特殊,臨時(shí)性和永久性兼具,且集合了臨時(shí)性key-value存儲(chǔ)和永久性key-value存儲(chǔ)的優(yōu)點(diǎn)。Redis首先把數(shù)據(jù)保存到內(nèi)存中,在滿足特定條件(默認(rèn)是15分鐘一次以上,5分鐘內(nèi)10個(gè)以上,1分鐘內(nèi)10000個(gè)以上的key發(fā)生變更)的時(shí)候?qū)?shù)據(jù)寫入到硬盤中。這樣既確保了內(nèi)存中數(shù)據(jù)的處理速度,又可以通過寫入硬盤來保證數(shù)據(jù)的永久性。這種類型的數(shù)據(jù)庫特別適合于處理數(shù)組類型的數(shù)據(jù)。
同時(shí)在內(nèi)存和硬盤上保存數(shù)據(jù)
可以進(jìn)行非常快速的保存和讀取處理
保存在硬盤上的數(shù)據(jù)不會(huì)消失(可以恢復(fù))
適合于處理數(shù)組類型的數(shù)據(jù)
面向文檔的數(shù)據(jù)庫
MongoDB、CouchDB屬于這種類型。它們屬于NoSQL數(shù)據(jù)庫,但與key-value存儲(chǔ)相異。
不定義表結(jié)構(gòu)
面向文檔的數(shù)據(jù)庫具有以下特征:即使不定義表結(jié)構(gòu),也可以像定義了表結(jié)構(gòu)一樣使用。關(guān)系型數(shù)據(jù)庫在變更表結(jié)構(gòu)時(shí)比較費(fèi)事,而且為了保持一致性還需修改程序。然而NoSQL數(shù)據(jù)庫則可省去這些麻煩(通常程序都是正確的),確實(shí)是方便快捷。
可以使用復(fù)雜的查詢條件
跟key-value存儲(chǔ)不同的是,面向文檔的數(shù)據(jù)庫可以通過復(fù)雜的查詢條件來獲取數(shù)據(jù)。雖然不具備事務(wù)處理和JOIN這些關(guān)系型數(shù)據(jù)庫所具有的處理能力,但除此以外的其他處理基本上都能實(shí)現(xiàn)。這是非常容易使用的NoSQL數(shù)據(jù)庫。
不需要定義表結(jié)構(gòu)
可以利用復(fù)雜的查詢條件
面向列的數(shù)據(jù)庫
Cassandra、Hbase、HyperTable屬于這種類型。由于近年來數(shù)據(jù)量出現(xiàn)爆發(fā)性增長,這種類型的NoSQL數(shù)據(jù)庫尤其引人注目。
面向行的數(shù)據(jù)庫和面向列的數(shù)據(jù)庫
普通的關(guān)系型數(shù)據(jù)庫都是以行為單位來存儲(chǔ)數(shù)據(jù)的,擅長進(jìn)行以行為單位的讀入處理,比如特定條件數(shù)據(jù)的獲取。因此,關(guān)系型數(shù)據(jù)庫也被稱為面向行的數(shù)據(jù)庫。相反,面向列的數(shù)據(jù)庫是以列為單位來存儲(chǔ)數(shù)據(jù)的,擅長以列為單位讀入數(shù)據(jù)。
高擴(kuò)展性
面向列的數(shù)據(jù)庫具有高擴(kuò)展性,即使數(shù)據(jù)增加也不會(huì)降低相應(yīng)的處理速度(特別是寫入速度),所以它主要應(yīng)用于需要處理大量數(shù)據(jù)的情況。另外,利用面向列的數(shù)據(jù)庫的優(yōu)勢(shì),把它作為批處理程序的存儲(chǔ)器來對(duì)大量數(shù)據(jù)進(jìn)行更新也是非常有用的。但由于面向列的數(shù)據(jù)庫跟現(xiàn)行數(shù)據(jù)庫存儲(chǔ)的思維方式有很大不同,應(yīng)用起來十分困難。
高擴(kuò)展性(特別是寫入處理)
應(yīng)用十分困難
最近,像Twitter和Facebook這樣需要對(duì)大量數(shù)據(jù)進(jìn)行更新和查詢的網(wǎng)絡(luò)服務(wù)不斷增加,面向列的數(shù)據(jù)庫的優(yōu)勢(shì)對(duì)其中一些服務(wù)是非常有用的,但是由于這與本書所要介紹的內(nèi)容關(guān)系不大,就不進(jìn)行詳細(xì)介紹了。
總結(jié):
NoSQL并不是No-SQL,而是指Not Only SQL。
NoSQL的出現(xiàn)是為了彌補(bǔ)SQL數(shù)據(jù)庫因?yàn)槭聞?wù)等機(jī)制帶來的對(duì)海量數(shù)據(jù)、高并發(fā)請(qǐng)求的處理的性能上的欠缺。
NoSQL不是為了替代SQL而出現(xiàn)的,它是一種替補(bǔ)方案,而不是解決方案的首選。
絕大多數(shù)的NoSQL產(chǎn)品都是基于大內(nèi)存和高性能隨機(jī)讀寫的(比如具有更高性能的固態(tài)硬盤陣列),一般的小型企業(yè)在選擇NoSQL時(shí)一定要慎重!不要為了NoSQL而NoSQL,可能會(huì)導(dǎo)致花了冤枉錢又耽擱了項(xiàng)目進(jìn)程。
NoSQL不是萬能的,但在大型項(xiàng)目中,你往往需要它!
NoSQL,泛指非關(guān)系型的數(shù)據(jù)庫。隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫在應(yīng)付web2.0網(wǎng)站,特別是超大規(guī)模和高并發(fā)的SNS類型的web2.0純動(dòng)態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問題,而非關(guān)系型的數(shù)據(jù)庫則由于其本身的特點(diǎn)得到了非常迅速的發(fā)展。NoSQL數(shù)據(jù)庫的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重?cái)?shù)據(jù)種類帶來的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題。
雖然NoSQL流行語火起來才短短一年的時(shí)間,但是不可否認(rèn),現(xiàn)在已經(jīng)開始了第二代運(yùn)動(dòng)。盡管早期的堆棧代碼只能算是一種實(shí)驗(yàn),然而現(xiàn)在的系統(tǒng)已經(jīng)更加的成熟、穩(wěn)定。不過現(xiàn)在也面臨著一個(gè)嚴(yán)酷的事實(shí):技術(shù)越來越成熟——以至于原來很好的NoSQL數(shù)據(jù)存儲(chǔ)不得不進(jìn)行重寫,也有少數(shù)人認(rèn)為這就是所謂的2.0版本。這里列出一些比較知名的工具,可以為大數(shù)據(jù)建立快速、可擴(kuò)展的存儲(chǔ)庫。
NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,是一項(xiàng)全新的數(shù)據(jù)庫革命性運(yùn)動(dòng),早期就有人提出,發(fā)展至2009年趨勢(shì)越發(fā)高漲。NoSQL的擁護(hù)者們提倡運(yùn)用非關(guān)系型的數(shù)據(jù)存儲(chǔ),相對(duì)于鋪天蓋地的關(guān)系型數(shù)據(jù)庫運(yùn)用,這一概念無疑是一種全新的思維的注入。
NoSQL數(shù)據(jù)庫在以下的這幾種情況下比較適用:1、數(shù)據(jù)模型比較簡單;2、需要靈活性更強(qiáng)的IT系統(tǒng);3、對(duì)數(shù)據(jù)庫性能要求較高;4、不需要高度的數(shù)據(jù)一致性;5、對(duì)于給定key,比較容易映射復(fù)雜值的環(huán)境。
NoSQL太火,冒出太多產(chǎn)品了,保守估計(jì)也成百上千了。
互聯(lián)網(wǎng)公司常用的基本集中在以下幾種,每種只舉一個(gè)比較常見或者應(yīng)用比較成功的例子吧。
1. In-Memory KV Store : Redis
in memory key-value store,同時(shí)提供了更加豐富的數(shù)據(jù)結(jié)構(gòu)和運(yùn)算的能力,成功用法是替代memcached,通過checkpoint和commit log提供了快速的宕機(jī)恢復(fù),同時(shí)支持replication提供讀可擴(kuò)展和高可用。
2. Disk-Based KV Store: Leveldb
真正基于磁盤的key-value storage, 模型單一簡單,數(shù)據(jù)量不受限于內(nèi)存大小,數(shù)據(jù)落盤高可靠,Google的幾位大神出品的精品,LSM模型天然寫優(yōu)化,順序?qū)懕P的方式對(duì)于新硬件ssd再適合不過了,不足是僅提供了一個(gè)庫,需要自己封裝server端。
3. Document Store: Mongodb
分布式nosql,具備了區(qū)別mysql的最大亮點(diǎn):可擴(kuò)展性。mongodb 最新引人的莫過于提供了sql接口,是目前nosql里最像mysql的,只是沒有ACID的特性,發(fā)展很快,支持了索引等特性,上手容易,對(duì)于數(shù)據(jù)量遠(yuǎn)超內(nèi)存限制的場(chǎng)景來說,還需要慎重。
4. Column Table Store: HBase
這個(gè)富二代似乎不用贅述了,最大的優(yōu)勢(shì)是開源,對(duì)于普通的scan和基于行的get等基本查詢,性能完全不是問題,只是只提供裸的api,易用性上是短板,可擴(kuò)展性方面是最強(qiáng)的,其次坐上了Hadoop的快車,社區(qū)發(fā)展很快,各種基于其上的開源產(chǎn)品不少,來解決諸如join、聚集運(yùn)算等復(fù)雜查詢。