更新时间:2023-06-20 GMT+08:00
分享

使用HBase双读能力

操作场景

HBase客户端应用通过自定义加载主备集群配置项,实现了双读能力。HBase双读作为提高HBase集群系统高可用性的一个关键特性,适用于四个查询场景:使用Get读取数据、使用批量Get读取数据、使用Scan读取数据,以及基于二级索引查询。它能够同时读取主备集群数据,减少查询毛刺,具体表现为:
  • 高成功率:双并发读机制,保证每一次读请求的成功率。
  • 可用性:单集群故障时,查询业务不中断。短暂的网络抖动也不会导致查询时间变长。
  • 通用性:双读特性不支持双写,但不影响原有的实时写场景。
  • 易用性:客户端封装处理,业务侧不感知。

HBase双读使用约束:

  • HBase双读特性基于Replication实现,备集群读取的数据可能和主集群存在差异,因此只能实现最终一致性。
  • 目前HBase双读功能仅用于查询。主集群宕机时,最新数据无法同步,备集群可能查询不到最新数据。
  • HBase的Scan操作可能分解为多次RPC。由于相关session信息在不同集群间不同步,数据不能保证完全一致,因此双读只在第一次RPC时生效,ResultScanner close之前的请求会固定访问第一次RPC时使用的集群。
  • HBase Admin接口、实时写入接口只会访问主集群。所以主集群宕机后,不能提供Admin接口功能和实时写入接口功能,只能提供GetScan查询服务。

操作步骤

  1. 参考准备连接集群配置文件章节,获取HBase主集群客户端配置文件core-site.xml”、“hbase-site.xml”、“hdfs-site.xml”,并将其放置到“src/main/resources/conf/active”目录下,该目录需要自己创建。
  2. 参考准备连接集群配置文件章节,获取备集群客户端配置文件core-site.xml、“hbase-site.xml”、“hdfs-site.xml”,并将其放置到“src/main/resources/conf/standby”目录下,该目录需要自己创建。
  3. 创建“hbase-dual.xml”配置文件,放置到“src/main/resources/conf/”目录下。配置文件中的配置项可参考表1

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    <!--主集群配置文件目录-->
        <property>
            <name>hbase.dualclient.active.cluster.configuration.path</name>
            <value>{样例代码目录}\\src\\main\\resources\\conf\\active</value>
            </property>
    <!--备集群配置文件目录-->
        <property>
            <name>hbase.dualclient.standby.cluster.configuration.path</name>
            <value>{样例代码目录}\\src\\main\\resources\\conf\\standby</value>
        </property>
    <!--双读模式的Connection实现-->
        <property>
            <name>hbase.client.connection.impl</name>
            <value>org.apache.hadoop.hbase.client.HBaseMultiClusterConnectionImpl</value>
        </property>
    <!--普通模式-->
        <property>
            <name>hbase.security.authentication</name>
            <value>Simple</value>
        </property>
    <!--普通模式-->
        <property>
            <name>hadoop.security.authentication</name>
            <value>Simple</value>
        </property>

代码样例

  • 创建双读Configuration,下面代码片段在“com.huawei.bigdata.hbase.examples”包的“TestMain”类的init方法中添加。
    private static void init() throws IOException {
        // Default load from conf directory
        conf = HBaseConfiguration.create();
        //In Windows environment
        String userdir = TestMain.class.getClassLoader().getResource("conf").getPath() + File.separator;
        //In Linux environment
        //String userdir = System.getProperty("user.dir") + File.separator + "conf" + File.separator;
        conf.addResource(new Path(userdir + "hbase-dual.xml"), false);
      }
  • 确定数据来源的集群
    • GET请求,以下代码片段在“com.huawei.bigdata.hbase.examples”包的“HBaseSample”类的testGet方法中添加。
      Result result = table.get(get); 
      if (result instanceof DualResult) {
           LOG.info(((DualResult)result).getClusterId()); 
      }
    • Scan请求,以下代码片段在“com.huawei.bigdata.hbase.examples”包的“HBaseSample”类的testScanData方法中添加。
      ResultScanner rScanner = table.getScanner(scan);  
      if (rScanner instanceof HBaseMultiScanner) {
           LOG.info(((HBaseMultiScanner)rScanner).getClusterId()); 
      }
  • 客户端支持打印metric信息

    “log4j.properties”文件中增加如下内容,客户端将metric信息输出到指定文件。指标项信息可参考打印metric信息

    log4j.logger.DUAL=debug,DUAL 
    log4j.appender.DUAL=org.apache.log4j.RollingFileAppender 
    log4j.appender.DUAL.File=/var/log/dual.log //客户端本地双读日志路径,根据实际路径修改,但目录要有写入权限
    log4j.additivity.DUAL=false 
    log4j.appender.DUAL.MaxFileSize=${hbase.log.maxfilesize} 
    log4j.appender.DUAL.MaxBackupIndex=${hbase.log.maxbackupindex} 
    log4j.appender.DUAL.layout=org.apache.log4j.PatternLayout 
    log4j.appender.DUAL.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2}: %m%n
分享:

    相关文档

    相关产品