Skip to content

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.0Oracle 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';

租户管理最佳实践

租户创建最佳实践

  1. 合理规划资源

    • 根据业务需求估算 CPU、内存、存储需求
    • 为租户分配足够的资源,避免资源不足影响性能
    • 考虑未来业务增长,预留适当的扩展空间
  2. 选择合适的租户模式

    • 根据应用程序的数据库类型选择 MySQL 或 Oracle 模式
    • 考虑应用程序的兼容性要求
    • 评估迁移成本和复杂度
  3. 配置资源隔离

    • 为每个租户配置独立的资源池
    • 合理设置资源隔离参数
    • 避免租户之间资源竞争

租户日常管理

  1. 监控租户状态

    • 定期查看租户的 CPU、内存、存储使用率
    • 监控租户的 QPS、TPS、响应时间
    • 关注租户的告警信息
  2. 优化资源配置

    • 根据业务负载调整资源分配
    • 高峰时段适当增加资源
    • 低峰时段适当减少资源
  3. 定期备份

    • 定期备份租户数据
    • 测试备份数据的可恢复性
    • 确保备份策略符合 RTO 和 RPO 要求

租户扩展最佳实践

  1. 横向扩展

    • 增加资源池中的资源单元数量
    • 扩展到新的可用区或节点
    • 重新分布副本
  2. 纵向扩展

    • 增加资源单元的 CPU、内存配置
    • 提高资源池的资源配额
    • 调整资源隔离参数
  3. 扩展注意事项

    • 扩展过程中监控系统性能
    • 避免在业务高峰时段扩展
    • 扩展完成后验证业务可用性

租户模式转换

转换条件

  • 租户处于正常状态,没有正在执行的任务
  • 租户数据量适中,转换时间在可接受范围内
  • 应用程序能够适应目标模式的语法和特性差异

转换步骤

  1. 备份租户数据

    sql
    -- 备份租户数据
    BACKUP TENANT mysql_tenant TO 'oss://backup-bucket/mysql_tenant_backup';
  2. 停止租户服务

    sql
    -- 停止租户服务
    ALTER TENANT mysql_tenant SUSPEND;
  3. 执行模式转换

    sql
    -- 转换为 Oracle 模式
    ALTER TENANT mysql_tenant CONVERT TO ORACLE MODE;
  4. 启动租户服务

    sql
    -- 启动租户服务
    ALTER TENANT mysql_tenant RESUME;
  5. 验证转换结果

    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 错误

解决方案

  1. 增加资源分配

    sql
    -- 增加资源单元配置
    ALTER RESOURCE UNIT mysql_unit MAX_CPU = 8, MEMORY_SIZE = '16G';
    
    -- 增加租户存储配额
    ALTER TENANT mysql_tenant SET max_storage_size = '2T';
  2. 优化业务查询

    • 优化慢 SQL
    • 增加索引
    • 调整查询逻辑
  3. 清理无用数据

    • 删除过期数据
    • 清理临时表
    • 优化表结构

租户连接数过多

症状

  • 应用程序无法连接到租户
  • 报错信息包含 "Too many connections"
  • 租户连接数达到上限

解决方案

  1. 增加连接数限制

    sql
    ALTER TENANT mysql_tenant SET max_connections = 2000;
  2. 优化连接池配置

    • 调整应用程序连接池参数
    • 减少连接超时时间
    • 启用连接复用
  3. 清理空闲连接

    sql
    -- 查看空闲连接
    SELECT * FROM oceanbase.gv$session WHERE status = 'IDLE' AND tenant_name = 'mysql_tenant';
    
    -- 清理空闲连接(谨慎操作)
    KILL SESSION 'session_id';

租户性能下降

症状

  • QPS/TPS 下降
  • 响应时间变长
  • 资源使用率增加
  • 出现慢 SQL

解决方案

  1. 分析性能瓶颈

    • 查看慢 SQL 日志
    • 分析执行计划
    • 检查资源使用率
  2. 优化 SQL 查询

    • 重写慢 SQL
    • 增加或调整索引
    • 优化表结构
  3. 调整资源配置

    • 增加租户资源
    • 调整资源隔离参数
    • 优化存储配置

常见问题(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: 删除租户的步骤:

  1. 确认租户不再使用
  2. 备份租户数据(可选)
  3. 停止租户服务
  4. 执行删除命令
  5. 验证删除结果
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 = '%';