NoSQL,指的是非關係型的數據庫。隨着互聯網web2.0網站的興起,傳統的關係數據庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了不少難以克服的問題,而非關係型的數據庫則因爲其自己的特色獲得了很是迅速的發展。前端
簡介
NoSQL(NoSQL = Not Only SQL ),意即「不只僅是
SQL」,是一項全新的數據庫革命性運動,早期就有人提出,發展至2009年趨勢愈加高漲。NoSQL的擁護者們提倡運用非關係型的數據存儲,相對於鋪天蓋地的
關係型數據庫運用,這一律念無疑是一種全新的思惟的注入。
2情況
計算機體系結構在數據存儲方面要求具有龐大的水平擴展性①,而NoSQL致力於改變這一現狀。Google的 BigTable 和Amazon 的Dynamo使用的就是NoSQL型數據庫。
NoSQL項目的名字上看不出什麼相同之處,可是,它們一般在某些方面相同:它們能夠處理超大量的數據。
這場革命仍然須要等待。的確,NoSQL對大型企業來講還不是主流,可是,一兩年以後極可能就會變個樣子。在NoSQL運動的最新一次聚會中,來自世界各地的150人擠滿了CBS Interactive的一間會議室。分享他們如何推翻緩慢而昂貴的關係數據庫的暴政的經驗,怎樣使用更有效和更便宜的方法來管理數據。
「
關係型數據庫給你強加了太多東西。它們要你強行修改對象數據,以知足RDBMS (relational database management system,
關係型數據庫管理系統)的須要,」在NoSQL擁護者們看來,基於NoSQL的替代方案「只是給你所須要的」。
水平擴展性(horizontal scalability)指可以鏈接多個軟硬件的特性,這樣能夠將多個服務器從邏輯上當作一個實體。
3發展
隨着互聯網
web2.0網站的興起,非關係型的數據庫成了一個極其熱門的新領域,非關係數據庫產品的發展很是迅速。而傳統的關係數據庫在應付
web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了不少難以克服的問題,例如:
一、High performance - 對數據庫高併發讀寫的需求
web2.0網站要根據用戶個性化信息來實時生成
動態頁面和提供動態信息,因此基本上沒法使用
動態頁面靜態化技術,所以數據庫併發負載很是高,每每要達到每秒上萬次讀寫請求。關係數據庫應付上萬次SQL查詢還勉強頂得住,可是應付上萬次SQL寫數據請求,硬盤IO就已經沒法承受了。其實對於普通的BBS網站,每每也存在對高併發寫請求的需求。
二、Huge Storage - 對海量數據的高效率存儲和訪問的需求
對於大型的SNS網站,天天用戶產生海量的用戶動態,以國外的Friendfeed爲例,一個月就達到了2.5億條用戶動態,對於關係數據庫來講,在一張2.5億條記錄的表裏面進行SQL查詢,效率是極其低下乃至不可忍受的。再例如大型web網站的用戶登陸系統,
三、High Scalability && High Availability- 對數據庫的高可擴展性和高可用性的需求
在基於web的架構當中,數據庫是最難進行橫向擴展的,當一個應用系統的
用戶量和訪問量與日俱增的時候,你的數據庫卻沒有辦法像web server和app server那樣簡單的經過添加更多的硬件和服務節點來擴展性能和負載能力。對於不少須要提供24小時不間斷服務的網站來講,對
數據庫系統進行升級和擴展是很是痛苦的事情,每每須要停機維護和
數據遷移,爲何數據庫不能經過不斷的添加
服務器節點來實現擴展呢?
在上面提到的「三高」需求面前,關係數據庫遇到了難以克服的障礙,而對於
web2.0網站來講,關係數據庫的不少主要特性卻每每無用武之地,例如:
一、數據庫事務一致性需求
不少web
實時系統並不要求嚴格的數據庫事務,對讀一致性的要求很低,有些場合對寫一致性要求也不高。所以數據庫事務管理成了數據庫高負載下一個沉重的負擔。
二、數據庫的寫實時性和讀實時性需求
對關係數據庫來講,插入一條數據以後馬上查詢,是確定能夠讀出來這條數據的。並不要求這麼高的實時性。
三、對複雜的SQL查詢,特別是多表關聯查詢的需求
任何
大數據量的web系統,都很是忌諱多個大表的關聯查詢,以及複雜的數據分析類型的複雜SQL報表查詢,特別是SNS類型的網站,從需求以及產品設計角度,就避免了這種狀況的產生。每每更多的只是單表的主鍵查詢,以及單表的簡單條件
分頁查詢,SQL的功能被極大的弱化了。
所以,關係數據庫在這些愈來愈多的應用場景下顯得不那麼合適了,爲了解決這類問題的非關係數據庫應運而生。
NoSQL 是非關係型數據存儲的廣義定義。它打破了長久以來
關係型數據庫與ACID理論
大一統的局面。NoSQL 數據存儲不須要固定的表結構,一般也不存在鏈接操做。在
大數據存取上具有
關係型數據庫沒法比擬的性能優點。該術語在 2009 年初獲得了普遍認同。
當今的應用
體系結構須要
數據存儲在橫向伸縮性上可以知足需求。而 NoSQL 存儲就是爲了實現這個需求。Google 的BigTable與Amazon的Dynamo是很是成功的商業 NoSQL 實現。一些開源的 NoSQL 體系,如Facebook 的Cassandra, Apache 的
HBase,也獲得了普遍認同。從這些NoSQL項目的名字上看不出什麼相同之處:Hadoop、Voldemort、Dynomite,還有其它不少。
NoSQL與關係型數據庫設計理念比較
關係型數據庫中的表都是存儲一些格式化的數據結構,每一個元組字段的組成都同樣,即便不是每一個元組都須要全部的字段,但數據庫會爲每一個元組分配全部的字段,這樣的結構能夠便於表與表之間進行鏈接等操做,但從另外一個角度來講它也是關係型數據庫性能瓶頸的一個因素。而非
關係型數據庫以鍵值對
存儲,它的結構不固定,每個
元組能夠有不同的字段,每一個元組能夠根據須要增長一些本身的鍵值對,這樣就不會侷限於固定的結構,能夠減小一些時間和空間的開銷。
4特色
它們能夠處理超大量的數據。
它們運行在便宜的PC服務器集羣上。
PC集羣擴充起來很是方便而且成本很低,避免了「sharding」操做的複雜性和成本。
它們擊碎了性能瓶頸。
NoSQL的支持者稱,經過NoSQL架構能夠省去將Web或Java應用和數據轉換成SQL友好格式的時間,執行速度變得更快。
「SQL並不是適用於全部的程序代碼,」 對於那些繁重的重複操做的數據,SQL值得花錢。可是當數據庫結構很是簡單時,SQL可能沒有太大用處。
沒有過多的操做。
雖然NoSQL的支持者也認可關係數據庫提供了無可比擬的功能集合,並且在
數據完整性上也發揮絕對穩定,他們同時也表示,企業的具體需求可能沒有那麼多。
Bootstrap支持
由於NoSQL項目都是開源的,所以它們缺少供應商提供的正式支持。這一點它們與大多數開源項目同樣,不得不從社區中尋求支持。
5優勢
易擴展
NoSQL數據庫種類繁多,可是一個共同的特色都是去掉關係數據庫的關係型特性。數據之間無關係,這樣就很是容易擴展。也無形之間,在架構的層面上帶來了可擴展的能力。
大數據量,高性能
NoSQL數據庫都具備很是高的讀寫性能,尤爲在大數據量下,一樣表現優秀。這得益於它的無關係性,數據庫的結構簡單。通常MySQL使用 Query Cache,每次表的更新Cache就失效,是一種大粒度的Cache,在針對web2.0的交互頻繁的應用,Cache性能不高。而NoSQL的 Cache是記錄級的,是一種細粒度的Cache,因此NoSQL在這個層面上來講就要性能高不少了。
靈活的數據模型
NoSQL無需事先爲要存儲的數據創建字段,隨時能夠存儲自定義的數據格式。而在關係數據庫裏,增刪字段是一件很是麻煩的事情。若是是很是大數據量的表,增長字段簡直就是一個噩夢。這點在大數據量的web2.0時代尤爲明顯。
高可用
NoSQL在不太影響性能的狀況,就能夠方便的實現高可用的架構。好比Cassandra,HBase模型,經過複製模型也能實現高可用。
6缺點
可是一些人認可,沒有正式的官方支持,萬一出了差錯會是可怕的,至少不少管理人員是這樣看。
「咱們確實須要作一些說服工做,但基本在他們看到咱們的第一個原型運行良好以後,咱們就可以說服他們,這是條正確的道路。」
此外,nosql並未造成必定標準,各類產品層出不窮,內部混亂,各類項目還需時間來檢驗
7開源軟件
Membase
Membase 是 NoSQL 家族的一個新的重量級的成員。Membase是開源項目,源代碼採用了Apache2.0的使用許可。該項目託管在GitHub.Source tarballs上,能夠下載beta版本的Linux二進制包。該產品主要是由North Scale的memcached核心團隊成員開發完成,其中還包括Zynga和NHN這兩個主要貢獻者的工程師,這兩個組織都是很大的在線遊戲和社區
網絡空間的供應商。
Membase容易安裝、操做,能夠從單節點方便的擴展到
集羣,並且爲memcached(有線協議的
兼容性)實現了
即插即用功能,在應用方面爲開 發者和經營者提供了一個比較低的門檻。作爲緩存解決方案,Memcached已經在不一樣類型的領域(特別是大容量的Web應用)有了普遍的使用,其中 Memcached的部分基礎代碼被直接應用到了Membase服務器的前端。
經過兼容多種編程語言和
框架,Membase具有了很好的複用性。在安裝和配置方面,Membase提供了有效的圖形化界面和
編程接口,包括可配置 的告警信息。
Membase的目標是提供對外的線性擴展能力,包括爲了增長集羣容量,能夠針對統一的
節點進行復制。 另外,對
存儲的數據進行再分配仍然是必要的。
這方面的一個有趣的特性是NoSQL解決方案所承諾的可預測的性能,類準確性的延遲和
吞吐量。經過以下方式能夠得到上面提到的特性:
◆ 可選的寫操做一一異步,同步(基於複製,持久化)
◆ 反向通道再平衡[將來考慮支持]
◆ 多線程低鎖爭用
◆ 動態再平衡現有集羣
◆ 經過把數據複製到多個
集羣單元和支持快速失敗轉移來提供系統的高可用性。
MongoDB
MongoDB是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。他支持的
數據結構很是鬆散,是相似json的bjson格式,所以能夠存儲比較複雜的
數據類型。Mongo最大的特色是他支持的查詢語言很是強大,其語法有點相似於
面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部分功能,並且還支持對數據創建索引。它的特色是高性能、易部署、易使用,存儲數據很是方便。
主要功能特性:
「面向集合」(Collenction-Oriented),意思是數據被分組存儲在數據集中,被稱爲一個集合(Collenction)。每一個 集合在數據庫中都有一個惟一的標識名,而且能夠包含無限數目的文檔。集合的概念相似
關係型數據庫(RDBMS)裏的表(table),不一樣的是它不須要定 義任何模式(schema)。
◆ 模式自由
模式自由(schema-free),意味着對於
存儲在mongodb數據庫中的文件,咱們不須要知道它的任何結構定義。若是須要的話,你徹底能夠把不一樣結構的文件存儲在同一個數據庫裏。
◆支持動態查詢
◆支持徹底索引,包含內部對象
◆支持查詢
◆支持複製和故障恢復
◆使用高效的二進制數據存儲,包括大型對象(如視頻等)
◆支持RUBY,PYTHON,JAVA,C++,PHP等多種語言
◆文件存儲格式爲BSON(一種JSON的擴展)
BSON(Binary Serialized document Format)
存儲形式是指:存儲在集合中的文檔,被存儲爲鍵-值對的形式。鍵用於惟一標識一個文檔,爲字符串類型,而值則能夠是各類複雜的文件類型。
◆可經過網絡訪問
MongoDB服務端可運行在Linux、Windows或OS X平臺,支持32位和64位應用,默認端口爲27017。推薦運行在64位平臺,由於MongoDB在32位模式運行時支持的最大文件尺寸爲2GB。
MongoDB把
數據存儲在文件中(默認路徑爲:/data/db),爲提升效率使用
內存映射文件進行管理。
Hypertable
Hypertable是一個開源、高性能、可伸縮的數據庫,它採用與Google的Bigtable類似的模型。在過去數年中,Google爲在PC集羣 上運行的可伸縮計算基礎設施設計建造了三個關鍵部分。第一個關鍵的基礎設施是Google File System(GFS),這是一個高可用的文件系統,提供了一個全局的命名空間。它經過跨機器(和跨機架)的文件數據複製來達到高可用性,並所以免受傳統 文件存儲系統沒法避免的許多失敗的影響,好比電源、內存和
網絡端口等失敗。第二個基礎設施是名爲Map-Reduce的計算框架,它與GFS緊密協做,幫 助處理收集到的海量數據。第三個基礎設施是Bigtable,它是
傳統數據庫的替代。Bigtable讓你能夠經過一些主鍵來組織海量數據,並實現高效的 查詢。Hypertable是Bigtable的一個開源實現,而且根據咱們的想法進行了一些改進。
Apache Cassandra
Apache Cassandra是一套開源分佈式Key-Value
存儲系統。它最初由Facebook開發,用於儲存特別大的數據。Facebook在使用此係統。
主要特性:
◆ 分佈式
◆ 基於column的結構化
◆ 高伸展性
Cassandra的主要特色就是它不是一個數據庫,而是由一堆數據庫節點共同構成的一個分佈式網絡服務,對Cassandra 的一個寫操做,會被複制到其餘節點上去,對Cassandra的讀操做,也會被
路由到某個節點上面去讀取。對於一個Cassandra羣集來講,擴展性能 是比較簡單的事情,只管在羣集裏面添加
節點就能夠了。
Cassandra是一個混合型的非關係的數據庫,相似於Google的BigTable。其主要功能比 Dynomite(分佈式的Key-Value存 儲系統)更豐富,但支持度卻不如文檔存儲MongoDB(介於關係數據庫和非關係數據庫之間的開源產品,是非關係數據庫當中功能最豐富,最像關係數據庫 的。Cassandra最初由Facebook開發,後轉變成了
開源項目。它是一個網絡社交
雲計算方面理想的數據庫。以Amazon專有的徹底分佈式的Dynamo爲基礎,結合了Google BigTable基於列族(Column Family)的數據模型。P2P去中心化的存儲。不少方面均可以稱之爲Dynamo 2.0。
CouchDB
所用語言: Erlang
特色:DB一致性,易於使用
使用許可: Apache
協議: HTTP/REST
雙向數據複製,持續進行或臨時處理,處理時帶衝突檢查,所以,採用的是master-master複製
MVCC – 寫操做不阻塞讀操做
可保存文件以前的版本
Crash-only(可靠的)設計
須要不時地進行數據壓縮
視圖:嵌入式 映射/減小
格式化視圖:列表顯示
支持進行服務器端文檔驗證
支持認證
根據變化實時更新
支持附件處理
所以, CouchApps(獨立的 js應用程序)
須要 jQuery程序庫
最佳應用場景:適用於數據變化較少,執行預約義查詢,進行數據統計的應用程序。適用於須要提供數據版本支持的應用程序。
例如:CRM、CMS系統。 master-master複製對於多站點部署是很是有用的。
和其餘數據庫比較,其突出特色是:
◆ 模式靈活 :使用Cassandra,像文檔存儲,你沒必要提早解決記錄中的字段。你能夠在系統運行時隨意的添加或移除字段。這是一個驚人的效率提高,特別是在大型部 署上。
◆ 真正的可擴展性 :Cassandra是純粹意義上的水平擴展。爲給集羣添加更多容量,能夠指向另外一臺電腦。你沒必要重啓任何進程,改變應用查詢,或手動遷移任何數據。
◆ 多數據中心識別 :你能夠調整你的節點佈局來避免某一個數據中心起火,一個備用的數據中心將至少有每條記錄的徹底複製。
◆ 範圍查詢 :若是你不喜歡所有的鍵值查詢,則能夠設置鍵的範圍來查詢。
◆ 列表數據結構 :在混合模式能夠將超級列添加到5維。對於每一個用戶的索引,這是很是方便的。
◆ 分佈式寫操做 :有能夠在任何地方任什麼時候間集中讀或寫任何數據。而且不會有任何單點失敗。