《HBase 不睡覺》第一章 - 初識 HBase

《HBase 不睡覺書》是一本讓人看了不會睡着的HBase技術書籍,寫的很是不錯,爲了加深記憶,決定把書中重要的部分整理成讀書筆記,便於後期查閱,同時但願爲初學 HBase 的同窗帶來一些幫助。數據庫

目錄

1、基本概念

一、CAP 理論

CAP 全稱 是Consistency Availability and Partition tolerance:編程

  • Consistency(一致性):數據一致更新,全部數據變更都是同步的;
  • Availability(可用性):良好的響應性能;
  • Partition tolerance(分區容錯性):可靠性。

任何分佈式系統只可同時知足二點,無法三者兼顧。架構師不要將精力浪費在如何設計能知足三者的完美分佈式系統,而是應該進行取捨。緩存

CAP 理論

二、NoSQL

不少人以 爲 NoSQL 是非 SQL 的意思,其實它是 Not Only SQL 的縮寫,意思是不僅是 SQL。與關係型數據庫正好相反,非關係型數據庫 NoSQL 對事務性的要求並不嚴格,甚至能夠說是至關馬虎。服務器

有些數據庫是保證最終一致性,信息不會當即同步,而是通過了一段時間才達到一致性。好比你發了一篇文章,你的一部分朋友立馬看到了這篇文章,另外一部分朋友卻要等到 5 分鐘以後才能刷出這篇文章。架構

雖然有延時,可是對於一個娛樂性質的 Web 2.0 網站又有誰會在意這幾分鐘的延時呢?若是你用傳統關係型數據庫,網站可能早就宕掉了。併發

有些數據庫能夠在部分機器宕機的狀況下依然能夠正常運行,其實原理就是把同一份數據複製成了好幾份放到了好幾個地方,正應了那句老話:不要把雞蛋同時放在一個籃子裏。負載均衡

Not Only SQL

三、列式存儲與行式存儲

列式存儲(Column-based)是相對於傳統關係型數據庫的行式存儲(Row-based)來講的,簡單來講二者的區別就是如何組織表。分佈式

將表放入存儲系統中有兩種方法,而咱們絕大部分是採用行存儲的。行存儲法是將各行放入連續的物理位置,這很像傳統的記錄和文件系統。列存儲法是將數據按照列存儲到數據庫中,與行存儲相似,下圖是兩種存儲方法的圖形化解釋。oop

列式、行式存儲模型

應用行式存儲的數據庫系統稱爲行式數據庫,同理應用列式存儲的數據庫系統稱爲列式數據庫。post

列式、行式數據庫的區別

列式存儲的主要優勢之一就是能夠大幅下降系統的 I/O,尤爲是在海量數據查詢時,經過下面這張圖,相信咱們可以完全明白這一點。

列存儲能夠大幅下降系統的 I/O

2、何時使用 HBase?

HBase 的存儲是基於 Hadoop 的,Hadoop 實現了一個分佈式文件系統(HDFS)。HDFS 有高容錯性的特色,被設計用來部署在低廉的硬件上,並且它提供高吞吐量以訪問應用程序的數據,適合那些有着超大數據集的應用程序。基於 Hadoop 意味着 HBase 與生俱來的超強的擴展性和吞吐量

HBase 採用的是 Key/Value 的存儲方式,這意味着,即便隨着數據量增大,也幾乎不會致使查詢的性能降低。

HBase 又是一個列式數據庫,當你的表字段不少的時候,你甚至能夠把其中幾個字段放在集羣的一部分機器上,而另外幾個字段放到另一部分機器上,充分分散了負載壓力。

然而,如此複雜的存儲結構和分佈式的存儲方式帶來的代價就是:哪怕只是存儲少許數據,它也不會很快。因此我經常跟人說:HBase 並不快,只是當數據量很大的時候它慢的不明顯

不適合使用 HBase 的場景:

  • 主要需求是數據分析,好比作報表。
  • 單表數據量不超過千萬。

適合使用 HBase 的場景:

  • 單表數據量超千萬,並且併發還挺高。
  • 數據分析需求較弱,或者不須要那麼靈活或者實時

3、HBase 部署架構

一、部署架構

HBase 有兩種服務器:Master 服務器和 RegionServer 服務器,通常一個 HBase 集羣有一個 Master 服務器和多個 RegionServer 服務器。

Master 服務器負責維護表結構信息,實際的數據都存儲在 RegionServer 服務器上,RegionServer 是直接負責存儲數據的服務器,RegionServer 保存的表數據直接存儲在 Hadoop 的 HDFS 上。

HBase 有一點很特殊:客戶端獲取數據由客戶端直連 RegionServer 的,因此當 Master 掛掉以後你依然能夠查詢數據,只是喪失了表管理相關的能力。

RegionServer 很是依賴 ZooKeeper 服務,能夠說沒有 ZooKeeper 就沒有 HBase。ZooKeeper 管理了 HBase 全部 RegionServer 的信息,包括具體的數據段存放在哪一個 RegionServer 上。客戶端每次與 HBase 鏈接,其實都是先與 ZooKeeper 通訊,查詢出哪一個 RegionServer 須要鏈接,而後再鏈接 RegionServer。

HBase 總體架構

二、Region

