HBase read replicas 功能介紹系列

摘要: 主要介紹HBase 在讀可用性這塊作的read replica 功能的大概介紹,包括:基本使用,讀寫流程的大概鏈路,設計的折中等等。java

HBase read replicasshell

1.概述api

對於這個模塊打算有幾篇文章組成一個系列,詳細的介紹這個功能,大概分read replicas綜述(本文)、正常狀況下的讀寫流程分析、異常狀況下的讀寫流程分析;網絡

本文主要介紹的有:概述、讀流程鏈路、寫流程鏈路、如何使用read replicas,example。咱們知道HBase是一個強一致的系統,最初是由於一個regionserver下負責的多個region的讀寫都是經歷這個regionserver去作處理,這樣的話,該regionserver是單點的作讀寫,不會存在數據不一致的問題。可是相應的該regionserver若是掛掉了,會形成該regionserver負責的region都不能提供服務。這個下降了整個流程的服務可用性。那麼爲了解決該問題,HBase引入了 Read Replicas的功能,也就是對於一個region在多個節點上都有對應的副本,HBase能夠經過balance保證各個region的各個副本在不一樣的機器,機架上。咱們給主region 一個數字爲0的replica_id,其他的副本均可以叫作secondary regions,他們的對應replica_id 是一、二、…,全部的寫請求都是replica_id爲0的節點(regionserver)作處理,而後異步的發送到一、二、…等節點。有了這個功能HBase的讀流程的可用性就由原來的3個9變成了4個9。固然有利也有弊,咱們作設計就是在作tradeoff,引入這個功能的話,對系統讀取數據的一致性有一點影響。不過這個主要看業務方能否接受,爲了提升服務可用性,犧牲一點點數據一致性是否能夠考慮。併發

2.讀流程鏈路異步

在HBase進行Get的時候,構造的Get對象裏面有一個Consistency的子項,默認是Consistency.STRONG,除此以外還有一個Consistency.TIMELINE的選項。咱們文章涉及到的replicas主要和這個東西有關係。若是你但願讓你的讀操做具備更高的可用性,你就須要在Get對象進行一個設置,設置它的Consistency屬性爲TIMELINE。那麼經過這個設置的話,讀請求就先會去replica_id爲0的主replica上面去讀數據,若是在必定時間內,HBase client沒有等到主的響應,那麼就會併發的發送請求到備份的replicas,這個時間默認是10ms,能夠經過在client端的配置文件裏面設置hbase.client.primaryCallTimeout.get來配置。那麼你可能就會問了,這個數據可能不是主上面的數據,多是replica_id爲一、二、等上面的數據,那麼這個數據不就存在老數據的可能麼?對!HBase 提供了一個接口用於判別數據是否是最新的,叫作isStale()。線程

可是若是用戶使用的是Consistency.STRONG這種的話,就不會存在讀到老數據的可能性。世上很難有完美的方案,那麼怎麼去作選擇,就是須要業務基於本身的需求作必定的選擇了。這個方案的有點是:提升了讀服務的可用性,一樣的會引入一些弊端,形成必定的內存開銷以及網絡開銷,由於數據須要在replicas上進行存儲,也存在請求到replicas上的可能性,那麼就會增長網絡開銷;設計

3.寫流程鏈路3d

上面概述裏面提到咱們須要把HBase的寫的數據先經replica_id爲0 的節點,而後異步分發到replicas上面去,那麼分發的過程是異步的,否則存在影響整個寫流程的體驗。既然設計的是異步的,在HBase 裏面存在2階段不一樣的實現方案,分別是在HBase1.0+和HBase1.1+這2個大版本上面實現的;在HBase的官方分別叫作: StoreFile Refresher 和 Asnyc WAL replication。server

3.1.StoreFile Refresher

這種機制就是一個regionserver上一個特定的線程,階段性的將主replica上的store file 刷新到secondary replicas上面。開啓這個功能的配置是在HBase的裏面把hbase.regionserver.storefile.refresh.period進行一個配置,單位是毫秒級別的。經過設置這個,定時刷新線程會看到主上的memstore 的flush,以及compaction,bulck load 操做。那麼對於內存裏面的數據,可能就會在備份上面讀不到。

3.2.Asnyc WAL replication

在HBase1.1+的版本里面新的一種數據被複制到secondary replicas的方式是:相似HBase replication,可是是單集羣內部replicas之間的數據複製,因爲主和secondary replicas之間的數據共享一份持久化數據,那麼數據備份到replicas的時候是須要保證內存之間的數據是相同的。主在作寫,compaction,bulkload等操做的時候會寫數據到wal log,而後經過這個機制secondary replicas會觀察到變化,而後講數據在本地內存回放。

這個功能默認狀況下是被關閉的,經過設置「hbase.region.replica.replication.enabled」 爲true便可開啓這個功能。

4.使用配置和使用步驟

若是要使用功能的話,分服務端和客戶端,下面這份配置是服務端的:

客戶端上面的配置更新:

新建一張具備region replica 的表:shell命令:

java的api操做:

讀取數據:shell命令:

java的api操做:

後續

後面的話會繼續從源碼級別進行該模塊的分析,敬請期待!

原文連接

相關文章
相關標籤/搜索