第二版介绍:https://blog.csdn.net/Gloria_y/article/details/104266474
相关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 **