全部产品

主备双活

更新时间:2020-06-29 16:15:43

背景

在大数据背景下每时每刻都会有大量的用户行为数据被收集、分析、以及应用, 典型的应用场景包括用户推荐、安全风控;这些场景的共同特点是数据量大、可用性要求高、同时对随机读请求的响应时间非常敏感;云HBase作为海量大数据存储天然适合数据量TB、PB级别的业务场景,同时提供主备容灾方案(详见)满足用户的高可用需求,再此基础上为了满足用户大数据量随机读低毛刺的要求新增追求极致稳定性的主备双活能力;

使用场景

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

核心能力

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

    原理介绍

    低毛刺

    两个独立节点的同时产生毛刺概率相比于单节点要低一个数量级。采用双节点服务同一份数据可以在最终一致性条件下提升一个数量级的稳定性。当用户请求发起时会首先向主库发起请求,在等待一段时间(Glitch Time)后如果主库仍没有返回结果,则并发向备库发起请求,最终取最快返回的值作为结果.dual1

    毛刺对比

    dual3

    自动容错

    主备双活中我们提供了自动容错能力,在故障场景下自动进行切换,做到故障对业务完全透明;通常需要进行主备集群切换的场景如下:1,断网断电等机房维度故障,无法正常链接主集群,请求全部抛错;2,由于软件BUG造成的全集群宕机;3,由于慢盘、坏盘造成的集群访问超时;从用户视角看就是主集群访问抛错或者主集群访问超时;自动容错会历史的执行结果进行收集,当主集群连续抛错或者连续超时超过用户指定次数时,即判定主集群存在故障需要进行”切换”,在切换状态下在主库服务恢复可以进行正常访问的情况会进行自动回切,对用户完全透明.AutoD2

    宕机测试

    单机宕机吞吐对比

    单机多活吞吐

    单机宕机平均响应对比

    单机双活平均

    集群宕机吞吐对比

    集群双活吞吐

    集群宕机平均响应对比

    集群双活平均

    使用方法

    准备

  1. 需要使用云HBase主备容灾方案,(详见)
  2. 在高可用管理页面获取高可用链接地址和高可用实例ID:8
  3. 客户端依赖版本
  1. hbase1.X版本使用客户端
  2. <dependency>
  3. <groupId>com.aliyun.hbase</groupId>
  4. <artifactId>alihbase-client</artifactId>
  5. <version>1.1.12</version>
  6. </dependency>
  7. hbase2.X版本使用客户端
  8. <dependency>
  9. <groupId>com.aliyun.hbase</groupId>
  10. <artifactId>alihbase-client</artifactId>
  11. <version>2.0.7</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>com.aliyun.hbase</groupId>
  15. <artifactId>alihbase-endpoint</artifactId>
  16. <version>2.0.7</version>
  17. </dependency>

配置客户端参数

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

方式一:配置文件
  1. <configuration>
  2. <!-- 高可用链接地址 -->
  3. <property>
  4. <name>hbase.zookeeper.quorum</name>
  5. <value>HOST:PORT</value>
  6. </property>
  7. <!-- 高可用实例ID-->
  8. <property>
  9. <name>haclient.cluster.id</name>
  10. <value>ha-xxxxxx</value>
  11. </property>
  12. <!--
  13. 如果需要连接HBase增强版,需要设置用户名密码,默认root:root,可根据实际情况调整
  14. -->
  15. <property>
  16. <name>hbase.client.username</name>
  17. <value>root</value>
  18. </property>
  19. <property>
  20. <name>hbase.client.password</name>
  21. <value>root</value>
  22. </property>
  23. <!--开启主备双活-->
  24. <property>
  25. <name>hbase.dualservice.enable</name>
  26. <value>true</value>
  27. </property>
  28. <!--全部表使用主备双活访问-->
  29. <property>
  30. <name>hbase.dualservice.table.enable</name>
  31. <value>true</value>
  32. </property>
  33. <!--可以表级别设置使用主备双活访问-->
  34. <property>
  35. <name>${tablename}.hbase.dualservice.enable</name>
  36. <value>true</value>
  37. </property>
  38. <!--设置glitchtimeout(当访问主库超过这个时间后,dual service并发访问备库),单位ms-->
  39. <property>
  40. <name>hbase.dualservice.glitchtimeout</name>
  41. <value>xxx</value>
  42. </property>
  43. <!--表级别设置glitchtimeout,单位ms-->
  44. <property>
  45. <name>${tablename}.hbase.dualservice.glitchtimeout</name>
  46. <value>xxx</value>
  47. </property>
  48. <!--开启自动容错-->
  49. <property>
  50. <name>hbase.autoswitch.enable</name>
  51. <value>true</value>
  52. </property>
  53. </configuration>
方式二:代码

通过代码Create Configuration,然后增加相关配置

  1. // 新建一个Configuration
  2. Configuration conf = HBaseConfiguration.create();
  3. // 高可用链接地址
  4. conf.set("hbase.zookeeper.quorum", "HOST:PORT");
  5. // 高可用实例ID
  6. conf.set("haclient.cluster.id", "ha-xxxxxx");
  7. // 设置用户名密码,默认root:root,可根据实际情况调整
  8. conf.set("hbase.client.username", "root");
  9. conf.set("hbase.client.password", "root");
  10. //开启Dual Service
  11. conf.setBoolean("hbase.dualservice.enable", true);
  12. //全部表使用DualService访问
  13. conf.setBoolean("hbase.dualservice.table.enable", true);
  14. //可以表级别设置使用DualService访问
  15. conf.setBoolean("${tablename}.hbase.dualservice.enable", true);
  16. //设置glitchtimeout(当访问主库超过这个时间后,dual service并发访问备库),单位ms
  17. conf.setInt("hbase.dualservice.glitchtimeout", xxx);
  18. //表级别设置glitchtimeout,单位ms
  19. conf.setInt("${tablename}.hbase.dualservice.glitchtimeout", xxx);
  20. //开启自动容错
  21. conf.setBoolean("hbase.autoswitch.enable", true);
使用限制

Dual Service仅支持以下访问方式:

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