1:什么是HBase
HBase是一個高可靠性,高性能,面向列,可伸縮的分布式數據庫,提供海量數據存儲功能,一個結構化的分布式存儲系統,不同於一般的關系型數據庫,它適合半結構化和非結構化數據存儲。
2:HBase表的特點
大:一個表中可以有數十億行,上百萬列
無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要動態的增加,同一張表中不同的行可以有截然不同的列
面向列:面向列存儲和權限控制
稀疏:空列並不占用存儲空間,可以設計的非常稀疏
數據多版本:每個單元中的數據可以有多個版本,默認情況下版本號自動分配,是單元格插入的時間戳
數據類型單一:Hbase中的數據都是字符串,沒有類型
3:HBase架構
HBase由client,zookeeper,HMaster,HRegionServer,HRegion以及StoreFile和HFile組成
Client
是HBase的接口,並維護cache來加快對HBase的訪問,client不是直接和HMaster直接通信,而是和ZooKeeper,通過Zookeeper返回HRegionServer,在client去找對應的HRegionServer
HMaster是主節點
HMaster進程負責管理所有的RegionServer,包括新的RegionServer的注冊,RegionServer的故障切換處理。負責RegionServer的負載均衡。發現失效的RegionServer並重新分配其上的Region。管理用戶對table的增刪改查工作。GFS上的垃圾文件回收。處理Schema更新請求.
Zookeeper
保證任何時候集群只有一個Master。存儲region的尋址入口。實現監控RegionServer的上線和下線信息,並實現通知給Master。存儲HBase的schma和table元數據.
HRegion Server
HRegionServer是HBase的從點,它負責提供表數據讀寫等服務,是數據存儲和計算單元。一台HRegionServer管理多個Region和一個Hlog
Region Server負責維護Master分配給它的Region,處理對這些Region的IO請求
Region Server負責切分在運行過程中變得過大的Region
Region
一個region由一個或多個store組成,每個store存儲該region一個列簇的數據,一個store包含一個memstore緩存以及若干StoreFile文件,Memstore緩存客戶端向region插入的數據,當HregionServer中的Memstore大小達到配置容量上限時,RegionServer會將Memstore中的數據刷新(flush)到HDFS中,成為Hfile。
Region是將一個數據表按Key值范圍橫向划分為一個個的子表,實現分布式存儲
Region分為元數據Region以及用戶Region兩類
元數據Region也叫Meta Region,記錄了每個Region的路由信息,每個子表的存放位置,起始Key值,元數據Region存放在Root表中,Root表則存放在Zookeeper中
讀取Region數據的路由需要以下幾步
1:在Zookeeper只查找Meta Region的地址
2:再由Meta Region中尋找User Region的地址
Zookeeper(HMaster選舉流程)
主備Master同時向ZooKeeper注冊自己的節點信息,誰先寫入,誰就是主節點
注冊寫入時會查詢有沒有相對應的節點,如果有,這個HMaster查看主節點是誰,如果主Master有相對應的節點並且實時更新了,那么這個HMaster就會自動作為備節點,進入休眠狀態
備節點會實時監聽ZooKeeper的狀態主節點的信息
在系統開始時,主備節點都會向Zookeeper里面創建一個目錄,比如叫HBase,在目錄中寫入節點信息,創建之前先去查詢里面有沒有這個目錄以及目錄里面文件的時間戳信息與當前節點的時間戳信息做對比,如果對比超過了5秒鍾,那說明這個節點已經損壞了主節點每隔一秒更新下時間戳,備節點每隔一秒去查詢下時間戳,當主節點宕機時,時間戳沒更新,備節點查詢超過5秒鍾沒有更新,意味着主節點已經宕機,備節點非常高興的把自己的節點信息寫入,變成主節點
保證任何時候,集群中只有一個Master
存儲所有Region的尋址入口
實時監控Region Server的狀態,將Region Server的上線和下線信息實時通知給Master
存儲HBase的Schema,包括有哪些Table,每個Table有哪些Column family
MemStore和StoreFile
MenStore相當於緩存功能,數據會先寫入MemStore,然后再寫入StoreFile
當MemStore大小達到某個值時,會進行刷盤操作,啟動flashcache進程,把MenStore數據生成StoreFile文件
HDFS也會有合並文件的操作,不適合存儲文件數量太多的文件,HDFS不適合文件隨機的修改和刪除,所有操作都是在文件的末尾做追加
HBase數據的修改和刪除是在數據合並時,才會真正的做修改和刪除
4:HBase Write-Ahead_log(WAL)機制,容錯與恢復
該機制用於數據的容錯和恢復
每個HRegionServer中都有一個HLog對象,HLog是一個實現Write Ahead log的類,在每次用戶操作寫入MemStore的同時,也會寫一份數據到HLog文件中,HLog文件定期滾動出新的,並刪除舊的文件,即已經持久化到StoreFile中的數據,當HRegionServer意外終止后,HMaster會通過Zookeeper感知到,HMaster首先會處理遺留的HLog文件,將其中不同Region的Log數據進行拆分,分別放到相應Region的目錄下,然后再將失效的Region重新分配,領取到這些Region的HRegionServer在Load Region的過程中,會發現有歷史HLog需要處理,因此會Replay Hlog中的數據到MemStore中,然后Flush到StoreFiles,完成數據恢復
1.RegionServer故障,ZK感知到。
2.通知HMaster
3.HMstaer拆分Hlog,根據所屬region來拆分。
4.拆分后,存放到對應的region的目錄里面去。
5.把故障的region分配到其他的RegionServer.
6.新的RegionServer加載故障的region,加載相應的Hlog文件。
5:HBase的寫流程
數據寫請求首先發給client,client查詢該數據應該往哪個地方存儲,會去zookeeper查詢MetaRegion獲取現在要寫入數據應該在哪個Region里面,獲取到之后,再根據獲取額結果做個分組,發給各個RegionServer,數據並發寫入,數據先寫入MemStore,然后再寫入HLog,寫完后,HMaster也會做相應的更新,然后才會返回寫成功
當MemStore達到一定值時,也會做個刷盤操作,生成一個新的HFile文件,當HFile文件變多之后,也會做個合並,數據最終存放在DataNode里面
1.客戶端發起寫請求
2.客戶端會和ZK通訊,請求meta-region的路由信息。
3.得到ZK返回后,會和相應的RegionServer通訊。
4.在相應的meta-region表中讀到數據存放位置。
5.將數據根據regionserver和region進行的分組打包
6.獲得region鎖機制
7.並行發送到各個RegionServer上。
8.數據寫入相應Store里面的MemStore,同時會在Hlog里面寫一份。
9.RegionServer通知HMaster更新信息。
10.返回寫成功。
PS:HBase,數據刪除,是在數據整合/合並的時候完成的。
數據越來越多,生成的StoreFile越來越大,數據合並;分裂成形成新的StoreFile;
數據持續增加,RegionServer會把Region分裂成兩個region,通知HMaster更新信息。
6:HBase的讀流程
客戶端發起請求,通過Zookeeper尋找到Meta表所在RegionServer,通過RowKey查找Meta表,獲取所要讀取的Region所在RegionServer,請求發送到該RegionServer,由其具體處理數據讀取
1.客戶端發起讀請求。
2.客戶端回合ZK通訊,請求ROOT表,讀元數據region的路由信息。
3.收到ZK返回之后,會和相應的Regionserver.找到相應的meta-region,獲取數據的位置
4.收到返回后,到數據所在的Region上讀取數據。