1. 程式人生 > >HBase基於region數目和data locality來balance regions

HBase基於region數目和data locality來balance regions

1.  在Hbase的運維過程中,我們經常需要做如下操作:

  • 移動 regionserver 到其他的 regionserver group中
  • 下線一臺機器
  • 增加一臺機器
  • 移動 table 到其他 regionserver group中。 

2.  在進行上述操作的過程中,一個 regionserver 上的 regions,或者一個 table 的 regions 都會重新進行分配,這樣的分配過程是 HBase 控制的,我們無法控制一個 region 會移動到哪一個 regionserver 上。

3.  在 region 提供服務的過程中,影響服務質量的因素有:

  • regionserver的負載情況,一般來說,region 的數目越多,如果不考慮熱鍵的話regionserver的負載也會越高。
  • regionserver機器的效能,效能越好的機器,可以提供越多的服務,在異構的HBase叢集中,尤其明顯。對於一些比較重要的表我們會把它們放在效能比較好的機器上。
  • region的cache locality,region在服務的過程中,會通過memstore&blockcache緩衝機制來提高服務的速度,當region遷移後,region會丟失緩衝。
  • data locality,data locality用來衡量region服務的資料即region的HFile位於本地的程度,在region寫HFile的時候,根據HDFS的replica策略,至少會有一個備份儲存在本地,因此隨著時間的推移,region的locality會逐漸趨於1。region遷移的時候,不一定能移動到正好有這個region資料備份的機器上,因此,資料就會從其他節點獲取,造成網路開銷增加,延遲增加。 

4.  考慮上面情況,我們希望可以人工干預region的遷移,比如下線一臺機器之前,我們可以先把它上面的region移動到最合適的位置,然後再把機器下線。我們的移動策略有:

  • cache locality:儘可能保證region的位置不發生移動。
  • data locality:儘可能把region遷移到data locality高的節點。
  • region count:儘可能使得region的數目分配均衡,不給單一節點造成較大的壓力。
  • Ability and responsibility:效能越好的機器,需要承擔更多的責任。 

5.  總結以上需求,我們需要這樣一個工具:

  • 輸入1——table 我們需要balance的表,這是我們操作的基本單位。
  • 輸入2——server list,我們需要把表中的資料balance到那些機器上,通過使用者提供列表可以非常方便實現機器的增加和減少,以及把table上的region移動到指定機器上。在提供server list的時候可以指定機器的效能引數。
  • 輸入3——balance的策略 

6.  具體實現可見github:[email protected]:LiuPeien/hbase-balance-util.git