NoSQL數據庫相關概念
NoSQL數據庫概述
特點
模式自由
不需要定義表結構,數據表中的每條記錄 都可能有不同的屬性和格式。
逆範式化
不遵循範式要求,去掉完整性約束,減少 表之間的依賴。
多分區存儲
數據進行分區,將記錄分散到多個節點上
彈性可擴展
可在系統運行過程中,動態增 加和刪除節點,數據自動平衡移動。
多副本
數據快速寫入一個節點,其余 節點通過讀取寫入節點日誌來 實現異步復制。
軟事務
不能完全滿足事務的ACID特性,保證事務的最終一致性。
ACID:
關系型數據庫遵循ACID規則
事務在英文中是transaction,和現實世界中的交易很類似,它有如下四個特性:
1、A (Atomicity) 原子性
原子性很容易理解,也就是說事務裏的所有操作要麽全部做完,要麽都不做,事務成功的條件是事務裏的所有操作都成功,只要有一個操作失敗,整個事務就失敗,需要回滾。
比如銀行轉賬,從A賬戶轉100元至B賬戶,分為兩個步驟:1)從A賬戶取100元;2)存入100元至B賬戶。這兩步要麽一起完成,要麽一起不完成,如果只完成第一步,第二步失敗,錢會莫名其妙少了100元。
2、C (Consistency) 一致性
一致性也比較容易理解,也就是說數據庫要一直處於一致的狀態,事務的運行不會改變數據庫原本的一致性約束。
例如現有完整性約束a+b=10,如果一個事務改變了a,那麽必須得改變b,使得事務結束後依然滿足a+b=10,否則事務失敗。
3、I (Isolation) 獨立性
所謂的獨立性是指並發的事務之間不會互相影響,如果一個事務要訪問的數據正在被另外一個事務修改,只要另外一個事務未提交,它所訪問的數據就不受未提交事務的影響。
比如現在有個交易是從A賬戶轉100元至B賬戶,在這個交易還未完成的情況下,如果此時B查詢自己的賬戶,是看不到新增加的100元的。
4、D (Durability) 持久性
持久性是指一旦事務提交後,它所做的修改將會永久的保存在數據庫上,即使出現宕機也不會丟失。
SQL vs NoSQL
SQL
- 高度組織化結構化數據
- 結構化查詢語言(SQL) (SQL)
- 數據和關系都存儲在單獨的表中。
- 數據操縱語言,數據定義語言
- 嚴格的一致性
- 基礎事務
NoSQL
- 代表著不僅僅是SQL
- 沒有聲明性查詢語言
- 沒有預定義的模式
- 鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫
- 最終一致性,而非ACID屬性
- 非結構化和不可預知的數據
- CAP定理
- 高性能,高可用性和可伸縮性
NoSQL 簡史
NoSQL一詞最早出現於1998年,是Carlo Strozzi開發的一個輕量、開源、不提供SQL功能的關系數據庫。
2009年,Last.fm的Johan Oskarsson發起了一次關於分布式開源數據庫的討論[2],來自Rackspace的Eric Evans再次提出了NoSQL的概念,這時的NoSQL主要指非關系型、分布式、不提供ACID的數據庫設計模式。
2009年在亞特蘭大舉行的"no:sql(east)"討論會是一個裏程碑,其口號是"select fun, profit from real_world where relational=false;"。因此,對NoSQL最普遍的解釋是"非關聯型的",強調Key-Value Stores和文檔數據庫的優點,而不是單純的反對RDBMS。
CAP定理(CAP theorem)
在計算機科學中, CAP定理(CAP theorem), 又被稱作 布魯爾定理(Brewer‘s theorem), 它指出對於一個分布式計算系統來說,不可能同時滿足以下三點:
- 一致性(Consistency) (所有節點在同一時間具有相同的數據)
- 可用性(Availability) (保證每個請求不管成功或者失敗都有響應)
- 分隔容忍(Partition tolerance) (系統中任意信息的丟失或失敗不會影響系統的繼續運作)
CAP理論的核心是:一個分布式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求,最多只能同時較好的滿足兩個。
因此,根據 CAP 原理將 NoSQL 數據庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三大類:
- CA - 單點集群,滿足一致性,可用性的系統,通常在可擴展性上不太強大。
- CP - 滿足一致性,分區容忍性的系統,通常性能不是特別高。
- AP - 滿足可用性,分區容忍性的系統,通常可能對一致性要求低一些。
BASE
BASE:Basically Available, Soft-state, Eventually Consistent。 由 Eric Brewer 定義。
CAP理論的核心是:一個分布式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求,最多只能同時較好的滿足兩個。
BASE是NoSQL數據庫通常對可用性及一致性的弱要求原則:
- Basically Availble --基本可用
- Soft-state --軟狀態/柔性事務。 "Soft state" 可以理解為"無連接"的, 而 "Hard state" 是"面向連接"的
- Eventual Consistency --最終一致性 最終一致性, 也是是 ACID 的最終目的。
ACID vs BASE
ACID | BASE |
---|---|
原子性(Atomicity) | 基本可用(Basically Available) |
一致性(Consistency) | 軟狀態/柔性事務(Soft state) |
隔離性(Isolation) | 最終一致性 (Eventual consistency) |
持久性 (Durable) |
什麽是原子性
舉個例子:
A想要從自己的帳戶中轉1000塊錢到B的帳戶裏。那個從A開始轉帳,到轉帳結束的這一個過程,稱之為一個事務。在這個事務裏,要做如下操作:
- 從A的帳戶中減去1000塊錢。如果A的帳戶原來有3000塊錢,現在就變成2000塊錢了。
- 在B的帳戶裏加1000塊錢。如果B的帳戶如果原來有2000塊錢,現在則變成3000塊錢了。
如果在A的帳戶已經減去了1000塊錢的時候,忽然發生了意外,比如停電什麽的,導致轉帳事務意外終止了,而此時B的帳戶裏還沒有增加1000塊錢。那麽,我們稱這個操作失敗了,要進行回滾。回滾就是回到事務開始之前的狀態,也就是回到A的帳戶還沒減1000塊的狀態,B的帳戶的原來的狀態。此時A的帳戶仍然有3000塊,B的帳戶仍然有2000塊。
我們把這種要麽一起成功(A帳戶成功減少1000,同時B帳戶成功增加1000),要麽一起失敗(A帳戶回到原來狀態,B帳戶也回到原來狀態)的操作叫原子性操作。
如果把一個事務可看作是一個程序,它要麽完整的被執行,要麽完全不執行。這種特性就叫原子性
NoSQL 數據庫分類
類型 | 部分代表 | 特點 |
---|---|---|
列存儲 | HbaseCassandraHypertable | 顧名思義,是按列存儲數據的。最大的特點是方便存儲結構化和半結構化數據,方便做數據壓縮,對針對某一列或者某幾列的查詢有非常大的IO優勢。 |
文檔存儲 | MongoDBCouchDB | 文檔存儲一般用類似json的格式存儲,存儲的內容是文檔型的。這樣也就有有機會對某些字段建立索引,實現關系數據庫的某些功能。 |
key-value存儲 | Tokyo Cabinet / TyrantBerkeley DBMemcacheDBRedis | 可以通過key快速查詢到其value。一般來說,存儲不管value的格式,照單全收。(Redis包含了其他功能) |
圖存儲 | Neo4JFlockDB | 圖形關系的最佳存儲。使用傳統關系數據庫來解決的話性能低下,而且設計使用不方便。 |
對象存儲 | db4oVersant | 通過類似面向對象語言的語法操作數據庫,通過對象的方式存取數據。 |
xml數據庫 | Berkeley DB XMLBaseX | 高效的存儲XML數據,並支持XML的內部查詢語法,比如XQuery,Xpath。 |
NoSQL數據庫相關概念