
前言
近幾年NoSQL數(shù)據(jù)庫興起,各種新的產(chǎn)品層出不窮,在此學(xué)習(xí)下NoSQL的基本理論,并認(rèn)識下常見的NoSQL數(shù)據(jù)庫。
一 NoSQL數(shù)據(jù)庫興起的原因
隨著大數(shù)據(jù)技術(shù)興起和Web2.0時代的到來。傳統(tǒng)關(guān)系型數(shù)據(jù)庫已經(jīng)無法滿足當(dāng)前的數(shù)據(jù)庫需求了。
無法滿足的需求主要有3點(diǎn):
- 海量數(shù)據(jù)的存儲與管理 (傳統(tǒng)關(guān)系型數(shù)據(jù)庫已經(jīng)無法支撐)
- 大數(shù)據(jù)量下的并發(fā)性 (傳統(tǒng)關(guān)系型數(shù)據(jù)庫嚴(yán)格的事務(wù)機(jī)制導(dǎo)致了海量數(shù)據(jù)的操作會導(dǎo)致大范圍的數(shù)據(jù)鎖定,降低并發(fā)性)
- 高可用性,高擴(kuò)展性(用戶更關(guān)注是否功能可用。海量數(shù)據(jù)需要橫向擴(kuò)展數(shù)據(jù)庫滿足需求,縱向已經(jīng)無法滿足)
與之相比原本關(guān)系型數(shù)據(jù)庫的優(yōu)點(diǎn)已經(jīng)不被許多公司所需要,主要也有3點(diǎn):
- 嚴(yán)格的數(shù)據(jù)庫事務(wù)(如微信,新浪微博等互聯(lián)網(wǎng)公司,丟失一條消息等,ACID的實(shí)現(xiàn)與否并不是很重要)
- 嚴(yán)格的讀寫實(shí)時性(同理,一條消息服務(wù)器寫入后,其他人是否立即看到并不太重要)
- 復(fù)雜的條件查詢(為了節(jié)約硬件存儲空間降低冗余,傳統(tǒng)關(guān)系型數(shù)據(jù)庫會將各種信息分表存儲,但是現(xiàn)在硬件性能已經(jīng)足夠?qū)⑿畔⑷看鎯?。并不太需要?fù)雜的多表查詢操作)
為了滿足大數(shù)據(jù)量下的業(yè)務(wù)需求,傳統(tǒng)關(guān)系型數(shù)據(jù)庫也發(fā)展出多種技術(shù)手段,但是最終事實(shí)證明NoSQL數(shù)據(jù)庫才是最適合的選擇。傳統(tǒng)關(guān)系型數(shù)據(jù)庫的解決方案經(jīng)歷了如下幾個階段:
- 主從復(fù)制,實(shí)現(xiàn)讀寫分離。設(shè)置一個主服務(wù)器,若干從服務(wù)器。主服務(wù)器負(fù)責(zé)寫操作,并實(shí)時復(fù)制修改內(nèi)容到從服務(wù)器上。從服務(wù)器負(fù)責(zé)讀操作。(但是對于寫請求的負(fù)擔(dān)仍然無法解決)
- 分庫,分流一部分請求。分庫又分為橫向分庫和縱向分庫,橫向分庫即將不同業(yè)務(wù)維度的數(shù)據(jù)庫拆分開來,服務(wù)器根據(jù)業(yè)務(wù)場景,查詢不同數(shù)據(jù)庫。縱向分庫即將數(shù)據(jù)行按照一定的規(guī)律分別存儲到不同數(shù)據(jù)庫內(nèi)。如:根據(jù)hash,根據(jù)生產(chǎn)時間等。(但是導(dǎo)致了不同庫之間不能直接查詢,且仍然無法滿足更大的數(shù)據(jù)要求)
- 分表,類似于分庫。通過橫向或者縱向切分表。
二 NoSQL數(shù)據(jù)庫的四大類型
分別是 :
- 鍵值數(shù)據(jù)庫
- 列族數(shù)據(jù)庫
- 文檔數(shù)據(jù)庫
- 圖數(shù)據(jù)庫
2.1 普遍的特性(優(yōu)點(diǎn))
- 數(shù)據(jù)結(jié)構(gòu)靈活。(傳統(tǒng)關(guān)系型數(shù)據(jù)庫有嚴(yán)格的字段要求,且后續(xù)修改復(fù)雜)
- 可擴(kuò)展性強(qiáng)(容易橫向擴(kuò)展,支持分布式,且擴(kuò)展的復(fù)雜度不高,對比傳統(tǒng)關(guān)系型數(shù)據(jù)庫的擴(kuò)展非常復(fù)雜)
- 支持高并發(fā)操作。
2.2 各自的特性
- 鍵值數(shù)據(jù)庫。是鍵值對的存儲數(shù)據(jù)庫。
- 優(yōu)點(diǎn):適合大量寫操作。
- 缺點(diǎn):但是存儲的數(shù)據(jù)沒有結(jié)構(gòu)化,復(fù)雜查詢效率低。
- 應(yīng)用:常用做內(nèi)容緩存。
- 代表產(chǎn)品:Redis,Memcached
- 列族數(shù)據(jù)庫,底層基于列族進(jìn)行存儲的數(shù)據(jù)庫。(查找時,基于行鍵列族查找,可以看做鍵值數(shù)據(jù)庫的變種)
- 優(yōu)點(diǎn):查詢速度快,橫向擴(kuò)展性尤其好,適合分布式系統(tǒng),屏蔽了分布式的復(fù)雜性。
- 缺點(diǎn):功能簡單,大都不支持事務(wù)一致性。(Hadoop的HBase是支持的)
- 應(yīng)用:分布式的數(shù)據(jù)存儲。
- 代表產(chǎn)品:Cassandra,HBase
- 文檔數(shù)據(jù)庫,基于鍵存儲文檔。(也可看做鍵值數(shù)據(jù)庫的變種)
- 優(yōu)點(diǎn):半結(jié)構(gòu)化,數(shù)據(jù)格式可以自解釋,如:JSON,XML。因此數(shù)據(jù)結(jié)構(gòu)非常靈活,且并發(fā)性高。
- 缺點(diǎn):缺乏統(tǒng)一的查詢語法
- 應(yīng)用:存儲文檔型數(shù)據(jù),半結(jié)構(gòu)化數(shù)據(jù)。
- 代表產(chǎn)品:MongoDB,CouchDB
- 圖數(shù)據(jù)庫,基于圖數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)庫。
- 優(yōu)點(diǎn):支持復(fù)雜的圖算法與關(guān)系圖譜
- 缺點(diǎn):只適合圖和關(guān)系的應(yīng)用領(lǐng)域,其他領(lǐng)域性能較差。
- 應(yīng)用:復(fù)雜圖結(jié)構(gòu),如社交網(wǎng)絡(luò),關(guān)系圖譜。
- 代表產(chǎn)品:Neo4J,InfoGrid
三 NoSQL數(shù)據(jù)庫的三大基石
3.1 CAP理論三個特性
- C:一致性(任何一個讀操作總是能讀取到之前完成的寫操作結(jié)果)
- A:可用性(每一個操作總是能夠在確定的時間內(nèi)返回,也就是系統(tǒng)隨時都是可用的)
- P:分區(qū)容忍性(出現(xiàn)網(wǎng)絡(luò)分區(qū),整個系統(tǒng)仍然可用)
經(jīng)過證明,一個分布式系統(tǒng)不能同時滿足三個特性,最多滿足兩個。
傳統(tǒng)關(guān)系型數(shù)據(jù)庫滿足了CA,放棄了P。因此擴(kuò)展困難。而現(xiàn)在大部分互聯(lián)網(wǎng)系統(tǒng)都是分布式系統(tǒng),不可能放棄P特性。
通俗的解釋下為何只能同時滿足兩個特性:
假設(shè)同時滿足C和A和P。P保證了系統(tǒng)存在不同的網(wǎng)絡(luò)節(jié)點(diǎn),那么為了保證C,系統(tǒng)會嘗試與其他的節(jié)點(diǎn)同步數(shù)據(jù)信息,但是出現(xiàn)網(wǎng)絡(luò)問題導(dǎo)致系統(tǒng)分區(qū)時(即節(jié)點(diǎn)無法互相通信),會導(dǎo)致同步無法立刻完成,這樣就無法滿足A了。
此時只需要去除一個特性即可:
- 去除P,保留CA。則沒有了網(wǎng)絡(luò)通信問題,在實(shí)現(xiàn)C數(shù)據(jù)一致性時,可以很快的完成,也保證了A。
- 去除A,保留CP。則不要求立刻完成,在實(shí)現(xiàn)C數(shù)據(jù)一致性時,即使出現(xiàn)了網(wǎng)絡(luò)分區(qū)P,也可以慢慢等待。
- 去除C,保留AP。則不需要保證數(shù)據(jù)一致性了,即使網(wǎng)絡(luò)出現(xiàn)分區(qū),各個節(jié)點(diǎn)都能單獨(dú)運(yùn)行,保證了用戶可用(反正系統(tǒng)已經(jīng)不在乎各個節(jié)點(diǎn)數(shù)據(jù)的一致了)。
3.2 BASE理論
BASE模型反ACID模型,完全不同ACID模型,犧牲高一致性,獲得可用性。
- BA:基本可用。一部分分區(qū)出現(xiàn)問題,系統(tǒng)仍然可用,主要保證核心功能可用。(電商大促時,為了應(yīng)對訪問量激增,部分用戶可能會被引導(dǎo)到降級頁面,服務(wù)層也可能只提供降級服務(wù)。這就是損失部分可用性的體現(xiàn))
- S:軟狀態(tài)。數(shù)據(jù)的一致性要求降低,可以一段時間不滿足一致性。相對應(yīng)的是硬狀態(tài)。(分布式存儲中一般一份數(shù)據(jù)至少會有三個副本,允許不同節(jié)點(diǎn)間副本同步的延時就是軟狀態(tài)的體現(xiàn)。mysql replication的異步復(fù)制也是一種體現(xiàn)。)
- E:最終一致性。弱一致性,后續(xù)操作無法立刻獲取更新的信息。相對應(yīng)的是強(qiáng)一致性。最終一致性是特殊的弱一致性,只保證了。
3.3 最終一致性
(明明BASE就包含了最終一致性,不知道書中為何又將它單獨(dú)列為三大理論基礎(chǔ)之一)