云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切换。

操作步骤

  1. 购买HBase集群,如已购买请执行步骤2,如未购买请参考购买集群
  2. 登录云数据库HBase控制台
  3. 集群列表页面,单击集群名称,进入集群详情页。
  4. 在实例信息页面在左侧导航栏选择数据库连接,查看VPC ID

    VPC ID

  5. 购买LTS实例,如已经购买可以忽略,如未购买可以到购买链接页面购买BDS实例,BDS实例需要同HBase在相同VPC网络下,并且同主备HBase实例不在相同可用区,如果没有多余可用区BDS建议购买在备实例所在可用区,购买好的BDS实例如下。

    BDS

添加白名单

主备HBase实例以及BDS实例都要添加客户端的白名单,否则客户端无法访问相应的实例,添加白名单方法参见设置白名单

自建实例网络打通

当关联自建实例时,BDS需要能够访问自建实例,这里以EMR HBase实例为例(用户自己购买ECS自建实例情况时一致的),需要在部署HBase的ECS实例安全组中为BDS的节点授权,进入LTS页面,选择配置管理,单击生成安全组规则,会下载xxxx_sercurityrule.json的文件到本地:在EMR控制台 > 集群管理找到对应的集群 > 单击详情:找到安全组(如果是完全自建HBase集群找到ECS实例的安全组)> 单击安全组名称:在安全组中选择导入:选择刚才下载的xxxx_sercurityrule.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访问密码中进行设置)可以跳到管理页面,如果选择了数据同步,可以在管理页面上看的主备实例实时数据双向同步的点位,同时也可以看的历史数据的同步进度,历史数据同步完成且实时点位正常更新就说明数据迁移成功:可以单击切换,进行实例之间的切换操作,操作成功后,可以看的Active状态的变化:

Java API访问

准备

  1. 在高可用管理页面获取高可用链接地址和高可用实例ID:
  2. 完成HBase Java SDK 下载
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:root,可根据实际情况调整
    -->
    <property>
        <name>hbase.client.username</name>
        <value>root</value>
    </property>
    <property>
        <name>hbase.client.password</name>
        <value>root</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:root,可根据实际情况调整
conf.set("hbase.client.username", "root")
conf.set("hbase.client.password", "root")

//一键切换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实例上进行创建,并且会对更新实时同步任务更新,可以在高可用实例管理页面进行查看: