HBase read replicas 功能介绍系列

摘要: 主要介绍HBase 在读可用性这块作的read replica 功能的大概介绍,包括:基本使用,读写流程的大概链路,设计的折中等等。java

HBase read replicasshell

1.概述api

对于这个模块打算有几篇文章组成一个系列,详细的介绍这个功能,大概分read replicas综述(本文)、正常状况下的读写流程分析、异常状况下的读写流程分析;网络

本文主要介绍的有:概述、读流程链路、写流程链路、如何使用read replicas,example。咱们知道HBase是一个强一致的系统,最初是由于一个regionserver下负责的多个region的读写都是经历这个regionserver去作处理,这样的话,该regionserver是单点的作读写,不会存在数据不一致的问题。可是相应的该regionserver若是挂掉了,会形成该regionserver负责的region都不能提供服务。这个下降了整个流程的服务可用性。那么为了解决该问题,HBase引入了 Read Replicas的功能,也就是对于一个region在多个节点上都有对应的副本,HBase能够经过balance保证各个region的各个副本在不一样的机器,机架上。咱们给主region 一个数字为0的replica_id,其他的副本均可以叫作secondary regions,他们的对应replica_id 是一、二、…,全部的写请求都是replica_id为0的节点(regionserver)作处理,而后异步的发送到一、二、…等节点。有了这个功能HBase的读流程的可用性就由原来的3个9变成了4个9。固然有利也有弊,咱们作设计就是在作tradeoff,引入这个功能的话,对系统读取数据的一致性有一点影响。不过这个主要看业务方能否接受,为了提升服务可用性,牺牲一点点数据一致性是否能够考虑。并发

2.读流程链路异步

在HBase进行Get的时候,构造的Get对象里面有一个Consistency的子项,默认是Consistency.STRONG,除此以外还有一个Consistency.TIMELINE的选项。咱们文章涉及到的replicas主要和这个东西有关系。若是你但愿让你的读操做具备更高的可用性,你就须要在Get对象进行一个设置,设置它的Consistency属性为TIMELINE。那么经过这个设置的话,读请求就先会去replica_id为0的主replica上面去读数据,若是在必定时间内,HBase client没有等到主的响应,那么就会并发的发送请求到备份的replicas,这个时间默认是10ms,能够经过在client端的配置文件里面设置hbase.client.primaryCallTimeout.get来配置。那么你可能就会问了,这个数据可能不是主上面的数据,多是replica_id为一、二、等上面的数据,那么这个数据不就存在老数据的可能么?对!HBase 提供了一个接口用于判别数据是否是最新的,叫作isStale()。线程

可是若是用户使用的是Consistency.STRONG这种的话,就不会存在读到老数据的可能性。世上很难有完美的方案,那么怎么去作选择,就是须要业务基于本身的需求作必定的选择了。这个方案的有点是:提升了读服务的可用性,一样的会引入一些弊端,形成必定的内存开销以及网络开销,由于数据须要在replicas上进行存储,也存在请求到replicas上的可能性,那么就会增长网络开销;设计

3.写流程链路3d

上面概述里面提到咱们须要把HBase的写的数据先经replica_id为0 的节点,而后异步分发到replicas上面去,那么分发的过程是异步的,否则存在影响整个写流程的体验。既然设计的是异步的,在HBase 里面存在2阶段不一样的实现方案,分别是在HBase1.0+和HBase1.1+这2个大版本上面实现的;在HBase的官方分别叫作: StoreFile Refresher 和 Asnyc WAL replication。server

3.1.StoreFile Refresher

这种机制就是一个regionserver上一个特定的线程,阶段性的将主replica上的store file 刷新到secondary replicas上面。开启这个功能的配置是在HBase的里面把hbase.regionserver.storefile.refresh.period进行一个配置,单位是毫秒级别的。经过设置这个,定时刷新线程会看到主上的memstore 的flush,以及compaction,bulck load 操做。那么对于内存里面的数据,可能就会在备份上面读不到。

3.2.Asnyc WAL replication

在HBase1.1+的版本里面新的一种数据被复制到secondary replicas的方式是:相似HBase replication,可是是单集群内部replicas之间的数据复制,因为主和secondary replicas之间的数据共享一份持久化数据,那么数据备份到replicas的时候是须要保证内存之间的数据是相同的。主在作写,compaction,bulkload等操做的时候会写数据到wal log,而后经过这个机制secondary replicas会观察到变化,而后讲数据在本地内存回放。

这个功能默认状况下是被关闭的,经过设置“hbase.region.replica.replication.enabled” 为true便可开启这个功能。

4.使用配置和使用步骤

若是要使用功能的话,分服务端和客户端,下面这份配置是服务端的:

客户端上面的配置更新:

新建一张具备region replica 的表:shell命令:

java的api操做:

读取数据:shell命令:

java的api操做:

后续

后面的话会继续从源码级别进行该模块的分析,敬请期待!

原文连接

相关文章
相关标签/搜索