什麼是NoSQL
NoSQL,指的是非關係型的資料庫。隨著網際網路web2.0網站的興起,傳統的關聯式資料庫在應付web2.0網站,特別是超大規模和高併發的SNS型別的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關係型的資料庫則由於其本身的特點得到了非常迅速的發展。
簡介
NoSQL(NoSQL = Not Only SQL ),意即反SQL運動,是一項全新的資料庫革命性運動,早期就有人提出,發展至2009年趨勢越發高漲。NoSQL的擁護者們提倡運用非關係型的資料儲存,相對於目前鋪天蓋地的關係型資料庫運用,這一概念無疑是一種全新的思維的注入。
現今狀況
現今的計算機體系結構在資料儲存方面要求具備龐大的水平擴充套件性①,而NoSQL致力於改變這一現狀。目前Google的 BigTable 和Amazon 的Dynamo使用的就是NoSQL型資料庫。
NoSQL專案的名字上看不出什麼相同之處,但是,它們通常在某些方面相同:它們可以處理超大量的資料。
這場革命目前仍然需要等待。的確,NoSQL對大型企業來說還不是主流,但是,一兩年之後很可能就會變個樣子。在NoSQL運動的最新一次聚會中,來自世界各地的150人擠滿了CBS Interactive的一間會議室。分享他們如何推翻緩慢而昂貴的關聯式資料庫的暴政,怎樣使用更有效和更便宜的方法來管理資料。
“關係型資料庫給你強加了太多東西。它們要你強行修改物件資料,以滿足RDBMS (relational database management system,關係型資料庫管理系統)的需要,”在NoSQL擁護者們看來,基於NoSQL的替代方案“只是給你所需要的”。
①水平擴充套件性(horizontal scalability)指能夠連線多個軟硬體的特性,這樣可以將多個伺服器從邏輯上看成一個實體。
我們為什麼要使用NOSQL非關聯式資料庫?
隨著網際網路web2.0網站的興起,非關係型的資料庫現在成了一個極其熱門的新領域,非關聯式資料庫產品的發展非常迅速。而傳統的關聯式資料庫在應付web2.0網站,特別是超大規模和高併發的SNS型別的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,例如:
1、High performance - 對資料庫高併發讀寫的需求
web2.0網站要根據使用者個性化資訊來實時生成動態頁面和提供動態資訊,所以基本上無法使用動態頁面靜態化技術,因此資料庫併發負載非常高,往往要達到每秒上萬次讀寫請求。關聯式資料庫應付上萬次SQL查詢還勉強頂得住,但是應付上萬次SQL寫資料請求,硬碟IO就已經無法承受了。其實對於普通的BBS網站,往往也存在對高併發寫請求的需求。
2、Huge Storage - 對海量資料的高效率儲存和訪問的需求
對於大型的SNS網站,每天使用者產生海量的使用者動態,以國外的Friendfeed為例,一個月就達到了2.5億條使用者動態,對於關聯式資料庫來說,在一張2.5億條記錄的表裡面進行SQL查詢,效率是極其低下乃至不可忍受的。再例如大型web網站的使用者登入系統,例如騰訊,盛大,動輒數以億計的帳號,關聯式資料庫也很難應付。
3、High Scalability && High Availability- 對資料庫的高可擴充套件性和高可用性的需求
在基於web的架構當中,資料庫是最難進行橫向擴充套件的,當一個應用系統的使用者量和訪問量與日俱增的時候,你的資料庫卻沒有辦法像web server和app server那樣簡單的通過新增更多的硬體和服務節點來擴充套件效能和負載能力。對於很多需要提供24小時不間斷服務的網站來說,對資料庫系統進行升級和擴充套件是非常痛苦的事情,往往需要停機維護和資料遷移,為什麼資料庫不能通過不斷的新增伺服器節點來實現擴充套件呢?
在上面提到的“三高”需求面前,關聯式資料庫遇到了難以克服的障礙,而對於web2.0網站來說,關聯式資料庫的很多主要特性卻往往無用武之地,例如:
1、資料庫事務一致性需求
很多web實時系統並不要求嚴格的資料庫事務,對讀一致性的要求很低,有些場合對寫一致性要求也不高。因此資料庫事務管理成了資料庫高負載下一個沉重的負擔。
2、資料庫的寫實時性和讀實時性需求
對關聯式資料庫來說,插入一條資料之後立刻查詢,是肯定可以讀出來這條資料的,但是對於很多web應用來說,並不要求這麼高的實時性。
3、對複雜的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與關係型資料庫設計理念比較
關係型資料庫中的表都是儲存一些格式化的資料結構,每個元組欄位的組成都一樣,即使不是每個元組都需要所有的欄位,但資料庫會為每個元組分配所有的欄位,這樣的結構可以便於表與表之間進行連線等操作,但從另一個角度來說它也是關係型資料庫效能瓶頸的一個因素。而非關係型資料庫以鍵值對儲存,它的結構不固定,每一個元組可以有不一樣的欄位,每個元組可以根據需要增加一些自己的鍵值對,這樣就不會侷限於固定的結構,可以減少一些時間和空間的開銷。
特點
它們可以處理超大量的資料。
它們執行在便宜的PC伺服器叢集上。
PC叢集擴充起來非常方便並且成本很低,避免了“sharding”操作的複雜性和成本。
它們擊碎了效能瓶頸。
NoSQL的支持者稱,通過NoSQL架構可以省去將Web或Java應用和資料轉換成SQL友好格式的時間,執行速度變得更快。
“SQL並非適用於所有的程式程式碼,” 對於那些繁重的重複操作的資料,SQL值得花錢。但是當資料庫結構非常簡單時,SQL可能沒有太大用處。
沒有過多的操作。
雖然NoSQL的支持者也承認關聯式資料庫提供了無可比擬的功能集合,而且在資料完整性上也發揮絕對穩定,他們同時也表示,企業的具體需求可能沒有那麼多。
Bootstrap支援
因為NoSQL專案都是開源的,因此它們缺乏供應商提供的正式支援。這一點它們與大多數開源專案一樣,不得不從社群中尋求支援。
缺點
但是一些人承認,沒有正式的官方支援,萬一出了差錯會是可怕的,至少很多管理人員是這樣看。
“我們確實需要做一些說服工作,但基本在他們看到我們的第一個原型執行良好之後,我們就能夠說服他們,這是條正確的道路。”
此外,nosql並未形成一定標準,各種產品層出不窮,內部混亂,各種專案還需時間來檢驗。
NoSQL資料庫開源軟體
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-Orented),意思是資料被分組儲存在資料集中,被稱為一個集合(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(介於關聯式資料庫和非關聯式資料庫之間的開源產品,是非關聯式資料庫當中功能最豐富,最像關聯式資料庫 的。支援的資料結構非常鬆散,是類似json的bjson格式,因此可以儲存比較複雜的資料型別。)Cassandra最初由Facebook開發,後轉變成了開源專案。它是一個網路社交雲端計算方面理想的資料庫。以Amazon專有的完全分散式的Dynamo為基礎,結合了Google BigTable基於列族(Column Family)的資料模型。P2P去中心化的儲存。很多方面都可以稱之為Dynamo 2.0。
和其他資料庫比較,其突出特點是:
◆ 模式靈活 :使用Cassandra,像文件儲存,你不必提前解決記錄中的欄位。你可以在系統執行時隨意的新增或移除欄位。這是一個驚人的效率提升,特別是在大型部 署上。
◆ 真正的可擴充套件性 :Cassandra是純粹意義上的水平擴充套件。為給叢集新增更多容量,可以指向另一臺電腦。你不必重啟任何程式,改變應用查詢,或手動遷移任何資料。
◆ 多資料中心識別 :你可以調整你的節點佈局來避免某一個資料中心起火,一個備用的資料中心將至少有每條記錄的完全複製。
◆ 範圍查詢 :如果你不喜歡全部的鍵值查詢,則可以設定鍵的範圍來查詢。
◆ 列表資料結構 :在混合模式可以將超級列新增到5維。對於每個使用者的索引,這是非常方便的。
◆ 分散式寫操作 :有可以在任何地方任何時間集中讀或寫任何資料。並且不會有任何單點失敗。
相關文章
- MySQL、NoSQL分別是什麼?有什麼區別?MySql
- 初識Redis之NoSQL+RDBMS演化史+什麼是NoSQLRedisSQL
- 什麼是NoSQL?這裡給你整明白SQL
- 面試官:說說你對NoSQL的瞭解,為什麼要有NoSQL面試SQL
- postgresql是nosql嗎SQL
- NoSQL為什麼需要模式自由的ETL工具 ?SQL模式
- 為什麼NoSQL資料庫這麼受歡迎?SQL資料庫
- 什麼是cookie,什麼是sessionCookieSession
- 這是什麼這是什麼
- 什麼是分而治之?什麼是WBS?
- 什麼是DNS,什麼是HostsDNS
- 什麼是WebAuthn、FIDO 是什麼?Web
- ###什麼是Linux核心###什麼是MMULinux
- ITIL是什麼意思?ITIL是什麼?
- 5G時代,為什麼NoSQL和SQL存在短板?SQL
- SNP全稱是什麼? SNP是什麼公司? SNP是什麼意思?
- NoSQL——not onlySQL不僅僅是SQLSQL
- 人是什麼?人生是什麼?人為什麼會變?
- 為什麼SQL正在擊敗NoSQL,這對未來的資料意味著什麼SQL
- ftp是什麼,ftp是什麼東西?FTP
- 什麼是正向代理?什麼是反向代理?
- NLA是什麼?NLA的原理是什麼?
- Java是什麼_Java是做什麼的?Java
- 什麼是this
- 為什麼要有 Servlet ,什麼是 Servlet 容器,什麼是 Web 容器?ServletWeb
- 什麼是框架?為什麼說 Angular 是框架?框架Angular
- IDFA、IMEI、OAID 是什麼,區別是什麼AI
- GNU是什麼?和Linux是什麼關係?Linux
- 什麼是SSRF攻擊?SSRF用途是什麼?
- 什麼是API介面,具體是什麼意思?API
- DRBD是什麼意思?優缺點是什麼?
- 什麼是塊元素?什麼是行內元素?
- 什麼是Tornado?它的特點是什麼?
- nginx 是什麼,能幹什麼?Nginx
- 什麼是zoom?它有什麼作用?OOM
- 什麼是NLA,它有什麼用?
- 什麼是Django?有什麼用途?Django
- AI三重問:什麼是AI?什麼是AI模型?什麼是AI大模型?AI大模型