云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ù)完全透明。通常需要進行主備集群切換的場景如下:
- 斷網(wǎng)斷電等機房維度故障,無法正常鏈接主集群,請求全部拋錯。
- 由于軟件BUG造成的全集群宕機。
- 由于慢盤、壞盤造成的集群訪問超時。從用戶視角看就是主集群訪問拋錯或者主集群訪問超時,自動容錯會歷史的執(zhí)行結(jié)果進行收集,當主集群連續(xù)拋錯或者連續(xù)超時超過用戶指定次數(shù)時,即判定主集群存在故障需要進行”切換”,在切換狀態(tài)下在主庫服務(wù)恢復(fù)可以進行正常訪問的情況會進行自動回切,對用戶完全透明。
- 宕機測試
- 單機宕機吞吐對比
使用方法
- 準備
- 使用云HBase主備容災(zāi)方案參見主備容災(zāi)。
- 在高可用管理頁面獲取高可用鏈接地址和高可用實例ID。
- 客戶端依賴版本。
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)