全部产品
云市场

双集群并发访问(Dual Service)

更新时间:2019-12-03 11:21:26

背景

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

使用场景

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

原理介绍

如果一个节点的稳定性是99.9%, 那么两个独立节点的组合的稳定性是 1 - 0.1 * 0.1 = 99.99%。采用双节点服务同一份数据可以在最终一致性条件下提升一个数量级的稳定性。当用户请求发起时DualService会首先向主库发起请求,在等待一段时间(Glitch Time)后如果主库仍没有返回结果,则并发向备库发起请求,DualService取最快返回的值作为结果.dual1

毛刺对比

dual3

使用方法

准备

  1. 需要使用云HBase高可用方案,(详见)
  2. 在高可用管理页面获取高可用链接地址和高可用实例ID:8.jpg
  3. 客户端依赖版本
  1. hbase1.X版本使用客户端
  2. <dependency>
  3. <groupId>com.alibaba.hbase</groupId>
  4. <artifactId>alihbase-connector</artifactId>
  5. <version>1.0.10</version>
  6. </dependency>
  7. hbase2.X版本使用客户端
  8. <dependency>
  9. <groupId>com.alibaba.hbase</groupId>
  10. <artifactId>alihbase-connector</artifactId>
  11. <version>2.0.10</version>
  12. </dependency>

配置客户端参数

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

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

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

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

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

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