爲什麼需要用非關係型數據庫(NOSQL)?

爲什麼需要NOSQL

隨着互聯網web2.0網站的興起,非關係型的數據庫現在成了一個極其熱門的新領域,非關係數據庫產品的發展非常迅速。而傳統的關係數據庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,例如:
  
  1、High performance——對數據庫高併發讀寫的需求
  
  Web2.0網站要根據用戶個性化信息來實時生成動態頁面和提供動態信息,所以基本上無法使用動態頁面靜態化技術,因此數據庫併發負載非常高,往往要達到每秒上萬次讀寫請求。關係數據庫應付上萬次SQL查詢還勉強頂得住,但是應付上萬次SQL寫數據請求,硬盤IO就已經無法承受了。其實對於普通的BBS網站,往往也存在對高併發寫請求的需求,例如像JavaEye網站的實時統計在線用戶狀態,記錄熱門帖子的點擊次數,投票計數等,因此這是一個相當普遍的需求。
  
  2、Huge Storage——對海量數據的高效率存儲和訪問的需求
  
  類似Facebook,twitter,Friendfeed這樣的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應用來說,並不要求這麼高的實時性,比方說我(JavaEye的robbin)發一條消息之後,過幾秒乃至十幾秒之後,我的訂閱者纔看到這條動態是完全可以接受的。
  
  3、對複雜的SQL查詢,特別是多表關聯查詢的需求
  
  任何大數據量的web系統,都非常忌諱多個大表的關聯查詢,以及複雜的數據分析類型的複雜SQL報表查詢,特別是SNS類型的網站,從需求以及產品設計角度,就避免了這種情況的產生。往往更多的只是單表的主鍵查詢,以及單表的簡單條件分頁查詢,SQL的功能被極大的弱化了。
  
  因此,關係數據庫在這些越來越多的應用場景下顯得不那麼合適了,爲了解決這類問題的非關係數據庫應運而生,現在這兩年,各種各樣非關係數據庫,特別是鍵值數據庫(Key-Value Store DB)風起雲湧,多得讓人眼花繚亂。例如:
  Cassandra,Voldemort,MongoDB,Dynomite,HBase,CouchDB,Hypertable, Riak,Tin, Flare, Lightcloud, KiokuDB,Scalaris, Kai, ThruDB。。。

什麼是NOSQL

NoSQL(NoSQL = Not Only SQL),意即“不僅僅是SQL”,是一項全新的數據庫理念,泛指非關係型的數據庫。

非關係型數據庫與關係型數據庫的區別:

  1. 關係型數據庫的數據是存儲在硬盤中,而非關係型數據的數據是存儲在內存中

  2. 關係型數據庫有固定的數據模型,也就是說事先要定義好表

  3. 關係型數據庫的表與表之間有關係:一對一、一對多、多對多

  4. 非關係型數據庫存儲的數據結構非常簡單,不能事先定義好表,都是以"鍵值對"類型的數據進行存儲

主流的NOSQL產品

 

  • 鍵值(Key-Value)存儲數據庫

    相關產品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB

    典型應用: 內容緩存,主要用於處理大量數據的高訪問負載。

    數據模型: 一系列鍵值對

    優勢: 快速查詢

    劣勢: 存儲的數據缺少結構化

  • 列存儲數據庫

    相關產品:Cassandra, HBase, Riak

    典型應用:分佈式的文件系統

    數據模型:以列簇式存儲,將同一列數據存在一起

    優勢:查找速度快,可擴展性強,更容易進行分佈式擴展

    劣勢:功能相對侷限

  • 文檔型數據庫

    相關產品:CouchDB、MongoDB

    典型應用:Web應用(與Key-Value類似,Value是結構化的)

    數據模型: 一系列鍵值對

    優勢:數據結構要求不嚴格

    劣勢: 查詢性能不高,而且缺乏統一的查詢語法

  • 圖形(Graph)數據庫

    相關數據庫:Neo4J、InfoGrid、Infinite Graph

    典型應用:社交網絡

    數據模型:圖結構

    優勢:利用圖結構相關算法。

    劣勢:需要對整個圖做計算才能得出結果,不容易做分佈式的集羣方案。

NOSQL的特點

  1. 數據存放在內存中(但是它會在後臺定期地將數據備份到硬盤中)

  2. 沒有固定的數據結構(不用事先定義好表)

在大數據存取上具備關係型數據庫無法比擬的性能優勢,例如:

  • 易擴展

    NoSQL數據庫種類繁多,但是一個共同的特點都是去掉關係數據庫的關係型特性。數據之間無關係,這樣就非常容易擴展。也無形之間,在架構的層面上帶來了可擴展的能力。

  • 大數據量,高性能

    NoSQL數據庫都具有非常高的讀寫性能,尤其在大數據量下,同樣表現優秀。這得益於它的無關係性,數據庫的結構簡單。

  • 靈活的數據模型

    NoSQL無需事先爲要存儲的數據建立字段,隨時可以存儲自定義的數據格式。而在關係數據庫裏,增刪字段是一件非常麻煩的事情。如果是非常大數據量的表,增加字段簡直就是一個噩夢。這點在大數據量的Web2.0時代尤其明顯。

  • 高可用

    NoSQL在不太影響性能的情況,就可以方便的實現高可用的架構。比如Cassandra,HBase模型,通過複製模型也能實現高可用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章