Hbase
是一個分佈式的、多版本、面向列的開源 KV
數據庫。運行在 HDFS
的基礎上,支持 PB
級別、百萬列的數據存儲。做爲性能如此強大的KV
數據庫,HBase
的存儲結構到底是怎樣的呢?面向列的存儲結構究竟有什麼樣的不一樣之處呢?接下來會詳細講解這部分。數據庫
爲了清晰地表述這個,咱們把HBase
的存儲結構分爲邏輯結構和物理結構兩個部分來描述。緩存
經過下圖直觀地展現 HBase
的邏輯存儲結構:服務器
在本圖中,列簇(Column Family
)對應的值就是 info
和 area
,列( Column
或者稱爲 Qualifier
)對應的就是 name
、 age
、 country
和 city
,Row key
對應的就是 Row 1
和 Row 2
,Cell
對應的就是具體的值。架構
Row key
:表的主鍵,按照字典序排序。HBase
中,列簇將表進行橫向切割。HBase
中能夠進行動態的添加。Cell
: 是指具體的 Value
。Version
:在這張圖裏面沒有顯示出來,這個是指版本號,用時間戳(TimeStamp
)來表示。看完這張圖,是否是有點疑惑,怎麼獲取其中的一條數據呢?既然 HBase
是 KV
的數據庫,那麼固然是以獲取 KEY
的形式來獲取到 Value
啦。在 HBase
中的 KEY
組成是這樣的:負載均衡
KEY
的組成是以 Row key
、CF(Column Family)
、Column
和 TimeStamp
組成的。分佈式
TimeStamp
在 HBase
中充當的做用就是版本號,由於在 HBase
中有着數據多版本的特性,因此同一個 KEY
能夠有多個版本的 Value
值(能夠經過配置來設置多少個版本)。查詢的話是默認取回最新版本的那條數據,可是也能夠進行查詢多個版本號的數據,在接下來的進階操做文章中會有演示。性能
Region Server
就是一個機器節點(服務器)Region Server
包含着多個 Region
Region
包含着多個列簇 (CF)
Region Server
中能夠有多張 Table
,一張 Table
能夠有多個 Region
先來看這張圖:3d
爲了避免混淆,咱們能夠先把如下的概念一一對應起來code
邏輯結構 | 物理結構 |
---|---|
Region Server | HRegion Server |
Region | HRegion |
CF | HStore(這裏指的是Store) |
在具體的物理結構中cdn
HRegion Server
就是一個機器節點,包含多個 HRegion
,可是這些 HRegion
不必定是來自於同一個 Table
,負責響應的是用戶的 IO
請求,和 HDFS
進行交互,是服務器中的一個進程。HRegion
包含多個 HStore
。CF
組成一個 HStore
,默認是 10 G
,若是大於 10G
會進行分裂。HStore
是 HBase
的核心存儲單元,一個 HStore
由 MemStore
和 StoreFile
組成。MemStore
是一塊內存,默認大小是 128M
,若是超過了這個大小,那麼就會進行刷盤,把內存裏的數據刷進到 StoreFile
中。HStore
對應着的是 Table
裏面的 Column Family
,無論有 CF
中有多少的數據,都會存儲在 HStore
中,爲了不訪問不一樣的 HStore
而致使的效率低下。HRegion
是 Hbase
中分佈式存儲和負載均衡的最小單元,但不是存儲的最小單元。Hstore
能夠有多個 StoreFile
從不一樣的 CF
中查詢 Row 3
主鍵的數據,結果集以下:
更加直觀地顯示,在 HBase
中是以 CF
爲單元的存儲結構。
以下圖,HBase
的架構圖,在 HBase
中咱們看到有 Client
、Zookeeper
、HMaster
和 HRegion
。
Client
是客戶端,要求讀寫數據的發起者。ZK
集羣是負責轉發 Client
的請求和提供心跳機制,會讓 HRegion Server
和 HRegion
註冊進來,同時保存着 Rowkey
和 Region
的映射關係。HMaster
中能夠有多個待命,只有一個在活躍。Client
請求讀取數據時,先轉發到 ZK
集羣,在 ZK
集羣中尋找到相對應的 Region Server
,再找到對應的 Region
,先是查 MemStore
,若是在 MemStore
中獲取到數據,那麼就會直接返回,不然就是再由 Region
找到對應的 Store File
,從而查到具體的數據。
在整個架構中,HMaster
和 HRegion Server
能夠是同一個節點上,能夠有多個 HMaster
存在,可是隻有一個 HMaster
在活躍。
在 Client
端會進行 rowkey
-> HRegion
映射關係的緩存,下降下次尋址的壓力。
先是 Client
進行發起數據的插入請求,若是 Client
自己存儲了關於 Rowkey
和 Region
的映射關係的話,那麼就會先查找到具體的對應關係,若是沒有的話,就會在ZK
中進行查找到對應 Region server
,而後再轉發到具體的 Region
上。全部的數據在寫入的時候先是記錄在 WAL
中,同時檢查關於 MemStore
是否滿了,若是是滿了,那麼就會進行刷盤,輸出到一個 Hfile
中,若是沒有滿的話,那麼就是先寫進 Memstore
中,而後再刷到 WAL
中。
PS:畫圖的過程是真滴累啊!!!
題圖:chichimaru