云HBase通過master節點自動切換、數據兩副本、快速自動failover等手段最大程度的保證了HBase實例服務和數據可用性,但是面對可用區級別的斷電、斷網及其他極端故障單個HBase集群無法滿足用戶的高可用要求,針對跨可用區災備需求我們提供了跨可用區的HBase同城主備容災,提供混合場景(云實例同云實例、云實例同自建實例以及自建與自建實例)下的故障一鍵、透明、快速切換能力。
產品優勢
支持云HBase、EMR HBase、自建HBase混合主備。
零代碼改造,支持1.x、2.x多個版本。
自動數據同步管理,高效雙向同步,延遲在百毫秒級。
故障自動容錯。
主備控制臺,可顯示同步延遲、客戶端鏈接數、主備狀態等重要信息。
架構說明
用戶主備HBase實例分別部署在不同可用區,使用BDS數據通道服務完成主備實例之間實時增量數據雙向同步,同時在BDS上進行主備切換操作,用戶通過alihbase-connector訪問HBase實例,alihbase-connector監聽主備實例zk集群的切換事件完成實例切換,切換過程對上層業務透明。
使用限制
當前僅支持相同VPC內跨可用區部署方式。
2019年9月18日后購買的BDS服務支持該功能。
主備實例數據同步目前使用最終一致性模型,暫時不支持強一致模型。
目前只支持HBase服務切換,不支持phoenix,solr切換。
操作步驟
購買HBase集群,如已購買請執行步驟2,如未購買請參考購買集群。
登錄云數據庫HBase控制臺。
在集群列表頁面,單擊集群名稱,進入集群詳情頁。
在實例信息頁面在左側導航欄選擇數據庫連接,查看VPC ID。
購買LTS實例,如已經購買可以忽略,如未購買可以到購買鏈接頁面購買BDS實例,BDS實例需要同HBase在相同VPC網絡下,并且同主備HBase實例不在相同可用區,如果沒有多余可用區BDS建議購買在備實例所在可用區,購買好的BDS實例如下。
添加白名單
主備HBase實例以及BDS實例都要添加客戶端的白名單,否則客戶端無法訪問相應的實例,添加白名單方法參見設置白名單。
自建實例網絡打通
當關聯自建實例時,BDS需要能夠訪問自建實例,這里以EMR HBase實例為例(用戶自己購買ECS自建實例情況時一致的),需要在部署HBase的ECS實例安全組中為BDS的節點授權,進入LTS頁面,選擇配置管理,單擊生成安全組規則,會下載xxxx_securityrule.json的文件到本地:在EMR控制臺 > 集群管理找到對應的集群 > 單擊詳情:找到安全組(如果是完全自建HBase集群找到ECS實例的安全組)> 單擊安全組名稱:在安全組中選擇導入:選擇剛才下載的xxxx_securityrule.json文件,開始導入安全組規則:導入完成后BDS有權限可以訪問自建HBase的相關端口;自建HBase實例需要在BDS中綁定實例節點的host信息。進入bds頁面,選擇配置管理,配置bds.conf.hosts后,單擊修改:EMR的hosts信息可以登入到EMR的集群的ECS上查看/etc/hosts查看IP和域名,域名規則一般是emr-header-x.cluster-xxx/emr-worker-x.cluster-xxx
控制臺新增高可用實例
進入集群列表頁面,單擊新購買的bds實例:選擇高可用管理,添加高可用實例:如果主備實例都是云HBase實例,則可以直接選擇相應的實例名(對于增強版實例需要填寫用戶名和密碼),如果備實例為新實例,高可用服務可以支持一鍵遷移功能,可以選擇同步類型實例級別(同步主實例中全部表)和表級別(指定需要同步的表,表名按,號分隔),如果備實例是已有實例同時已經開啟了實時同步,可以選擇無需同步跳過數據同步:如果主備實例中存在自建實例,則需要填寫自建實例的鏈接信息,包括自建實例的鏈接地址(格式為zk1,zk2:port:/hbase),自建實例名(用戶自定義),hdfs地址(格式為hdfs://namenode1:port,namenode2:port),HBase根目錄(hbase-site.xml的hbase.rootdir配置):單擊確認,添加成功后,可以看到新生成高可用實例和高可用實例訪問地址:
切換管理
單擊管理(用戶名和密碼可以在數據庫鏈接 > 重置UI訪問密碼中進行設置)可以跳到管理頁面,如果選擇了數據同步,可以在管理頁面上看的主備實例實時數據雙向同步的點位,同時也可以看到歷史數據的同步進度,歷史數據同步完成且實時點位正常更新就說明數據遷移成功:i可以單擊切換,進行實例之間的切換操作,操作成功后,可以看到Active狀態的變化:
Java API訪問
準備
在高可用管理頁面獲取高可用鏈接地址和高可用實例ID:
hbase2.X版本使用客戶端,需要添加alihbase-endpoint依賴
<dependency>
<groupId>com.aliyun.hbase</groupId>
<artifactId>alihbase-endpoint</artifactId>
<version>2.8.3</version>
</dependency>
配置客戶端參數
您可以通過以下兩種方式,來配置客戶端參數:
方式一:配置文件
<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增強版,需要設置用戶名和密碼,默認均為root,可根據實際情況調整
-->
<property>
<name>hbase.client.username</name>
<value>testuser</value>
</property>
<property>
<name>hbase.client.password</name>
<value>password</value>
</property>
</configuration>
配置信息可以在高可用管理頁面中獲取:
方式二:代碼
通過代碼Create Configuration,然后增加相關配置
// 新建一個Configuration
Configuration conf = HBaseConfiguration.create();
// 高可用鏈接地址
conf.set("hbase.zookeeper.quorum", "HOST:PORT");
// 高可用實例ID
conf.set("haclient.cluster.id", "ha-xxxxxx");
// 設置用戶名和密碼,默認均為root,可根據實際情況調整
conf.set("hbase.client.username", "testuser")
conf.set("hbase.client.password", "password")
//一鍵切換API
ClusterSwitcher clusterSwitcher = new ClusterSwitcher(conf);
//switch to standby
clusterSwitcher.switchToStandby();
創建連接
通過配置conf創建Connection,然后訪問HBase。
// 創建 HBase連接,在程序生命周期內只需創建一次,該連接線程安全,可以共享給所有線程使用。
// 在程序結束后,需要將Connection對象關閉,否則會造成連接泄露。
// 也可以采用try finally方式防止泄露
Connection connection = ConnectionFactory.createConnection(conf);
新建表
使用haclient,支持使用API,在主備實例上新建表,新建表會實時在Active實例上進行創建,同時會生成異步任務在standby實例上進行創建,并且會對更新實時同步任務更新,可以在高可用實例管理頁面進行查看: