本文档风哥主要介绍HBase多租户架构实战,包括命名空间隔离、资源配额、租户管理等内容,风哥教程参考HBase官方文档Namespace、Quota等内容,适合大数据开发运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 多租户概述
HBase多租户架构支持在同一集群中为不同租户提供隔离的数据存储和资源管理。学习交流加群风哥微信: itpux-com
- 命名空间隔离:逻辑隔离租户数据
- 资源配额:限制租户资源使用
- 权限控制:租户级访问控制
- 资源隔离:RegionServer分组
1. 命名空间层
– 逻辑隔离
– 表名前缀
– 配额管理
– 权限控制
2. 资源配额层
– 表数量限制
– Region数量限制
– 请求频率限制
– 存储空间限制
3. 权限控制层
– 命名空间权限
– 表权限
– 列族权限
4. 资源隔离层
– RegionServer分组
– 独立资源池
– 物理隔离
# 多租户场景
1. SaaS应用
多个客户共享集群
数据逻辑隔离
资源按需分配
2. 企业内部
多部门共享集群
数据权限隔离
资源配额管理
3. 开发测试
多环境共享集群
环境隔离
资源限制
# 多租户架构图
┌─────────────────────────────────────┐
│ HBase Cluster │
├──────────┬──────────┬───────────────┤
│ Tenant A │ Tenant B │ Tenant C │
│ NS:ta │ NS:tb │ NS:tc │
├──────────┼──────────┼───────────────┤
│ Quota │ Quota │ Quota │
│ ACL │ ACL │ ACL │
└──────────┴──────────┴───────────────┘
# 多租户优势
1. 资源共享
– 降低成本
– 提高利用率
– 统一管理
2. 数据隔离
– 逻辑隔离
– 权限控制
– 安全保障
3. 资源管理
– 配额限制
– 公平分配
– 防止资源抢占
1.2 隔离模型详解
隔离模型详解:
1. 逻辑隔离
方式:命名空间
特点:
– 表名隔离
– 配额管理
– 权限控制
– 共享资源
适用场景:
– 中小规模租户
– 成本敏感场景
2. 物理隔离
方式:RegionServer分组
特点:
– 独立资源
– 物理隔离
– 性能保障
– 高成本
适用场景:
– 大规模租户
– 性能敏感场景
3. 混合隔离
方式:逻辑+物理
特点:
– 灵活配置
– 分级服务
– 成本平衡
适用场景:
– 多层次租户
# 命名空间隔离
# 创建命名空间
create_namespace ‘tenant_a’, {‘purpose’ => ‘A租户数据’}
# 在命名空间创建表
create ‘tenant_a:user_table’, ‘info’
# 表完整名称
tenant_a:user_table
# 命名空间属性
alter_namespace ‘tenant_a’, {METHOD => ‘set’, ‘quota’ => ‘100’}
# RegionServer分组
# 创建RS分组
create_rsgroup ‘group_a’
# 添加服务器到分组
move_servers_rsgroup ‘group_a’, [‘fgedu-node1’, ‘fgedu-node2’]
# 移动表到分组
move_tables_rsgroup ‘group_a’, [‘tenant_a:user_table’]
# 查看分组
get_rsgroup ‘group_a’
# 隔离级别对比
隔离级别 隔离性 成本 管理复杂度
逻辑隔离 低 低 低
物理隔离 高 高 高
混合隔离 中 中 中
# 选择建议
1. 小租户:逻辑隔离
2. 大租户:物理隔离
3. 混合场景:混合隔离
1.3 资源配额详解
资源配额详解:
1. 表数量配额
限制:命名空间表数量
命令:set_quota TYPE => THROTTLE, NAMESPACE => ‘ns’, LIMIT => ’10tables’
2. Region数量配额
限制:命名空间Region数量
命令:set_quota TYPE => THROTTLE, NAMESPACE => ‘ns’, LIMIT => ‘100regions’
3. 请求频率配额
限制:读写请求频率
命令:set_quota TYPE => THROTTLE, USER => ‘user1’, LIMIT => ‘1000req/sec’
4. 存储空间配额
限制:存储空间大小
命令:set_quota TYPE => SPACE, NAMESPACE => ‘ns’, LIMIT => ‘100G’
# 配额作用域
1. 用户级配额
作用域:用户
限制:用户请求频率
示例:
set_quota TYPE => THROTTLE, USER => ‘app_user’, LIMIT => ‘1000req/sec’
set_quota TYPE => THROTTLE, USER => ‘app_user’, LIMIT => ‘500read/sec’
set_quota TYPE => THROTTLE, USER => ‘app_user’, LIMIT => ‘500write/sec’
2. 表级配额
作用域:表
限制:表请求频率、存储空间
示例:
set_quota TYPE => THROTTLE, TABLE => ‘fgedu_user’, LIMIT => ‘2000req/sec’
set_quota TYPE => SPACE, TABLE => ‘fgedu_user’, LIMIT => ’50G’
3. 命名空间级配额
作用域:命名空间
限制:表数量、Region数量、请求频率、存储空间
示例:
set_quota TYPE => THROTTLE, NAMESPACE => ‘tenant_a’, LIMIT => ‘5000req/sec’
set_quota TYPE => SPACE, NAMESPACE => ‘tenant_a’, LIMIT => ‘200G’
# 配额单位
类型 单位
请求频率 req/sec, req/min
读取频率 read/sec, read/min
写入频率 write/sec, write/min
存储空间 B, K, M, G, T, P
# 配额状态
# 查看配额
list_quotas
# 查看特定配额
list_quotas USER => ‘app_user’
list_quotas NAMESPACE => ‘tenant_a’
# 删除配额
set_quota TYPE => THROTTLE, USER => ‘app_user’, LIMIT => NONE
# 配额执行模式
1. 检查模式
检查配额但不强制执行
hbase.quota.check.mode=check
2. 强制模式
强制执行配额限制
hbase.quota.check.mode=enforce
# 配额配置
hbase-site.xml:
Part02-生产环境规划与建议
2.1 多租户规划建议
多租户规划建议:
1. 金牌租户
特点:
– 业务关键
– 高性能要求
– 大数据量
隔离方式:物理隔离
资源:独立RegionServer组
配额:高配额
2. 银牌租户
特点:
– 业务重要
– 中等性能要求
– 中等数据量
隔离方式:混合隔离
资源:共享RegionServer组
配额:中配额
3. 铜牌租户
特点:
– 一般业务
– 低性能要求
– 小数据量
隔离方式:逻辑隔离
资源:共享资源池
配额:低配额
# 命名空间规划
命名空间 用途 配额
tenant_gold 金牌租户 500G, 10000req/sec
tenant_silver 银牌租户 200G, 5000req/sec
tenant_bronze 铜牌租户 50G, 1000req/sec
dev 开发环境 20G, 500req/sec
test 测试环境 20G, 500req/sec
# 用户规划
用户 角色 命名空间权限
gold_admin 金牌管理员 tenant_gold:Admin
gold_app 金牌应用 tenant_gold:RW
silver_admin 银牌管理员 tenant_silver:Admin
silver_app 银牌应用 tenant_silver:RW
dev_user 开发用户 dev:RWC
test_user 测试用户 test:RWC
# RegionServer分组规划
分组 服务器 用途
group_gold fgedu-node1,2,3 金牌租户
group_silver fgedu-node4,5,6 银牌租户
group_default fgedu-node7,8,9,10 默认租户
# 资源配额规划
租户级别 表数量 Region数量 存储空间 请求频率
金牌 100 1000 500G 10000req/sec
银牌 50 500 200G 5000req/sec
铜牌 20 200 50G 1000req/sec
2.2 命名空间规划
命名空间规划建议:
格式:tenant_[租户标识]_[环境]
示例:
tenant_companya_prod 公司A生产环境
tenant_companya_dev 公司A开发环境
tenant_companyb_prod 公司B生产环境
# 命名空间属性
属性 说明 示例
owner 所有者 company_a
purpose 用途 业务系统
quota 配额 100G
contact 联系人 admin@company.com
create_time 创建时间 2026-04-08
# 创建命名空间示例
create_namespace ‘tenant_companya_prod’, {
‘owner’ => ‘company_a’,
‘purpose’ => ‘业务系统’,
‘quota’ => ‘100G’,
‘contact’ => ‘admin@company.com’,
‘create_time’ => ‘2026-04-08’
}
# 命名空间管理规范
1. 创建规范
– 必须设置属性
– 必须设置配额
– 必须设置权限
2. 使用规范
– 表名规范:业务_表名
– 列族规范:info, detail, etc
– TTL设置:根据业务需求
3. 监控规范
– 监控资源使用
– 监控配额使用
– 监控性能指标
# 命名空间权限矩阵
用户 tenant_a tenant_b tenant_c
tenant_a_admin Admin – –
tenant_a_app RW – –
tenant_b_admin – Admin –
tenant_b_app – RW –
hbase_admin Admin Admin Admin
2.3 配额规划建议
配额规划建议:
1. 存储配额计算
配额 = 预估数据量 × (1 + 增长率) × 副本数
示例:
预估数据量:100GB
增长率:50%
副本数:3
配额 = 100 × 1.5 × 3 = 450GB
2. 请求配额计算
配额 = 峰值QPS × (1 + 冗余率)
示例:
峰值QPS:5000
冗余率:50%
配额 = 5000 × 1.5 = 7500req/sec
3. Region配额计算
配额 = 表数量 × 平均Region数
示例:
表数量:20
平均Region数:50
配额 = 20 × 50 = 1000regions
# 配额分配策略
1. 固定配额
特点:固定分配
适用:租户规模稳定
2. 弹性配额
特点:动态调整
适用:租户规模变化
3. 分级配额
特点:按级别分配
适用:多级别租户
# 配额监控
监控项 告警阈值
存储使用率 > 80%
请求频率 > 90%
Region数量 > 90%
# 配额调整流程
1. 租户申请
– 提交申请单
– 说明调整原因
– 提供使用数据
2. 审核评估
– 评估资源情况
– 评估合理性
– 审批申请
3. 配额调整
– 执行配额调整
– 通知租户
– 记录变更
# 配额配置示例
# 金牌租户配额
set_quota TYPE => SPACE, NAMESPACE => ‘tenant_gold’, LIMIT => ‘500G’
set_quota TYPE => THROTTLE, NAMESPACE => ‘tenant_gold’, LIMIT => ‘10000req/sec’
# 银牌租户配额
set_quota TYPE => SPACE, NAMESPACE => ‘tenant_silver’, LIMIT => ‘200G’
set_quota TYPE => THROTTLE, NAMESPACE => ‘tenant_silver’, LIMIT => ‘5000req/sec’
# 铜牌租户配额
set_quota TYPE => SPACE, NAMESPACE => ‘tenant_bronze’, LIMIT => ’50G’
set_quota TYPE => THROTTLE, NAMESPACE => ‘tenant_bronze’, LIMIT => ‘1000req/sec’
Part03-生产环境项目实施方案
3.1 命名空间实战
3.1.1 创建命名空间
$ hbase shell
hbase(main):001:0> create_namespace ‘tenant_fgedu_a’,
{‘owner’ => ‘fgedu_a’, ‘purpose’ => ‘业务系统’, ‘contact’ => ‘admin@fgedu.com’}
Took 0.1234 seconds.
hbase(main):002:0> create_namespace ‘tenant_fgedu_b’,
{‘owner’ => ‘fgedu_b’, ‘purpose’ => ‘业务系统’, ‘contact’ => ‘admin@fgedu.com’}
Took 0.1234 seconds.
hbase(main):003:0> create_namespace ‘dev’,
{‘owner’ => ‘dev_team’, ‘purpose’ => ‘开发环境’}
Took 0.1234 seconds.
hbase(main):004:0> create_namespace ‘test’,
{‘owner’ => ‘test_team’, ‘purpose’ => ‘测试环境’}
Took 0.1234 seconds.
# 2. 查看命名空间
hbase(main):005:0> list_namespace
NAMESPACE
default
dev
hbase
system
tenant_fgedu_a
tenant_fgedu_b
test
7 row(s)
# 3. 查看命名空间属性
hbase(main):006:0> describe_namespace ‘tenant_fgedu_a’
DESCRIPTION
{NAME => ‘tenant_fgedu_a’, contact => ‘admin@fgedu.com’, owner => ‘fgedu_a’, purpose => ‘业务系统’}
# 4. 修改命名空间属性
hbase(main):007:0> alter_namespace ‘tenant_fgedu_a’,
{METHOD => ‘set’, ‘quota’ => ‘100G’}
Took 0.1234 seconds.
hbase(main):008:0> describe_namespace ‘tenant_fgedu_a’
DESCRIPTION
{NAME => ‘tenant_fgedu_a’, contact => ‘admin@fgedu.com’, owner => ‘fgedu_a’, purpose => ‘业务系统’, quota => ‘100G’}
# 5. 在命名空间创建表
hbase(main):009:0> create ‘tenant_fgedu_a:user_table’, ‘info’, ‘detail’
Created table tenant_fgedu_a:user_table
hbase(main):010:0> create ‘tenant_fgedu_a:order_table’, ‘info’
Created table tenant_fgedu_a:order_table
hbase(main):011:0> create ‘tenant_fgedu_b:user_table’, ‘info’
Created table tenant_fgedu_b:user_table
# 6. 查看命名空间表
hbase(main):012:0> list_namespace_tables ‘tenant_fgedu_a’
TABLE
order_table
user_table
2 row(s)
3.1.2 命名空间权限配置
$ kadmin.local
kadmin.local: addprinc -pw password fgedu_a_admin@FGEDU.NET.CN
kadmin.local: addprinc -pw password fgedu_a_app@FGEDU.NET.CN
kadmin.local: addprinc -pw password fgedu_b_admin@FGEDU.NET.CN
kadmin.local: addprinc -pw password fgedu_b_app@FGEDU.NET.CN
# 2. 授予命名空间权限
$ hbase shell
hbase(main):013:0> grant ‘fgedu_a_admin’, ‘A’, ‘@tenant_fgedu_a’
0 row(s) in 0.1234 seconds.
hbase(main):014:0> grant ‘fgedu_a_app’, ‘RW’, ‘@tenant_fgedu_a’
0 row(s) in 0.1234 seconds.
hbase(main):015:0> grant ‘fgedu_b_admin’, ‘A’, ‘@tenant_fgedu_b’
0 row(s) in 0.1234 seconds.
hbase(main):016:0> grant ‘fgedu_b_app’, ‘RW’, ‘@tenant_fgedu_b’
0 row(s) in 0.1234 seconds.
# 3. 查看命名空间权限
hbase(main):017:0> user_permission ‘@tenant_fgedu_a’
User Namespace Table Family Permission
hbase (global) (global) Admin
fgedu_a_admin tenant_fgedu_a (namespace) Admin
fgedu_a_app tenant_fgedu_a (namespace) Read, Write
3 row(s)
# 4. 测试权限
$ kinit fgedu_a_app@FGEDU.NET.CN
$ hbase shell
hbase(main):018:0> put ‘tenant_fgedu_a:user_table’, ‘row1’, ‘info:name’, ‘fgedu01’
Took 0.0123 seconds.
hbase(main):019:0> put ‘tenant_fgedu_b:user_table’, ‘row1’, ‘info:name’, ‘fgedu01’
ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Permission denied
# 5. 撤销权限
$ kinit hbase/fgedu-node1@FGEDU.NET.CN
$ hbase shell
hbase(main):020:0> revoke ‘fgedu_a_app’, ‘@tenant_fgedu_a’
0 row(s) in 0.1234 seconds.
3.2 配额配置实战
3.2.1 启用配额功能
$ cat >> /bigdata/app/hbase/conf/hbase-site.xml << 'EOF'
# 2. 重启HBase服务
$ /bigdata/app/hbase/bin/stop-hbase.sh
$ /bigdata/app/hbase/bin/start-hbase.sh
# 3. 验证配额功能
$ hbase shell
hbase(main):021:0> list_quotas
QUOTA
0 row(s)
3.2.2 设置配额
hbase(main):022:0> set_quota TYPE => SPACE, NAMESPACE => ‘tenant_fgedu_a’, LIMIT => ‘100G’
Took 0.1234 seconds.
hbase(main):023:0> set_quota TYPE => SPACE, NAMESPACE => ‘tenant_fgedu_b’, LIMIT => ’50G’
Took 0.1234 seconds.
# 2. 设置命名空间请求配额
hbase(main):024:0> set_quota TYPE => THROTTLE, NAMESPACE => ‘tenant_fgedu_a’, LIMIT => ‘5000req/sec’
Took 0.1234 seconds.
hbase(main):025:0> set_quota TYPE => THROTTLE, NAMESPACE => ‘tenant_fgedu_b’, LIMIT => ‘2000req/sec’
Took 0.1234 seconds.
# 3. 设置用户请求配额
hbase(main):026:0> set_quota TYPE => THROTTLE, USER => ‘fgedu_a_app’, LIMIT => ‘1000req/sec’
Took 0.1234 seconds.
hbase(main):027:0> set_quota TYPE => THROTTLE, USER => ‘fgedu_a_app’, THROTTLE_TYPE => READ, LIMIT => ‘500read/sec’
Took 0.1234 seconds.
hbase(main):028:0> set_quota TYPE => THROTTLE, USER => ‘fgedu_a_app’, THROTTLE_TYPE => WRITE, LIMIT => ‘500write/sec’
Took 0.1234 seconds.
# 4. 设置表级配额
hbase(main):029:0> set_quota TYPE => SPACE, TABLE => ‘tenant_fgedu_a:user_table’, LIMIT => ’50G’
Took 0.1234 seconds.
hbase(main):030:0> set_quota TYPE => THROTTLE, TABLE => ‘tenant_fgedu_a:user_table’, LIMIT => ‘2000req/sec’
Took 0.1234 seconds.
# 5. 查看配额
hbase(main):031:0> list_quotas
OWNER QUOTA
NAMESPACE => ‘tenant_fgedu_a’ TYPE => SPACE, LIMIT => 100G
NAMESPACE => ‘tenant_fgedu_a’ TYPE => THROTTLE, LIMIT => 5000req/sec
NAMESPACE => ‘tenant_fgedu_b’ TYPE => SPACE, LIMIT => 50G
NAMESPACE => ‘tenant_fgedu_b’ TYPE => THROTTLE, LIMIT => 2000req/sec
USER => ‘fgedu_a_app’ TYPE => THROTTLE, LIMIT => 1000req/sec
USER => ‘fgedu_a_app’ TYPE => THROTTLE, THROTTLE_TYPE => READ, LIMIT => 500read/sec
USER => ‘fgedu_a_app’ TYPE => THROTTLE, THROTTLE_TYPE => WRITE, LIMIT => 500write/sec
TABLE => ‘tenant_fgedu_a:user_table’ TYPE => SPACE, LIMIT => 50G
TABLE => ‘tenant_fgedu_a:user_table’ TYPE => THROTTLE, LIMIT => 2000req/sec
9 row(s)
# 6. 查看特定配额
hbase(main):032:0> list_quotas NAMESPACE => ‘tenant_fgedu_a’
OWNER QUOTA
NAMESPACE => ‘tenant_fgedu_a’ TYPE => SPACE, LIMIT => 100G
NAMESPACE => ‘tenant_fgedu_a’ TYPE => THROTTLE, LIMIT => 5000req/sec
2 row(s)
# 7. 删除配额
hbase(main):033:0> set_quota TYPE => THROTTLE, USER => ‘fgedu_a_app’, LIMIT => NONE
Took 0.1234 seconds.
3.3 隔离配置实战
3.3.1 RegionServer分组
$ cat >> /bigdata/app/hbase/conf/hbase-site.xml << 'EOF'
# 2. 重启HBase服务
$ /bigdata/app/hbase/bin/stop-hbase.sh
$ /bigdata/app/hbase/bin/start-hbase.sh
# 3. 创建RSGroup
$ hbase shell
hbase(main):034:0> create_rsgroup ‘group_fgedu_a’
Took 0.1234 seconds.
hbase(main):035:0> create_rsgroup ‘group_fgedu_b’
Took 0.1234 seconds.
# 4. 添加服务器到分组
hbase(main):036:0> move_servers_rsgroup ‘group_fgedu_a’, [‘fgedu-node4’, ‘fgedu-node5’]
Took 0.2345 seconds.
hbase(main):037:0> move_servers_rsgroup ‘group_fgedu_b’, [‘fgedu-node6’, ‘fgedu-node7’]
Took 0.2345 seconds.
# 5. 查看RSGroup
hbase(main):038:0> get_rsgroup ‘group_fgedu_a’
servers: [fgedu-node4, fgedu-node5]
tables: []
configuration: {}
hbase(main):039:0> list_rsgroups
NAME
default
group_fgedu_a
group_fgedu_b
3 row(s)
# 6. 移动表到分组
hbase(main):040:0> move_tables_rsgroup ‘group_fgedu_a’, [‘tenant_fgedu_a:user_table’, ‘tenant_fgedu_a:order_table’]
Took 0.3456 seconds.
hbase(main):041:0> move_tables_rsgroup ‘group_fgedu_b’, [‘tenant_fgedu_b:user_table’]
Took 0.3456 seconds.
# 7. 验证分组
hbase(main):042:0> get_rsgroup ‘group_fgedu_a’
servers: [fgedu-node4, fgedu-node5]
tables: [tenant_fgedu_a:user_table, tenant_fgedu_a:order_table]
configuration: {}
# 8. 移动命名空间到分组
hbase(main):043:0> move_namespace_rsgroup ‘group_fgedu_a’, ‘tenant_fgedu_a’
Took 0.4567 seconds.
Part04-生产案例与实战讲解
4.1 租户管理案例
# 1. 创建租户命名空间
$ hbase shell
hbase(main):044:0> create_namespace ‘tenant_new’,
{‘owner’ => ‘new_company’, ‘purpose’ => ‘新租户’, ‘contact’ => ‘admin@new.com’}
Took 0.1234 seconds.
# 2. 创建租户用户
$ kadmin.local
kadmin.local: addprinc -pw password tenant_new_admin@FGEDU.NET.CN
kadmin.local: addprinc -pw password tenant_new_app@FGEDU.NET.CN
# 3. 授予权限
hbase(main):045:0> grant ‘tenant_new_admin’, ‘A’, ‘@tenant_new’
0 row(s) in 0.1234 seconds.
hbase(main):046:0> grant ‘tenant_new_app’, ‘RW’, ‘@tenant_new’
0 row(s) in 0.1234 seconds.
# 4. 设置配额
hbase(main):047:0> set_quota TYPE => SPACE, NAMESPACE => ‘tenant_new’, LIMIT => ’50G’
Took 0.1234 seconds.
hbase(main):048:0> set_quota TYPE => THROTTLE, NAMESPACE => ‘tenant_new’, LIMIT => ‘2000req/sec’
Took 0.1234 seconds.
# 5. 创建初始表
$ kinit tenant_new_admin@FGEDU.NET.CN
$ hbase shell
hbase(main):049:0> create ‘tenant_new:user_table’, ‘info’
Created table tenant_new:user_table
hbase(main):050:0> create ‘tenant_new:config_table’, ‘info’
Created table tenant_new:config_table
# 6. 验证配置
hbase(main):051:0> list_namespace_tables ‘tenant_new’
TABLE
config_table
user_table
2 row(s)
hbase(main):052:0> user_permission ‘@tenant_new’
User Namespace Table Family Permission
hbase (global) (global) Admin
tenant_new_admin tenant_new (namespace) Admin
tenant_new_app tenant_new (namespace) Read, Write
3 row(s)
4.2 资源管理案例
# 1. 查看命名空间表数量
$ hbase shell
hbase(main):053:0> list_namespace_tables ‘tenant_fgedu_a’
TABLE
order_table
user_table
2 row(s)
# 2. 查看表Region数量
hbase(main):054:0> describe ‘tenant_fgedu_a:user_table’
Table tenant_fgedu_a:user_table is ENABLED
tenant_fgedu_a:user_table, {TABLE_ATTRIBUTES => {…}}
COLUMN FAMILIES DESCRIPTION
{NAME => ‘info’, …}
{NAME => ‘detail’, …}
# 3. 查看表存储大小
$ hdfs dfs -du -h /hbase/data/tenant_fgedu_a/
1.5G /hbase/data/tenant_fgedu_a/user_table
500M /hbase/data/tenant_fgedu_a/order_table
# 4. 查看配额使用情况
hbase(main):055:0> list_quotas NAMESPACE => ‘tenant_fgedu_a’
OWNER QUOTA
NAMESPACE => ‘tenant_fgedu_a’ TYPE => SPACE, LIMIT => 100G
NAMESPACE => ‘tenant_fgedu_a’ TYPE => THROTTLE, LIMIT => 5000req/sec
# 5. 监控请求频率
$ cat > /tmp/monitor_quota.sh << 'EOF'
#!/bin/bash
# monitor_quota.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
echo "监控租户配额使用情况"
echo "===================="
# 获取当前时间
NOW=$(date '+%Y-%m-%d %H:%M:%S')
echo "时间: $NOW"
# 查看配额
echo "配额列表:"
hbase shell << 'HBASE'
list_quotas
HBASE
# 查看存储使用
echo "存储使用:"
hdfs dfs -du -h /hbase/data/tenant_fgedu_a/
hdfs dfs -du -h /hbase/data/tenant_fgedu_b/
echo "监控完成"
EOF
$ chmod +x /tmp/monitor_quota.sh
$ /tmp/monitor_quota.sh
监控租户配额使用情况
====================
时间: 2026-04-08 15:00:00
配额列表:
...
存储使用:
1.5G /hbase/data/tenant_fgedu_a/user_table
500M /hbase/data/tenant_fgedu_a/order_table
800M /hbase/data/tenant_fgedu_b/user_table
监控完成
# 6. 配额告警脚本
$ cat > /tmp/quota_alert.sh << 'EOF'
#!/bin/bash
# quota_alert.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
NAMESPACE=$1
QUOTA_GB=$2
# 获取当前使用量
USAGE=$(hdfs dfs -du /hbase/data/$NAMESPACE | awk '{sum+=$1} END {print sum/1024/1024/1024}')
# 计算使用率
USAGE_RATE=$(echo "scale=2; $USAGE / $QUOTA_GB * 100" | bc)
echo "命名空间: $NAMESPACE"
echo "配额: ${QUOTA_GB}GB"
echo "使用量: ${USAGE}GB"
echo "使用率: ${USAGE_RATE}%"
# 判断是否超过阈值
if [ $(echo "$USAGE_RATE > 80″ | bc) -eq 1 ]; then
echo “告警: 存储使用率超过80%”
# 发送告警通知
fi
EOF
$ chmod +x /tmp/quota_alert.sh
$ /tmp/quota_alert.sh tenant_fgedu_a 100
命名空间: tenant_fgedu_a
配额: 100GB
使用量: 2.0GB
使用率: 2.00%
4.3 常见问题处理
4.3.1 配额超限
ERROR: org.apache.hadoop.hbase.quotas.ThrottlingException: Request quota exceeded
# 排查步骤
# 1. 查看当前配额
hbase(main):056:0> list_quotas USER => ‘fgedu_a_app’
# 2. 查看请求频率
$ hbase shell
hbase(main):057:0> list_quotas USER => ‘fgedu_a_app’
OWNER QUOTA
USER => ‘fgedu_a_app’ TYPE => THROTTLE, LIMIT => 1000req/sec
# 解决方案
# 1. 调整配额
hbase(main):058:0> set_quota TYPE => THROTTLE, USER => ‘fgedu_a_app’, LIMIT => ‘2000req/sec’
# 2. 优化请求
– 批量操作
– 减少请求频率
– 使用缓存
4.3.2 权限问题
ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Permission denied
# 排查步骤
# 1. 检查当前用户
$ klist
# 2. 检查权限
hbase(main):059:0> user_permission ‘@tenant_fgedu_a’
# 解决方案
# 1. 授予权限
hbase(main):060:0> grant ‘fgedu_a_app’, ‘RW’, ‘@tenant_fgedu_a’
# 2. 检查表权限
hbase(main):061:0> user_permission ‘tenant_fgedu_a:user_table’
Part05-风哥经验总结与分享
5.1 多租户最佳实践
多租户最佳实践建议:
1. 合理规划租户级别
2. 配置合适的隔离方式
3. 设置合理的资源配额
4. 定期监控资源使用
5. 及时调整配额
5.2 管理建议
管理建议:
- 建立租户管理流程
- 定期审查配额使用
- 监控租户性能
- 及时处理租户问题
5.3 工具推荐
多租户管理工具:
- HBase Shell:命名空间和配额管理
- RSGroup:资源隔离
- Ranger:权限管理
- 监控工具:资源监控
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