Region 就是一段數據的集合,HBase 中的表通常擁有一個到多個 Region,Region 有如下特性:

  • Region 不能跨服務器,一個 RegionServer 上有一個或者多個 Region;
  • 數據量小的時候,一個 Region 足以存儲全部數據;可是,當數據量大的時候,HBase 會拆分 Region;
  • 當 HBase 在進行負載均衡的時候,也有可能會從一臺 RegionServer 上把 Region 移動到另外一臺 RegionServer 上;
  • Region 是基於 HDFS 的,它的全部數據存取操做都是調用了 HDFS 的客戶端接口來實現的。

三、RegionServer

RegionServer 就是存放 Region 的容器,直觀上說就是服務器上的一個服務。通常來講,一個服務器只會安裝一個 RegionServer 服務。當客戶端從 ZooKeeper 獲取 RegionServer 的地址後,它會直接從 RegionServer 獲取數據。

四、Master

HBase 中 Master 的角色不像領導,更像是打雜的。客戶端從 ZooKeeper 獲取了 RegionServer 的地址後,會直接從 RegionServer 獲取數據。其實不光是獲取數據,包括插入、刪除等全部的數據操做都是直接操做 RegionServer,而不須要通過 Master。

Master 只負責各類協調工做,好比建表、刪表、移動 Region、合併等操做。它們的共性就是須要跨 RegionServer,這些操做由哪一個 RegionServer 來執行都不合適,因此 HBase 就將這些操做放到了Master上了。

這種結構的好處是大大下降了集羣對 Master 的依賴,而 Master 節點通常只有一個到兩個,一旦宕機,若是集羣對 Master 的依賴度很大,那麼就會產生單點故障問題。在 HBase 中,即便 Master 宕機了,集羣依然能夠正常地運行,依然能夠存儲和刪除數據。

4、HBase 存儲架構

一、存儲架構

最基本的存儲單位是列(column),一個列或者多個列造成一行(row)。傳統數據庫是嚴格的行列對齊,好比這行有三個列 a、b、c,下一行確定也有三個列 a、b、c。而在 HBase 中,這一行有三個列 a、b、c,下一個行也許是有 4 個列 a、e、f、g。

在 HBase 中,行跟行的列能夠徹底不同,這個行的數據跟另一個行的數據也能夠存儲在不一樣的機器上,甚至同一行內的列也能夠存儲在徹底不一樣的機器上!每一個行(row)都擁有惟一的行鍵(row key)來標定這個行的惟一性。每一個列都有多個版本,多個版本的值存儲在單元格(cell)中,若干個列又能夠被歸類爲一個列族

HBase 列存儲

二、行鍵(rowkey)

rowkey 是由用戶指定的一串不重複的字符串,rowkey 會直接決定這個 row 的存儲位置的。HBase 中沒法根據某個 column 來排序,系統永遠是根據 rowkey 來排序的(根據字典排序),rowkey 就是決定 row 存儲順序的惟一憑證。

若是插入 HBase 的時候,不當心用了以前已經存在的 rowkey,這會把以前存在的那個 row 更新掉。以前已經存在的值會被放到這個單元格的歷史記錄裏面,並不會丟掉,只是你須要帶上版本參數才能夠找到這個值。一個列上能夠存儲多個版本的單元格(cell),單元格就是數據存儲的最小單元。

三、列族(column family)

若干列能夠組成列族(column family),建表的時候有幾個列族是一開始就定好的。表的不少屬性,好比過時時間、數據塊緩存以及是否壓縮等都是定義在列族上,而不是定義在表上或者列上。

同一個表裏的不一樣列族能夠有徹底不一樣的屬性配置,可是同一個列族內的全部列都會有相同的屬性,由於他們都在一個列族裏面,而屬性都是定義在列族上的。一個沒有列族的表是沒有意義的,由於列必須依賴列族而存在。

列名稱的規範是列族:列名,好比 brother:age、brother:name。列族存在的意義是:HBase 會把相同列族的列儘可能放在同一臺機器上,若是想讓某幾個列被放到一塊兒,你就給他們定義相同的列族。

一個表要設置多少個列族比較合適?官方的建議是:越少越好(通常來講一個就夠用了),由於 HBase 並不但願你們指定太多的列族。列族太多會極大程度地下降數據庫性能;此外,列族定得太多,容易出 BUG。

四、單元格(cell)

一個列上能夠存儲多個版本的值,多個版本的值被存儲在多個單元格里面,多個版本之間用版本號(Version)來區分,惟一肯定一條結果的表達式應該是:行鍵:列族:列:版本號(rowkey:column family:column:version)。不過,版本號是能夠省略的,若是你不寫版本號,HBase 默認返回最後一個版本的數據。

HBase 存儲結構

一個 Region 就是多個行(Row)的集合,在 Region 中行的排序按照行鍵(rowkey)字典排序。

5、總結

一、HBase 與關係型數據庫的功能對比

HBase 與關係型數據庫的功能對比

二、主要概念回顧

  • Maser
  • RegionServer
  • HDFS
  • Client
  • ZooKeeper
  • Region
  • Row
  • Rowkey
  • Column Family
  • Column
  • Cell

若是看到這些詞語,你能回想起它們之間的關係,那麼,恭喜你已邁入 HBase 的大門。

三、參考文檔


Any Code,Code Any!

掃碼關注『AnyCode』,編程路上,一塊兒前行。

相關文章
相關標籤/搜索