1. 程式人生 > >HBase 多租戶隔離技術:RegionServer Group 介紹及實戰

HBase 多租戶隔離技術:RegionServer Group 介紹及實戰

文章目錄

背景

隨著 Apache HBase 在各個領域的廣泛應用,在 HBase 運維或應用的過程中我們可能會遇到這樣的問題:

  • 同一個 HBase 叢集使用的使用者越來越多,不同使用者之間的讀寫或者不同表的 compaction、region splits 操作可能對其他使用者或表產生了影響。將所有業務的表都存放在一個叢集的好處是可以很好的利用整個叢集的資源,只需要一套運維繫統。

  • 如果一個業務或者一個部門使用一個 HBase 叢集,這樣會導致 HBase 叢集的數量越來越多,直接導致了運維成本的增加。而且叢集的分離也會導致資源的浪費,有些叢集資源過剩,有些叢集資源不足,這種情況我們無法充分利用不同叢集的資源。將叢集按照業務或部門分開的好處是可以很好的隔離不同表、不同使用者之間的影響。

上面兩種情況均存在不足,如果我們能夠多租戶共用一套叢集,而且能夠使不同使用者之間進行隔離,在上層使用者看來好像是獨享一套 HBase 叢集。為了解決這個問題,來自雅虎的 Francis Liu 提出了多租戶隔離技術:RegionServer Group,詳情請參見 HBASE-6721。這個技術的目標就是隻需維護一個 HBase 叢集,同時滿足各個表在效能上、操作上的互不干擾,又支援訪問安全隔離。

RegionServer Group

RegionServer Group 技術是通過對 RegionServer 進行分組,不同的 RegionServer 分到不同的組。每個組可以按需掛載不同的表,並且當組內的表發生異常後,Region 不會遷移到其他的組。這樣,每個組就相當於一個邏輯上的子叢集,通過這種方式達到資源隔離的效果,降低管理成本,不必為每個高 SLA 的業務線單獨搭叢集。
在這裡插入圖片描述
從上圖可以看出,RegionServer 1 和 RegionServer 2 同屬於 iteblog Group 1,而且管理 Table 1 和 Table 3 兩張表;RegionServer 3 和 RegionServer 4 同屬於 iteblog Group 2,而且管理 Table 2 和 Table 4 兩張表。從使用者角度上看,RegionServer 1 和 RegionServer 2 看起來是屬於一個叢集;而 RegionServer 3 和 RegionServer 4 同屬於一個叢集,這兩個組之間均不互相影響。但是對於叢集運維人員來說,這就是一個 HBase 叢集,我們只需要運維這一個 HBase 叢集即可,大大降低了運維成本。

技術簡要介紹

在引入 RegionServer Group 技術之前,HBase 預設使用 StochasticLoadBalancer 策略(通過 hbase.master.loadbalancer.class 引數實現,參見HBASE-9555)將表的 Region 移動到 RegionServer 裡面去。這種策略被沒有考慮到 RegionServer Group 的資訊,所以如果要對 RegionServer 分組,我們就需要在移動 Region 的時候考慮到這些資訊。

基於這些資訊,社群開發出能夠識別出 RegionServer Group 資訊的 RSGroupBasedLoadBalancer,這個類和上面的 StochasticLoadBalancer都是實現了 LoadBalancer 介面的,詳見 HBASE-6721。

在預設情況下,所有的表和 RegionServer 都屬於 default 組。RSGroupBasedLoadBalancer 類具有識別組資訊的能力,所以在移動表的 Region 到 RegionServer 的時候會考慮到 RegionServer Group 資訊的。為了啟用這個特性,我們需要在 master 節點的 hbase-site.xml 檔案加入以下的配置:

<property>
   <name>hbase.coprocessor.master.classes</name>
   <value>org.apache.hadoop.hbase.rsgroup.RSGroupAdminEndpoint</value>
</property>
<property>
   <name>hbase.master.loadbalancer.class</name>
   <value>org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer</value>
</property>

設定完之後需要重啟 master 節點。

RegionServer Group 技術新引入的命令

RegionServer Group 技術為我們帶來了以下13個新的 HBase shell 命令。使用下面的命令一定需要在 master 節點上的 hbase-site.xml 檔案配置好上面兩個屬性。否則將會出現 UnknownProtocolException: No registered Master Coprocessor Endpoint found for RSGroupAdminService 異常。如下所示:

hbase(main):002:0> list_rsgroups
NAME                                            SERVER / TABLE
ERROR: org.apache.hadoop.hbase.exceptions.UnknownProtocolException: No registered Master Coprocessor Endpoint found for RSGroupAdminService. Has it been enabled?
    at org.apache.hadoop.hbase.master.MasterRpcServices.execMasterService(MasterRpcServices.java:802)
    at org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java)
    at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:413)
    at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:130)
    at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:324)
    at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:304)
List all RegionServer groups. Optional regular expression parameter can
be used to filter the output.
Example:
  hbase> list_rsgroups
  hbase> list_rsgroups 'abc.*'
