云HBase作为海量大数据存储天然适合数据量TB、PB级别的业务场景,同时提供主备容灾方案满足用户的高可用需求,再此基础上为了满足用户大数据量随机读低毛刺的要求新增追求稳定性的主备双活能力。

使用场景

对随机读响应有高要求(P999小于50ms)的实时在线业务场景,例如用户推荐、安全风控等。

核心能力

  • 请求低毛刺。
  • 自动容错。
  • 资源利用率高。

原理介绍

低毛刺
两个独立节点的同时产生毛刺概率相比于单节点要低一个数量级,采用双节点服务同一份数据可以在最终一致性条件下提升一个数量级的稳定性。当用户请求发起时会首先向主库发起请求,在等待一段时间(Glitch Time)后如果主库仍没有返回结果,则并发向备库发起请求,最终取最快返回的值作为结果。低毛刺
毛刺对比
毛刺对比
自动容错
主备双活中我们提供了自动容错能力,在故障场景下自动进行切换,做到故障对业务完全透明。通常需要进行主备集群切换的场景如下:
  1. 断网断电等机房维度故障,无法正常链接主集群,请求全部抛错。
  2. 由于软件BUG造成的全集群宕机。
  3. 由于慢盘、坏盘造成的集群访问超时。从用户视角看就是主集群访问抛错或者主集群访问超时,自动容错会历史的执行结果进行收集,当主集群连续抛错或者连续超时超过用户指定次数时,即判定主集群存在故障需要进行”切换”,在切换状态下在主库服务恢复可以进行正常访问的情况会进行自动回切,对用户完全透明。
自动容错
宕机测试
单机宕机吞吐对比宕机测试
单机宕机平均响应对比平均响应对比
集群宕机吞吐对比吞吐对比
集群宕机平均响应对比平均响应对比

使用方法

准备
  1. 使用云HBase主备容灾方案参见主备容灾
  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>

配置客户端参数

您可以通过以下两种方式,来配置客户端参数:

方式一:配置文件

<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>
    <!--开启主备双活-->
    <property>
        <name>hbase.dualservice.enable</name>
        <value>true</value>
    </property>
    <!--全部表使用主备双活访问-->
    <property>
        <name>hbase.dualservice.table.enable</name>
        <value>true</value>
    </property>
    <!--可以表级别设置使用主备双活访问-->
    <property>
        <name>${tablename}.hbase.dualservice.enable</name>
        <value>true</value>
    </property>
    <!--设置glitchtimeout(当访问主库超过这个时间后,dual service并发访问备库),单位ms-->
     <property>
        <name>hbase.dualservice.glitchtimeout</name>
        <value>xxx</value>
    </property>
    <!--表级别设置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,然后增加相关配置。

// 新建一个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");
//开启Dual Service
conf.setBoolean("hbase.dualservice.enable", true);
//全部表使用DualService访问
conf.setBoolean("hbase.dualservice.table.enable", true);
//可以表级别设置使用DualService访问
conf.setBoolean("${tablename}.hbase.dualservice.enable", true);
//设置glitchtimeout(当访问主库超过这个时间后,dual service并发访问备库),单位ms
conf.setInt("hbase.dualservice.glitchtimeout", xxx);
//表级别设置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设置setLimit且limit<500)