前言
近幾年NoSQL數(shù)據(jù)庫興起撞叽,各種新的產(chǎn)品層出不窮嗅辣,在此學(xué)習(xí)下NoSQL的基本理論,并認識下常見的NoSQL數(shù)據(jù)庫麦撵。
一 NoSQL數(shù)據(jù)庫興起的原因
隨著大數(shù)據(jù)技術(shù)興起和Web2.0時代的到來。傳統(tǒng)關(guān)系型數(shù)據(jù)庫已經(jīng)無法滿足當前的數(shù)據(jù)庫需求了溃肪。
無法滿足的需求主要有3點:
- 海量數(shù)據(jù)的存儲與管理 (傳統(tǒng)關(guān)系型數(shù)據(jù)庫已經(jīng)無法支撐)
- 大數(shù)據(jù)量下的并發(fā)性 (傳統(tǒng)關(guān)系型數(shù)據(jù)庫嚴格的事務(wù)機制導(dǎo)致了海量數(shù)據(jù)的操作會導(dǎo)致大范圍的數(shù)據(jù)鎖定免胃,降低并發(fā)性)
- 高可用性,高擴展性(用戶更關(guān)注是否功能可用惫撰。海量數(shù)據(jù)需要橫向擴展數(shù)據(jù)庫滿足需求羔沙,縱向已經(jīng)無法滿足)
與之相比原本關(guān)系型數(shù)據(jù)庫的優(yōu)點已經(jīng)不被許多公司所需要,主要也有3點:
- 嚴格的數(shù)據(jù)庫事務(wù)(如微信厨钻,新浪微博等互聯(lián)網(wǎng)公司扼雏,丟失一條消息等,ACID的實現(xiàn)與否并不是很重要)
- 嚴格的讀寫實時性(同理夯膀,一條消息服務(wù)器寫入后诗充,其他人是否立即看到并不太重要)
- 復(fù)雜的條件查詢(為了節(jié)約硬件存儲空間降低冗余,傳統(tǒng)關(guān)系型數(shù)據(jù)庫會將各種信息分表存儲诱建,但是現(xiàn)在硬件性能已經(jīng)足夠?qū)⑿畔⑷看鎯选2⒉惶枰獜?fù)雜的多表查詢操作)
為了滿足大數(shù)據(jù)量下的業(yè)務(wù)需求,傳統(tǒng)關(guān)系型數(shù)據(jù)庫也發(fā)展出多種技術(shù)手段俺猿,但是最終事實證明NoSQL數(shù)據(jù)庫才是最適合的選擇励翼。傳統(tǒng)關(guān)系型數(shù)據(jù)庫的解決方案經(jīng)歷了如下幾個階段:
- 主從復(fù)制,實現(xiàn)讀寫分離辜荠。設(shè)置一個主服務(wù)器汽抚,若干從服務(wù)器。主服務(wù)器負責寫操作伯病,并實時復(fù)制修改內(nèi)容到從服務(wù)器上造烁。從服務(wù)器負責讀操作。(但是對于寫請求的負擔仍然無法解決)
- 分庫午笛,分流一部分請求惭蟋。分庫又分為橫向分庫和縱向分庫,橫向分庫即將不同業(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)點)
- 數(shù)據(jù)結(jié)構(gòu)靈活吱殉。(傳統(tǒng)關(guān)系型數(shù)據(jù)庫有嚴格的字段要求,且后續(xù)修改復(fù)雜)
- 可擴展性強(容易橫向擴展厘托,支持分布式友雳,且擴展的復(fù)雜度不高,對比傳統(tǒng)關(guān)系型數(shù)據(jù)庫的擴展非常復(fù)雜)
- 支持高并發(fā)操作铅匹。
2.2 各自的特性
- 鍵值數(shù)據(jù)庫押赊。是鍵值對的存儲數(shù)據(jù)庫。
- 優(yōu)點:適合大量寫操作伊群。
- 缺點:但是存儲的數(shù)據(jù)沒有結(jié)構(gòu)化,復(fù)雜查詢效率低策精。
- 應(yīng)用:常用做內(nèi)容緩存舰始。
- 代表產(chǎn)品:Redis,Memcached
- 列族數(shù)據(jù)庫咽袜,底層基于列族進行存儲的數(shù)據(jù)庫丸卷。(查找時,基于行鍵列族查找询刹,可以看做鍵值數(shù)據(jù)庫的變種)
- 優(yōu)點:查詢速度快谜嫉,橫向擴展性尤其好,適合分布式系統(tǒng)凹联,屏蔽了分布式的復(fù)雜性沐兰。
- 缺點:功能簡單,大都不支持事務(wù)一致性蔽挠。(Hadoop的HBase是支持的)
- 應(yīng)用:分布式的數(shù)據(jù)存儲住闯。
- 代表產(chǎn)品:Cassandra,HBase
- 文檔數(shù)據(jù)庫澳淑,基于鍵存儲文檔比原。(也可看做鍵值數(shù)據(jù)庫的變種)
- 優(yōu)點:半結(jié)構(gòu)化,數(shù)據(jù)格式可以自解釋杠巡,如:JSON,XML量窘。因此數(shù)據(jù)結(jié)構(gòu)非常靈活,且并發(fā)性高氢拥。
- 缺點:缺乏統(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)點:支持復(fù)雜的圖算法與關(guā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。因此擴展困難昆汹。而現(xiàn)在大部分互聯(lián)網(wǎng)系統(tǒng)都是分布式系統(tǒng)明刷,不可能放棄P特性。
通俗的解釋下為何只能同時滿足兩個特性:
假設(shè)同時滿足C和A和P满粗。P保證了系統(tǒng)存在不同的網(wǎng)絡(luò)節(jié)點辈末,那么為了保證C,系統(tǒng)會嘗試與其他的節(jié)點同步數(shù)據(jù)信息映皆,但是出現(xiàn)網(wǎng)絡(luò)問題導(dǎo)致系統(tǒng)分區(qū)時(即節(jié)點無法互相通信)挤聘,會導(dǎo)致同步無法立刻完成,這樣就無法滿足A了捅彻。
此時只需要去除一個特性即可:
- 去除P组去,保留CA。則沒有了網(wǎng)絡(luò)通信問題步淹,在實現(xiàn)C數(shù)據(jù)一致性時添怔,可以很快的完成,也保證了A贤旷。
- 去除A广料,保留CP。則不要求立刻完成幼驶,在實現(xiàn)C數(shù)據(jù)一致性時艾杏,即使出現(xiàn)了網(wǎng)絡(luò)分區(qū)P,也可以慢慢等待盅藻。
- 去除C购桑,保留AP畅铭。則不需要保證數(shù)據(jù)一致性了,即使網(wǎng)絡(luò)出現(xiàn)分區(qū)勃蜘,各個節(jié)點都能單獨運行硕噩,保證了用戶可用(反正系統(tǒng)已經(jīng)不在乎各個節(jié)點數(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é)點間副本同步的延時就是軟狀態(tài)的體現(xiàn)浇坐。mysql replication的異步復(fù)制也是一種體現(xiàn)窿凤。)
- E:最終一致性仅偎。弱一致性,后續(xù)操作無法立刻獲取更新的信息雳殊。相對應(yīng)的是強一致性橘沥。最終一致性是特殊的弱一致性,只保證了夯秃。
3.3 最終一致性
(明明BASE就包含了最終一致性座咆,不知道書中為何又將它單獨列為三大理論基礎(chǔ)之一)