什么是nosql
NoSQL(NoSQL = Not Only SQL),意思是不僅僅是SQL的擴展,一般指的是非關系型的數據庫。
隨着互聯網web2.0網站的興起,傳統的關系數據庫在應付web2.0網站,特別是超大規模和高並發的SNS類型的web2.0純動態網站已經顯得力不從心,傳統的電信行業動輟就千萬甚至上億的數據,甚至有客戶提出需要存儲相關的日志數據50年以上,暴露了很多難以克服的問題,而非關系型的數據庫則由於其本身的特點得到了非常迅速的發展。
關系型數據庫難以克服的問題:
- 不能很好處理對數據庫高並發讀寫的需求
- 不能很好處理對海量數據的高效率存儲和訪問的需求
- 不能很好處理對數據庫的高可擴展性和高可用性的需求
為什么使用nosql
SQL語言和關系型數據庫(MySQL、PostgreSQL、Oracle等)是通用的數據解決方案,占有絕大多數的市場。但是就像上面提到的,它有很多難以解決的問題。不過在最近興起的NoSQL運動中,涌現出一批具備高可用性、支持線性擴展、支持Map/Reduce操作等特性的數據產品,它們具有如下特性:
- 頻繁的寫入操作、相對較少的讀取統計信息的操作
- 海量數據(如數據倉庫中需要分析的數據)適合存儲在一個結構松散、分布式的文件存儲系統中
- 存儲二進制文件(如mp3或者pdf文檔)並且能夠直接為用戶的瀏覽器提供下載功能
使用這些數據產品並不是要取代原有的數據產品,而是為不同的應用場景提供更多的選擇。也就是說,在一些特定的情況下如果是關系型的數據庫解決不了的問題,那么就可以考慮使用nosql,而不是說完全將應用移植到nosql上,畢竟適合才是最好的。
現在流行的nosql
下面對現在的nosql進行了整理,其中包括各種nosql的官方網站。
HBase是什么
HBase是Apache Hadoop中的一個子項目,Hbase依托於Hadoop的HDFS作為最基本存儲基礎單元,通過使用hadoop的DFS工具就可以看到這些這些數據 存儲文件夾的結構,還可以通過Map/Reduce的框架(算法)對HBase進行操作,如下圖所示:
HBase在產品中還包含了Jetty,在HBase啟動時采用嵌入式的方式來啟動Jetty,因此可以通過web界面對HBase進行管理和查看當前運行的一些狀態,非常輕巧方便。
HBase是Apache Hadoop中的一個子項目,現已成為Apache的頂級項目。
HBase是Google Bigtable(基於Google File System)的開源山寨版本。
為什么采用HBase
HBase 不同於一般的關系數據庫,它是一個適合於非結構化數據存儲的數據庫.所謂非結構化數據存儲就是說HBase是基於列的而不是基於行的模式,這樣方便讀寫你的大數據內容。
HBase是介於Map Entry(key & value)和DB Row之間的一種數據存儲方式。就點有點類似於現在流行的Memcache,但不僅僅是簡單的一個key對應一個 value,你很可能需要存儲多個屬性的數據結構,但沒有傳統數據庫表中那么多的關聯關系,這就是所謂的松散數據。
簡單來說,你在HBase中的表創建的可以看做是一張很大的表,而這個表的屬性可以根據需求去動態增加,在HBase中沒有表與表之間關聯查詢。你只需要 告訴你的數據存儲到Hbase的那個column families 就可以了,不需要指定它的具體類型:char,varchar,int,tinyint,text等等。但是你需要注意HBase中不包含事務此類的功能。
Apache HBase 和Google Bigtable 有非常相似的地方,一個數據行擁有一個可選擇的鍵和任意數量的列。表是疏松的存儲的,因此用戶可以給行定義各種不同的列,對於這樣的功能在大項目中非常實用,可以簡化設計和升級的成本。
HBase的存儲結構
HBase 是基於列的數據庫,讓我們看一下關系型數據庫和hbase數據庫存儲的對比。
行式存儲和列式存儲對比:
行式存儲
- 數據是按行存儲的
- 沒有索引的查詢使用大量I/O
- 建立索引和物化視圖需要花費大量時間和資源
- 面對查詢的需求,數據庫必須被大量膨脹才能滿足性能要求
列式存儲
數據按列存儲——每一列單獨存放
數據即是索引
只訪問查涉及的列——大量降低系統IO
每一列由一個線索來處理——查詢的並發處理
數據類型一致,數據特征相似——高效壓縮
HBase與關系型數據庫的對比
HBase 是基於
下面的表格中hbase和RDBMS的對比關系
HBase |
RDBMS |
|
數據類型 |
只有字符串 |
豐富的數據類型 |
數據操作 |
簡單的增刪改查 |
各種各樣的函數,表連接 |
存儲模式 |
基於列存儲 |
基於表格結構和行存儲 |
數據保護 |
更新后舊版本仍然會保留 |
替換 |
可伸縮性 |
輕易的進行增加節點,兼容性高 |
需要中間層,犧牲功能 |