前言
近幾年NoSQL數據庫興起,各類新的產品層出不窮,在此學習下NoSQL的基本理論,並認識下常見的NoSQL數據庫。mysql
一 NoSQL數據庫興起的緣由
隨着大數據技術興起和Web2.0時代的到來。傳統關係型數據庫已經沒法知足當前的數據庫需求了。算法
沒法知足的需求主要有3點:sql
- 海量數據的存儲與管理 (傳統關係型數據庫已經沒法支撐)
- 大數據量下的併發性 (傳統關係型數據庫嚴格的事務機制致使了海量數據的操做會致使大範圍的數據鎖定,下降併發性)
- 高可用性,高擴展性(用戶更關注是否功能可用。海量數據須要橫向擴展數據庫知足需求,縱向已經沒法知足)
與之相比本來關係型數據庫的優勢已經不被許多公司所須要,主要也有3點:數據庫
- 嚴格的數據庫事務(如微信,新浪微博等互聯網公司,丟失一條消息等,ACID的實現與否並非很重要)
- 嚴格的讀寫實時性(同理,一條消息服務器寫入後,其餘人是否當即看到並不過重要)
- 複雜的條件查詢(爲了節約硬件存儲空間下降冗餘,傳統關係型數據庫會將各類信息分表存儲,可是如今硬件性能已經足夠將信息所有存儲。並不太須要複雜的多表查詢操做)
爲了知足大數據量下的業務需求,傳統關係型數據庫也發展出多種技術手段,可是最終事實證實NoSQL數據庫纔是最適合的選擇。傳統關係型數據庫的解決方案經歷了以下幾個階段:緩存
- 主從複製,實現讀寫分離。設置一個主服務器,若干從服務器。主服務器負責寫操做,並實時複製修改內容到從服務器上。從服務器負責讀操做。(可是對於寫請求的負擔仍然沒法解決)
- 分庫,分流一部分請求。分庫又分爲橫向分庫和縱向分庫,橫向分庫即將不一樣業務維度的數據庫拆分開來,服務器根據業務場景,查詢不一樣數據庫。縱向分庫即將數據行按照必定的規律分別存儲到不一樣數據庫內。如:根據hash,根據生產時間等。(可是致使了不一樣庫之間不能直接查詢,且仍然沒法知足更大的數據要求)
- 分表,相似於分庫。經過橫向或者縱向切分表。
二 NoSQL數據庫的四大類型
分別是 :服務器
2.1 廣泛的特性(優勢)
- 數據結構靈活。(傳統關係型數據庫有嚴格的字段要求,且後續修改複雜)
- 可擴展性強(容易橫向擴展,支持分佈式,且擴展的複雜度不高,對比傳統關係型數據庫的擴展很是複雜)
- 支持高併發操做。
2.2 各自的特性
- 鍵值數據庫。是鍵值對的存儲數據庫。
- 優勢:適合大量寫操做。
- 缺點:可是存儲的數據沒有結構化,複雜查詢效率低。
- 應用:經常使用作內容緩存。
- 表明產品:Redis,Memcached
- 列族數據庫,底層基於列族進行存儲的數據庫。(查找時,基於行鍵列族查找,能夠看作鍵值數據庫的變種)
- 優勢:查詢速度快,橫向擴展性尤爲好,適合分佈式系統,屏蔽了分佈式的複雜性。
- 缺點:功能簡單,大都不支持事務一致性。(Hadoop的HBase是支持的)
- 應用:分佈式的數據存儲。
- 表明產品:Cassandra,HBase
- 文檔數據庫,基於鍵存儲文檔。(也可看作鍵值數據庫的變種)
- 優勢:半結構化,數據格式能夠自解釋,如:JSON,XML。所以數據結構很是靈活,且併發性高。
- 缺點:缺少統一的查詢語法
- 應用:存儲文檔型數據,半結構化數據。
- 表明產品:MongoDB,CouchDB
- 圖數據庫,基於圖數據結構的數據庫。
- 優勢:支持複雜的圖算法與關係圖譜
- 缺點:只適合圖和關係的應用領域,其餘領域性能較差。
- 應用:複雜圖結構,如社交網絡,關係圖譜。
- 表明產品:Neo4J,InfoGrid
三 NoSQL數據庫的三大基石
3.1 CAP理論三個特性
- C:一致性(任何一個讀操做老是能讀取到以前完成的寫操做結果)
- A:可用性(每個操做老是可以在肯定的時間內返回,也就是系統隨時都是可用的)
- P:分區容忍性(出現網絡分區,整個系統仍然可用)
通過證實,一個分佈式系統不能同時知足三個特性,最多知足兩個。微信
傳統關係型數據庫知足了CA,放棄了P。所以擴展困難。而如今大部分互聯網系統都是分佈式系統,不可能放棄P特性。網絡
通俗的解釋下爲什麼只能同時知足兩個特性:數據結構
假設同時知足C和A和P。P保證了系統存在不一樣的網絡節點,那麼爲了保證C,系統會嘗試與其餘的節點同步數據信息,可是出現網絡問題致使系統分區時(即節點沒法互相通訊),會致使同步沒法馬上完成,這樣就沒法知足A了。併發
此時只須要去除一個特性便可:
- 去除P,保留CA。則沒有了網絡通訊問題,在實現C數據一致性時,能夠很快的完成,也保證了A。
- 去除A,保留CP。則不要求馬上完成,在實現C數據一致性時,即便出現了網絡分區P,也能夠慢慢等待。
- 去除C,保留AP。則不須要保證數據一致性了,即便網絡出現分區,各個節點都能單獨運行,保證了用戶可用(反正系統已經不在意各個節點數據的一致了)。
3.2 BASE理論
BASE模型反ACID模型,徹底不一樣ACID模型,犧牲高一致性,得到可用性。
- BA:基本可用。一部分分區出現問題,系統仍然可用,主要保證核心功能可用。(電商大促時,爲了應對訪問量激增,部分用戶可能會被引導到降級頁面,服務層也可能只提供降級服務。這就是損失部分可用性的體現)
- S:軟狀態。數據的一致性要求下降,能夠一段時間不知足一致性。相對應的是硬狀態。(分佈式存儲中通常一份數據至少會有三個副本,容許不一樣節點間副本同步的延時就是軟狀態的體現。mysql replication的異步複製也是一種體現。)
- E:最終一致性。弱一致性,後續操做沒法馬上獲取更新的信息。相對應的是強一致性。最終一致性是特殊的弱一致性,只保證了。
3.3 最終一致性
(明明BASE就包含了最終一致性,不知道書中爲什麼又將它單獨列爲三大理論基礎之一)