NoSQL數(shù)據(jù)庫興起

image

前言

近幾年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)歷了如下幾個階段:

  1. 主從復(fù)制,實(shí)現(xiàn)讀寫分離。設(shè)置一個主服務(wù)器,若干從服務(wù)器。主服務(wù)器負(fù)責(zé)寫操作,并實(shí)時復(fù)制修改內(nèi)容到從服務(wù)器上。從服務(wù)器負(fù)責(zé)讀操作。(但是對于寫請求的負(fù)擔(dān)仍然無法解決
  2. 分庫,分流一部分請求。分庫又分為橫向分庫和縱向分庫,橫向分庫即將不同業(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ù)要求
  3. 分表,類似于分庫。通過橫向或者縱向切分表。

二 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 各自的特性

  1. 鍵值數(shù)據(jù)庫。是鍵值對的存儲數(shù)據(jù)庫。
  • 優(yōu)點(diǎn):適合大量寫操作。
  • 缺點(diǎn):但是存儲的數(shù)據(jù)沒有結(jié)構(gòu)化,復(fù)雜查詢效率低。
  • 應(yīng)用:常用做內(nèi)容緩存。
  • 代表產(chǎn)品:Redis,Memcached
  1. 列族數(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
  1. 文檔數(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
  1. 圖數(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了。

此時只需要去除一個特性即可:

  1. 去除P,保留CA。則沒有了網(wǎng)絡(luò)通信問題,在實(shí)現(xiàn)C數(shù)據(jù)一致性時,可以很快的完成,也保證了A。
  2. 去除A,保留CP。則不要求立刻完成,在實(shí)現(xiàn)C數(shù)據(jù)一致性時,即使出現(xiàn)了網(wǎng)絡(luò)分區(qū)P,也可以慢慢等待。
  3. 去除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ǔ)之一)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,948評論 0 9
  • 當(dāng)前數(shù)據(jù)庫分為關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫 關(guān)系型數(shù)據(jù)庫 關(guān)系型數(shù)據(jù)庫:指采用了關(guān)系模型來組織數(shù)據(jù)的數(shù)據(jù)庫。關(guān)系模...
    意識流丶閱讀 163,346評論 4 102
  • 為何要使用NoSQL數(shù)據(jù)庫? 1.NoSQL具有靈活的數(shù)據(jù)模型,可以處理非結(jié)構(gòu)化/半結(jié)構(gòu)化的大數(shù)據(jù) 2.NoSQL...
    毛子阿卡西閱讀 567評論 0 3
  • 今天是我的月經(jīng)第一日,狀態(tài)不好,整個人悶悶的,看什么都不大順眼,得忍著,得在心里不斷地提醒自己,不能要求別人和自己...
    曼谷123閱讀 217評論 0 0
  • 高級 雙保險 公鑰,私鑰 DH 密鑰交換算法(是非對稱加密的起源) RSA 基于因子分解(應(yīng)用范圍最廣,既能用于數(shù)...
    _愛笑的eyes閱讀 5,120評論 0 1

友情鏈接更多精彩內(nèi)容