外观
OceanBase 租户类型
系统租户
系统租户定义
系统租户(sys 租户)是 OceanBase 集群中默认创建的特殊租户,用于集群的管理和维护。它拥有最高的权限,可以管理所有普通租户和集群资源。
系统租户特点
- 默认创建:集群部署完成后自动创建
- 最高权限:拥有所有系统级权限
- 管理功能:负责集群级别的配置和管理
- 资源隔离:拥有独立的资源分配,不与普通租户共享资源
- 监控功能:可以监控所有租户的运行状态
系统租户使用场景
- 集群配置管理:修改集群级别的配置参数
- 租户管理:创建、删除、修改普通租户
- 资源管理:创建和管理资源池
- 用户管理:创建和管理系统级用户
- 监控和审计:查看所有租户的监控数据和审计日志
系统租户配置
系统租户资源配置
sql
-- 查看系统租户资源配置
SELECT * FROM oceanbase.gv$tenant_resource_info WHERE tenant_name = 'sys';
-- 修改系统租户资源配置
ALTER TENANT sys RESOURCE_POOL_LIST = ('sys_pool');
-- 查看资源池配置
SELECT * FROM oceanbase.dba_resource_pools WHERE pool_name = 'sys_pool';系统租户参数配置
sql
-- 查看系统租户参数
SHOW PARAMETERS LIKE 'tenant%' FROM sys;
-- 修改系统租户参数
ALTER SYSTEM SET tenant_cpu_quota_concurrency = 1000 TENANT = sys;普通租户
MySQL 模式租户
特点
- 兼容 MySQL 协议:支持 MySQL 客户端和应用程序直接访问
- 语法兼容:支持大部分 MySQL 语法和函数
- 数据类型兼容:支持 MySQL 常用数据类型
- 索引类型兼容:支持 MySQL 索引类型
- 存储引擎:使用 OceanBase 自研的存储引擎
创建示例
sql
-- 创建资源池
CREATE RESOURCE POOL mysql_pool
UNITS = ('mysql_unit_1', 'mysql_unit_2', 'mysql_unit_3')
UNIT_NUM = 3
ZONE_LIST = ('zone1', 'zone2', 'zone3');
-- 创建 MySQL 模式租户
CREATE TENANT mysql_tenant
ENGINE_TYPE = 'mysql'
RESOURCE_POOL_LIST = ('mysql_pool')
SET ob_tcp_invited_nodes = '%',
ob_compatibility_mode = 'mysql';Oracle 模式租户
特点
- 兼容 Oracle 协议:支持 Oracle 客户端和应用程序直接访问
- 语法兼容:支持大部分 Oracle 语法和函数
- 数据类型兼容:支持 Oracle 常用数据类型
- PL/SQL 支持:支持 PL/SQL 存储过程和触发器
- 存储引擎:使用 OceanBase 自研的存储引擎
创建示例
sql
-- 创建资源池
CREATE RESOURCE POOL oracle_pool
UNITS = ('oracle_unit_1', 'oracle_unit_2', 'oracle_unit_3')
UNIT_NUM = 3
ZONE_LIST = ('zone1', 'zone2', 'zone3');
-- 创建 Oracle 模式租户
CREATE TENANT oracle_tenant
ENGINE_TYPE = 'oracle'
RESOURCE_POOL_LIST = ('oracle_pool')
SET ob_tcp_invited_nodes = '%',
ob_compatibility_mode = 'oracle';租户模式比较
| 特性 | MySQL 模式 | Oracle 模式 |
|---|---|---|
| 协议兼容性 | MySQL 5.7/8.0 | Oracle 11g/12c |
| 语法兼容性 | MySQL 语法 | Oracle 语法 |
| PL/SQL 支持 | 不支持 | 支持 |
| 数据类型 | MySQL 数据类型 | Oracle 数据类型 |
| 函数支持 | MySQL 函数 | Oracle 函数 |
| 索引类型 | B-tree, 全文索引 | B-tree, 位图索引 |
| 事务隔离级别 | 读已提交、可重复读 | 读已提交、可重复读、序列化 |
租户资源隔离
资源隔离机制
CPU 隔离
- CPU 配额:为每个租户分配固定的 CPU 配额
- CPU 权重:通过权重分配空闲 CPU 资源
- CPU 绑定:将租户 CPU 绑定到特定物理 CPU 核心
- CPU 限流:限制租户的 CPU 使用率
内存隔离
- 内存配额:为每个租户分配固定的内存大小
- 内存类型:区分业务内存和系统内存
- 内存限流:限制租户的内存使用率
- 内存回收:自动回收空闲内存
存储隔离
- 表空间隔离:每个租户有独立的表空间
- 存储配额:限制租户的存储使用量
- IO 限流:限制租户的 IO 使用率
- 存储加密:支持租户级别的存储加密
网络隔离
- 连接数限制:限制租户的最大连接数
- 网络带宽限制:限制租户的网络带宽
- 连接超时设置:设置租户的连接超时时间
- IP 白名单:限制可以访问租户的 IP 地址
资源隔离配置
CPU 资源配置
sql
-- 创建 CPU 资源单元
CREATE RESOURCE UNIT cpu_unit
MAX_CPU = 4,
MIN_CPU = 2,
MEMORY_SIZE = '8G';
-- 创建资源池
CREATE RESOURCE POOL cpu_pool
UNITS = ('cpu_unit')
UNIT_NUM = 3
ZONE_LIST = ('zone1', 'zone2', 'zone3');
-- 分配资源池给租户
ALTER TENANT mysql_tenant RESOURCE_POOL_LIST = ('cpu_pool');内存资源配置
sql
-- 创建内存资源单元
CREATE RESOURCE UNIT memory_unit
MEMORY_SIZE = '16G',
MAX_IOPS = 10000,
MIN_IOPS = 5000;
-- 创建资源池
CREATE RESOURCE POOL memory_pool
UNITS = ('memory_unit')
UNIT_NUM = 3
ZONE_LIST = ('zone1', 'zone2', 'zone3');
-- 分配资源池给租户
ALTER TENANT mysql_tenant RESOURCE_POOL_LIST = ('memory_pool');存储资源配置
sql
-- 设置租户存储配额
ALTER TENANT mysql_tenant SET max_storage_size = '1T';
-- 查看租户存储使用情况
SELECT tenant_name, used, max_size FROM oceanbase.gv$tenant_storage_info;
-- 设置租户 IO 限流
ALTER SYSTEM SET tenant_iops_limit = 10000 TENANT = mysql_tenant;网络资源配置
sql
-- 设置租户最大连接数
ALTER TENANT mysql_tenant SET max_connections = 1000;
-- 设置租户连接超时时间
ALTER TENANT mysql_tenant SET connect_timeout = 30;
-- 设置租户 IP 白名单
ALTER TENANT mysql_tenant SET ob_tcp_invited_nodes = '10.0.0.0/24,192.168.0.1';租户管理最佳实践
租户创建最佳实践
合理规划资源:
- 根据业务需求估算 CPU、内存、存储需求
- 为租户分配足够的资源,避免资源不足影响性能
- 考虑未来业务增长,预留适当的扩展空间
选择合适的租户模式:
- 根据应用程序的数据库类型选择 MySQL 或 Oracle 模式
- 考虑应用程序的兼容性要求
- 评估迁移成本和复杂度
配置资源隔离:
- 为每个租户配置独立的资源池
- 合理设置资源隔离参数
- 避免租户之间资源竞争
租户日常管理
监控租户状态:
- 定期查看租户的 CPU、内存、存储使用率
- 监控租户的 QPS、TPS、响应时间
- 关注租户的告警信息
优化资源配置:
- 根据业务负载调整资源分配
- 高峰时段适当增加资源
- 低峰时段适当减少资源
定期备份:
- 定期备份租户数据
- 测试备份数据的可恢复性
- 确保备份策略符合 RTO 和 RPO 要求
租户扩展最佳实践
横向扩展:
- 增加资源池中的资源单元数量
- 扩展到新的可用区或节点
- 重新分布副本
纵向扩展:
- 增加资源单元的 CPU、内存配置
- 提高资源池的资源配额
- 调整资源隔离参数
扩展注意事项:
- 扩展过程中监控系统性能
- 避免在业务高峰时段扩展
- 扩展完成后验证业务可用性
租户模式转换
转换条件
- 租户处于正常状态,没有正在执行的任务
- 租户数据量适中,转换时间在可接受范围内
- 应用程序能够适应目标模式的语法和特性差异
转换步骤
备份租户数据:
sql-- 备份租户数据 BACKUP TENANT mysql_tenant TO 'oss://backup-bucket/mysql_tenant_backup';停止租户服务:
sql-- 停止租户服务 ALTER TENANT mysql_tenant SUSPEND;执行模式转换:
sql-- 转换为 Oracle 模式 ALTER TENANT mysql_tenant CONVERT TO ORACLE MODE;启动租户服务:
sql-- 启动租户服务 ALTER TENANT mysql_tenant RESUME;验证转换结果:
sql-- 验证租户模式 SELECT * FROM oceanbase.dba_tenants WHERE tenant_name = 'mysql_tenant'; -- 测试业务功能 SELECT * FROM test_table LIMIT 10;
租户监控与审计
租户监控
监控指标
- 性能指标:QPS、TPS、响应时间、连接数
- 资源指标:CPU 使用率、内存使用率、存储使用率、IO 使用率
- 集群指标:副本状态、分区状态、事务状态
- 告警指标:资源不足告警、性能异常告警、连接数告警
监控工具
- OCP 监控面板:提供可视化的租户监控界面
- Prometheus + Grafana:支持自定义监控仪表盘
- 系统视图:通过系统视图查询监控数据
常用系统视图
sql
-- 查看租户性能指标
SELECT * FROM oceanbase.gv$tenant_perf WHERE tenant_name = 'mysql_tenant';
-- 查看租户资源使用情况
SELECT * FROM oceanbase.gv$tenant_resource_usage WHERE tenant_name = 'mysql_tenant';
-- 查看租户连接数
SELECT tenant_name, count(*) FROM oceanbase.gv$session GROUP BY tenant_name;租户审计
审计配置
sql
-- 启用租户审计
ALTER TENANT mysql_tenant SET audit_trail = 'DB';
-- 设置审计日志保留时间
ALTER TENANT mysql_tenant SET audit_retention_time = 30;
-- 配置审计规则
CREATE AUDIT POLICY mysql_audit_policy
PRIVILEGES CREATE, ALTER, DROP, DELETE
ACCESS TO TABLES IN SCHEMA 'test_schema';
-- 应用审计策略
AUDIT POLICY mysql_audit_policy BY mysql_user;审计日志查询
sql
-- 查询审计日志
SELECT * FROM oceanbase.dba_audit_trail
WHERE tenant_name = 'mysql_tenant'
AND timestamp > SYSDATE - INTERVAL '7' DAY
ORDER BY timestamp DESC;
-- 查询特定用户的审计日志
SELECT * FROM oceanbase.dba_audit_trail
WHERE username = 'mysql_user'
AND action_name = 'DELETE'
ORDER BY timestamp DESC;常见问题处理
租户资源不足
症状
- 租户 CPU 使用率持续 100%
- 租户内存使用率接近上限
- 租户存储使用率达到配额
- 业务响应时间变长
- 出现 OOM 错误
解决方案
增加资源分配:
sql-- 增加资源单元配置 ALTER RESOURCE UNIT mysql_unit MAX_CPU = 8, MEMORY_SIZE = '16G'; -- 增加租户存储配额 ALTER TENANT mysql_tenant SET max_storage_size = '2T';优化业务查询:
- 优化慢 SQL
- 增加索引
- 调整查询逻辑
清理无用数据:
- 删除过期数据
- 清理临时表
- 优化表结构
租户连接数过多
症状
- 应用程序无法连接到租户
- 报错信息包含 "Too many connections"
- 租户连接数达到上限
解决方案
增加连接数限制:
sqlALTER TENANT mysql_tenant SET max_connections = 2000;优化连接池配置:
- 调整应用程序连接池参数
- 减少连接超时时间
- 启用连接复用
清理空闲连接:
sql-- 查看空闲连接 SELECT * FROM oceanbase.gv$session WHERE status = 'IDLE' AND tenant_name = 'mysql_tenant'; -- 清理空闲连接(谨慎操作) KILL SESSION 'session_id';
租户性能下降
症状
- QPS/TPS 下降
- 响应时间变长
- 资源使用率增加
- 出现慢 SQL
解决方案
分析性能瓶颈:
- 查看慢 SQL 日志
- 分析执行计划
- 检查资源使用率
优化 SQL 查询:
- 重写慢 SQL
- 增加或调整索引
- 优化表结构
调整资源配置:
- 增加租户资源
- 调整资源隔离参数
- 优化存储配置
常见问题(FAQ)
Q1: 系统租户和普通租户的区别是什么?
A1: 系统租户和普通租户的主要区别:
- 权限级别:系统租户拥有最高权限,普通租户只有自己的权限
- 功能用途:系统租户用于集群管理,普通租户用于业务应用
- 资源分配:系统租户拥有独立资源,普通租户资源由系统租户分配
- 管理范围:系统租户可以管理所有租户,普通租户只能管理自己的数据
Q2: 如何选择合适的租户模式?
A2: 选择租户模式的依据:
- 应用程序兼容性:根据应用程序使用的数据库类型选择
- 语法要求:如果应用程序使用 Oracle 特定语法,选择 Oracle 模式
- 迁移成本:考虑从原有数据库迁移的成本和复杂度
- 团队技能:考虑团队对 MySQL 或 Oracle 的熟悉程度
Q3: 如何为租户分配合理的资源?
A3: 为租户分配资源的方法:
- 估算业务需求:根据业务 QPS、TPS、数据量估算资源需求
- 参考经验值:CPU:内存比例建议为 1:4 或 1:8
- 预留扩展空间:为未来业务增长预留 30-50% 的资源
- 监控调整:根据实际运行情况动态调整资源分配
Q4: 如何监控租户的运行状态?
A4: 监控租户运行状态的方法:
- 使用 OCP 监控面板查看租户指标
- 通过系统视图查询监控数据
- 配置 Prometheus + Grafana 自定义监控
- 设置告警规则,及时发现异常
Q5: 如何进行租户的备份和恢复?
A5: 租户备份和恢复的方法:
- 全量备份:使用 BACKUP TENANT 命令进行全量备份
- 增量备份:结合归档日志进行增量备份
- 逻辑备份:使用 mysqldump 或 expdp 进行逻辑备份
- 恢复:使用 RESTORE TENANT 命令进行恢复
Q6: 如何扩展租户资源?
A6: 扩展租户资源的方法:
- 横向扩展:增加资源池中的资源单元数量
- 纵向扩展:增加资源单元的 CPU、内存配置
- 动态扩展:在线调整资源配置,无需停止租户
- 手动扩展:通过 ALTER TENANT 命令调整资源分配
Q7: 租户之间的资源是否会相互影响?
A7: OceanBase 采用严格的资源隔离机制,租户之间的资源默认不会相互影响。但如果集群整体资源不足,可能会导致所有租户性能下降。建议为每个租户配置适当的资源隔离参数,避免租户之间资源竞争。
Q8: 如何删除一个租户?
A8: 删除租户的步骤:
- 确认租户不再使用
- 备份租户数据(可选)
- 停止租户服务
- 执行删除命令
- 验证删除结果
sql
-- 停止租户服务
ALTER TENANT mysql_tenant SUSPEND;
-- 删除租户
DROP TENANT mysql_tenant;
-- 验证删除结果
SELECT * FROM oceanbase.dba_tenants WHERE tenant_name = 'mysql_tenant';Q9: 如何创建只读租户?
A9: 创建只读租户的方法:
sql
-- 创建只读租户
CREATE TENANT readonly_tenant
ENGINE_TYPE = 'mysql'
RESOURCE_POOL_LIST = ('readonly_pool')
READ_ONLY = TRUE
SET ob_tcp_invited_nodes = '%';
-- 或修改现有租户为只读
ALTER TENANT mysql_tenant READ_ONLY = TRUE;Q10: 如何配置租户的 IP 白名单?
A10: 配置租户 IP 白名单的方法:
sql
-- 设置单个 IP
ALTER TENANT mysql_tenant SET ob_tcp_invited_nodes = '192.168.0.1';
-- 设置 IP 段
ALTER TENANT mysql_tenant SET ob_tcp_invited_nodes = '192.168.0.0/24';
-- 设置多个 IP 和 IP 段
ALTER TENANT mysql_tenant SET ob_tcp_invited_nodes = '192.168.0.1,10.0.0.0/24';
-- 允许所有 IP(不推荐)
ALTER TENANT mysql_tenant SET ob_tcp_invited_nodes = '%';