HBase quota机制源码阅读

相关patch:https://issues.apache.org/jira/browse/HBASE-11598
REVIEW BOARD: https://reviews.apache.org/r/23981

quota设置与应用过程

1.客户端通过admin.setQuota发送序列化的quotaSetting信息给服务端master接收quotaSetting,并将数据写入hbase:quota表

2.regionserver通过一个Chore定时任务,每隔一段时间去获取hbase:quota中的配置,放到quotaCache中

3.当有用户读写操作时,在RSRpcService中获取请求的大小,看是否达到阈值(checkQuota方法),达到阈值就抛出异常,否则就进行累加

master端和regionserver端都有对应的manager类,管理quota相关的操作(setQuota以及读写hbase:quota,checkQuota等)

相关类

客户端设置Quota

  • ConnectionManager:增加方法setQuota(RpcController controller, SetQuotaRequest request)
  • Admin.java:接口类 ,主要涉及到方法是setQuota(QuotaSettings) , getQuotaRetriever(QuotaFilter)
  • HBaseAdmin.java:增加方法setQuota(QuotaSettings)主要用户管理员设置quota,getQuotaRetriever(final QuotaFilter filter)quota信息查找
  • QuotaSettings:抽象类,username,tablename,namespace,get QuotaType,以及SetQuotaRequest.builder 生成序列化数据的方法
  • QuotaSettingsFactory:生成quotasettings实例的工厂类,返回的quotaSetting实际类型是ThrottleSettings或者QuotaGlobalsSettingsBypass,rb代码中最终通过admin.setQuotas参数就是这个类对应的方法返回值

序列化quota信息

  • ProtobufUtil.java :toTimeUnit、toProtoTimeUnit、toThrottleType、toQuotaScope、toProtoQuotaScope 等有关Quota信息序列化的操作 ,TimeUnit中设置的是有关时间的单位

客户端查询quota设置

  • QuotaFilter:list_quota时候,通过表达式过滤需要的quota

  • QuotaScope:枚举类,CLUSTER集群级别的quota(多个机器请求量加起来),MACHINE机器级别的quota

HMaster端

  • QuotaType:枚举类THROTTLE和GLOBAL_BYPASS
  • ThrottleSettings:QuotaSetting的实现类,最常用的阈值处理逻辑
  • HBase.proto:增加了枚举类TimeUnit(时间单位)
  • Master.proto:增加了以下内容
    SetQuotaRequest:user_name,
    user_group,
    namespace,
    table_name,
    remove_all,
    bypass_globals,
    ThrottleRequest,
    以及SetQuota(SetQuotaRequest) returns(SetQuotaResponse);
  • Quota.proto:QuotaScope,TimedQuota,ThrottleType(阈值类型,读写操作数量,读写操作数据量,REQUEST_NUMBER?REQUEST_SIZE?)
  • BaseMasterAndRegionObserver.java:接口类:pre/post set User/Table/NameSpace Quota 定义了一些在设置 quota前后要执行的操作,例如开启acl之后,要检查是否为admin权限
  • BaseMasterObserver.java:同上
    _ MasterObserver.java:同上
  • HMaster.java:MasterQuotaManager quotaManager;
  • MasterRpcServices.java: Master端处理RPC的类 增加方法setQuota(RpcController c, SetQuotaRequest req)
  • MasterQuotaManager.java:master端管理quota操作的类,管理员设置quota(admin.setQuota)–> masterRpcService调用MasterQuotaManager的setquota方法,manager调用QuotaUtil的增删改查hbase:quota表的方法,以及创建hbase:quota表
  • QuotaTableUtil:设置quota时,通过这个类对hbase:quota表进行操作

RegionServer端:

  • QuotaCache:regionserver上缓存quota设置的类,里面有Chore的实现,定时从hbase:quota表获取quota设置
    Chore:hbase中做定时任务的一个类,应用有TimeoutMonitor,ConnectionCache中的cleaner,BalancerChore,ClusterStatusChore,CleanerChore,CompactionChecker等
  • QuotaRetriever:扫描遍历quota设置的类,查询QUOTA_TABLE_NAME表,并把结果放到cache里面
  • QuotaLimiter:接口类,实现类为TimeBasedLimiter.java
  • QuotaLimiterFactory.java :QuotaLimiter的工厂类
  • QuotaState.java: QuotaCache中用到 ?
  • DefaultOperationQuota.java:regionserver上rpcService接受读写操作之后,调用这个类的checkQuota方法,重要方法1:checkQuota里面有estimateConsume方法去计算这次请求的消耗,判断是否超过阈值,重要方法2:close,里面调用了limiter.addOperationSize,把操作值累加起来,供下次请求判断
  • NoopOperationQuota.java:一个空的OperationQuota实现,如果没有开启quota机制,就使用这个OperationQuota类型的实例
  • NoopQuotaLimiter.java:一个空的QuotaLimiter实现,如果没有开启quota机制,就使用这个QuotaLimiter类型的实例
  • RegionServerQuotaManager.java: RSRpcService中调用这个manager,获取OperationQuota对象,执行manager.checkQuota(里面再调用OperationQuota.checkQuota)Get操作执行完,执行quota.addGetResult ,最后调用quota.close把本次操作的值累加到累加器中
  • RateLimiter.java:实际计算是否超过阈值的类
  • TimeBasedLimiter.java:QuotaLimiter实现,封装了读写次数,读写量,请求次数,请求量的RateLimiter
  • QuotaExceededException:quota 超出阈值时异常
  • ThrottlingException:checkQuota异常的时候会抛出ThrottlingException,继承了QuotaExceededException

你可能感兴趣的:(nosql,hbase)