云HBase作為海量大數(shù)據(jù)存儲天然適合數(shù)據(jù)量TB、PB級別的業(yè)務(wù)場景,同時提供主備容災(zāi)方案滿足用戶的高可用需求,再此基礎(chǔ)上為了滿足用戶大數(shù)據(jù)量隨機讀低毛刺的要求新增追求穩(wěn)定性的主備雙活能力。

使用場景

對隨機讀響應(yīng)有高要求(P999小于50ms)的實時在線業(yè)務(wù)場景,例如用戶推薦、安全風控等。

核心能力

  • 請求低毛刺。
  • 自動容錯。
  • 資源利用率高。

原理介紹

低毛刺
兩個獨立節(jié)點的同時產(chǎn)生毛刺概率相比于單節(jié)點要低一個數(shù)量級,采用雙節(jié)點服務(wù)同一份數(shù)據(jù)可以在最終一致性條件下提升一個數(shù)量級的穩(wěn)定性。當用戶請求發(fā)起時會首先向主庫發(fā)起請求,在等待一段時間(Glitch Time)后如果主庫仍沒有返回結(jié)果,則并發(fā)向備庫發(fā)起請求,最終取最快返回的值作為結(jié)果。低毛刺
毛刺對比
毛刺對比
自動容錯
主備雙活中我們提供了自動容錯能力,在故障場景下自動進行切換,做到故障對業(yè)務(wù)完全透明。通常需要進行主備集群切換的場景如下:
  1. 斷網(wǎng)斷電等機房維度故障,無法正常鏈接主集群,請求全部拋錯。
  2. 由于軟件BUG造成的全集群宕機。
  3. 由于慢盤、壞盤造成的集群訪問超時。從用戶視角看就是主集群訪問拋錯或者主集群訪問超時,自動容錯會歷史的執(zhí)行結(jié)果進行收集,當主集群連續(xù)拋錯或者連續(xù)超時超過用戶指定次數(shù)時,即判定主集群存在故障需要進行”切換”,在切換狀態(tài)下在主庫服務(wù)恢復(fù)可以進行正常訪問的情況會進行自動回切,對用戶完全透明。
自動容錯
宕機測試
單機宕機吞吐對比宕機測試
單機宕機平均響應(yīng)對比平均響應(yīng)對比
集群宕機吞吐對比吞吐對比
集群宕機平均響應(yīng)對比平均響應(yīng)對比

使用方法

準備
  1. 使用云HBase主備容災(zāi)方案參見主備容災(zāi)
  2. 在高可用管理頁面獲取高可用鏈接地址和高可用實例ID。高可用管理頁
  3. 客戶端依賴版本。
    hbase1.X版本使用客戶端
    <dependency>
        <groupId>com.aliyun.hbase</groupId>
        <artifactId>alihbase-client</artifactId>
        <version>1.8.8</version>
    </dependency>
    
    hbase2.X版本使用客戶端
    <dependency>
        <groupId>com.aliyun.hbase</groupId>
        <artifactId>alihbase-client</artifactId>
        <version>2.8.3</version>
    </dependency>
    <dependency>
        <groupId>com.aliyun.hbase</groupId>
        <artifactId>alihbase-endpoint</artifactId>
        <version>2.8.3</version>
    </dependency>

配置客戶端參數(shù)

您可以通過以下兩種方式,來配置客戶端參數(shù):

方式一:配置文件

<configuration>
      <!--  高可用鏈接地址  -->
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>HOST:PORT</value>
    </property>
    <!-- 高可用實例ID-->
    <property>
        <name>haclient.cluster.id</name>
        <value>ha-xxxxxx</value>
    </property>
    <!--
    如果需要連接HBase增強版,需要設(shè)置用戶名密碼,默認均為root,可根據(jù)實際情況調(diào)整
    -->
    <property>
        <name>hbase.client.username</name>
        <value>testuser</value>
    </property>
    <property>
        <name>hbase.client.password</name>
        <value>password</value>
    </property>
    <!--開啟主備雙活-->
    <property>
        <name>hbase.dualservice.enable</name>
        <value>true</value>
    </property>
    <!--全部表使用主備雙活訪問-->
    <property>
        <name>hbase.dualservice.table.enable</name>
        <value>true</value>
    </property>
    <!--可以表級別設(shè)置使用主備雙活訪問-->
    <property>
        <name>${tablename}.hbase.dualservice.enable</name>
        <value>true</value>
    </property>
    <!--設(shè)置glitchtimeout(當訪問主庫超過這個時間后,dual service并發(fā)訪問備庫),單位ms-->
     <property>
        <name>hbase.dualservice.glitchtimeout</name>
        <value>xxx</value>
    </property>
    <!--表級別設(shè)置glitchtimeout,單位ms-->
    <property>
        <name>${tablename}.hbase.dualservice.glitchtimeout</name>
        <value>xxx</value>
    </property>
  <!--開啟自動容錯-->
  <property>
        <name>hbase.autoswitch.enable</name>
        <value>true</value>
    </property>
</configuration>

方式二:代碼

通過代碼Create Configuration,然后增加相關(guān)配置。

// 新建一個Configuration
Configuration conf = HBaseConfiguration.create();
// 高可用鏈接地址
conf.set("hbase.zookeeper.quorum", "HOST:PORT");
// 高可用實例ID
conf.set("haclient.cluster.id", "ha-xxxxxx");
// 設(shè)置用戶名和密碼,默認均為root,可根據(jù)實際情況調(diào)整
conf.set("hbase.client.username", "testuser");
conf.set("hbase.client.password", "password");
//開啟Dual Service
conf.setBoolean("hbase.dualservice.enable", true);
//全部表使用DualService訪問
conf.setBoolean("hbase.dualservice.table.enable", true);
//可以表級別設(shè)置使用DualService訪問
conf.setBoolean("${tablename}.hbase.dualservice.enable", true);
//設(shè)置glitchtimeout(當訪問主庫超過這個時間后,dual service并發(fā)訪問備庫),單位ms
conf.setInt("hbase.dualservice.glitchtimeout", xxx);
//表級別設(shè)置glitchtimeout,單位ms
conf.setInt("${tablename}.hbase.dualservice.glitchtimeout", xxx);
//開啟自動容錯
conf.setBoolean("hbase.autoswitch.enable", true);

//切換API
ClusterSwitcher clusterSwitcher = new ClusterSwitcher(conf);
//switch to standby
clusterSwitcher.switchToStandby();

使用限制

Dual Service僅支持以下訪問方式:

  • get
  • delete
  • put
  • batchGet
  • batchDelete
  • batchPut
  • small scan(2.x客戶端需要scan設(shè)置setLimit且limit<500)