Took 1.1077 seconds
  • list_rsgroups:列出所有的 RegionServer groups,我們可以在這個命令的後面使用正則表示式來過濾一些我們要的資訊。
  • get_rsgroup:獲取某個 RegionServer group 的資訊。
  • add_rsgroup:建立一個新的 RegionServer Group。
  • remove_rsgroup:刪除某個 RegionServer Group。
  • balance_rsgroup:對某個 RegionServer Group 進行 balance 操作。
  • move_servers_rsgroup:將 RegionServers 從一個組移動到另一個組。 RegionServer 中的所有 Region 都將移動到另一個 RegionServer 中。
  • move_tables_rsgroup:將表從一個 RegionServer Group 移動另一個 RegionServer Group。
  • move_namespaces_rsgroup:將指定名稱空間的表從一個 RegionServer Group 移動另一個 RegionServer Group。
  • move_servers_tables_rsgroup:將 RegionServers 和 Tables 從一個 RegionServer Group 移動另一個 RegionServer Group。
  • move_servers_namespaces_rsgroup:將指定名稱空間的 RegionServers 和 Tables 從一個 RegionServer Group 移動另一個 RegionServer Group。
  • get_server_rsgroup:獲取給定 RegionServer 所屬的 RegionServer Group。
  • get_table_rsgroup:獲取給定表所屬的 RegionServer Group。
  • remove_servers_rsgroup:從 RegionServer Group 中刪除已停用的 Region。 處於 Dead/recovering/live 狀態的 Region 將無法操作。

如何使用 RegionServer Group

我們前面說了,如果沒有建立 RegionServer Group 的話,HBase 預設的組只有 default,而且所有的表和 RegionServer 都屬於 default 組,如下:

hbase(main):001:0> list_rsgroups
NAME                                            SERVER / TABLE
 default                                        server 192.168.1.103:16020
                                                server 192.168.1.103:16021
                                                table hbase:meta
                                                table hbase:namespace
                                                table hbase:rsgroup
2 row(s)
Took 1.4986 seconds

現在我們使用 add_rsgroup 命令建立了一個名為 iteblog_group 的組:

hbase(main):020:0> add_rsgroup 'iteblog_group'
Took 0.0444 seconds
hbase(main):021:0> list_rsgroups
NAME                                            SERVER / TABLE
 iteblog_group
 default                                        server 192.168.1.103:16020
                                                server 192.168.1.103:16021
                                                table hbase:meta
                                                table hbase:namespace
                                                table hbase:rsgroup
2 row(s)
Took 0.0101 seconds

下面命令我們將 192.168.1.103:16021 RegionServer 移到了名為 iteblog_group 組裡面:

hbase(main):022:0> move_servers_rsgroup 'iteblog_group', ['192.168.1.103:16021']
Took 1.0220 seconds
hbase(main):023:0> list_rsgroups
NAME                                            SERVER / TABLE
 iteblog_group                                  server 192.168.1.103:16021
 default                                        server 192.168.1.103:16020
                                                table hbase:meta
                                                table hbase:namespace
                                                table hbase:rsgroup
2 row(s)
Took 0.0102 seconds

我們已經看到了地址為 192.168.1.103:16021 的 RegionServer 已經移到名為 iteblog_group 的組了。現在我們來建立一張表 iteblog_table,並且把這張表移到名為 iteblog_group 的組裡面。為了演示 RegionServer Group 的作用,這裡我現在建立一張名為 iteblog_table 的表,並且設定了預分割槽,如下:

hbase(main):011:0> create 'iteblog_table', 'cf', SPLITS=>['10','20','30','40']
Created table iteblog_table
Took 1.3884 seconds
=> Hbase::Table - iteblog_table
hbase(main):013:0> get_table_rsgroup 'iteblog_table'
default
1 row(s)
Took 0.0281 seconds

從上面的輸出可以看到,建立表的時候,預設是屬於 default 組,雖然我們有兩個 RegionServer,而且設定了預分割槽,按正常情況, iteblog_table 的 Region 應該是會分佈在這兩個 RegionServer 上的。但實際上因為這兩個 RegionServer 的組不一樣,而且 iteblog_table 的組屬於 default,所有 iteblog_table 的 Region 全部位於 192.168.1.103:16030 上。正如下圖所示:
在這裡插入圖片描述
現在我們將表 iteblog_table 移到名為 iteblog_group 的組裡面,那屬於 iteblog_table 的 Region 也應該全部移到 iteblog_group 裡面的:

hbase(main):007:0> move_tables_rsgroup 'iteblog_group', ['iteblog_table']
Took 5.6177 seconds
hbase(main):008:0> get_table_rsgroup 'iteblog_table'
iteblog_group
1 row(s)
Took 0.0202 seconds

我們已經看到 iteblog_table 所屬的組為 iteblog_group,從下圖也可以看到,iteblog_table 的所有 Region 全部移到了 192.168.1.103:16031 上。
在這裡插入圖片描述
好了,到這裡我們已經瞭解了 HBase RegionServer Group 技術,已經如何使用了。剩下的命令我就不再介紹,感興趣的同學可以自己再去學習。

轉載自過往記憶(https://www.iteblog.com/)