Skip to content

OceanBase 多租户架构

核心概念

OceanBase的多租户架构允许在单个集群中运行多个独立的数据库实例,每个实例称为一个租户。租户之间实现了严格的资源隔离和安全隔离。

租户类型

  1. 系统租户

    • 内置管理租户,用于管理整个集群
    • 拥有最高权限
    • 负责集群级配置和管理
  2. 普通租户

    • 用户创建的业务租户
    • 分为MySQL模式和Oracle模式
    • 共享集群资源,但相互隔离

多租户优势

  • 资源利用率高:多个租户共享底层硬件资源
  • 成本降低:减少硬件和运维成本
  • 快速部署:可以快速创建和销毁租户
  • 灵活扩展:支持租户资源的动态调整
  • 隔离性好:租户间资源和数据严格隔离

租户隔离机制

1. 资源隔离

  • CPU隔离:通过CPU配额和权重实现CPU资源隔离
  • 内存隔离:为每个租户分配独立的内存资源池
  • 存储隔离:每个租户有独立的表空间和数据文件
  • IO隔离:通过IOPS配额和权重实现IO资源隔离

2. 安全隔离

  • 数据隔离:租户间数据完全隔离,无法直接访问
  • 权限隔离:每个租户有独立的用户和权限系统
  • 网络隔离:租户间网络流量隔离
  • 配置隔离:租户可独立配置参数

3. 元数据隔离

  • 租户元数据独立:每个租户有独立的元数据
  • 系统表隔离:每个租户有自己的系统表
  • 配置表隔离:每个租户有自己的配置表

租户管理

创建租户

sql
-- 创建MySQL模式租户
CREATE TENANT IF NOT EXISTS tenant_mysql 
  CHARSET = 'utf8mb4', 
  PRIMARY_ZONE = 'zone1', 
  RESOURCE_POOL_LIST = ('pool1'),
  COMMENT 'MySQL tenant'
SET ob_tcp_invited_nodes = '%', 
    ob_compatibility_mode = 'mysql';

-- 创建Oracle模式租户
CREATE TENANT IF NOT EXISTS tenant_oracle 
  CHARSET = 'utf8mb4', 
  PRIMARY_ZONE = 'zone1', 
  RESOURCE_POOL_LIST = ('pool2'),
  COMMENT 'Oracle tenant'
SET ob_tcp_invited_nodes = '%', 
    ob_compatibility_mode = 'oracle';

查看租户

sql
-- 查看所有租户
SELECT * FROM oceanbase.DBA_OB_TENANTS;

-- 查看租户详细信息
SELECT * FROM oceanbase.DBA_OB_TENANT_STATUS;

修改租户

sql
-- 修改租户资源池
ALTER TENANT tenant_mysql RESOURCE_POOL_LIST = ('pool1', 'pool2');

-- 修改租户参数
ALTER TENANT tenant_mysql SET ob_tcp_invited_nodes = '192.168.1.%';

删除租户

sql
-- 删除租户
DROP TENANT tenant_mysql;

资源池管理

创建资源池

sql
-- 创建资源池
CREATE RESOURCE POOL pool1 
  UNIT = 'unit1', 
  UNIT_NUM = 3, 
  ZONE_LIST = ('zone1', 'zone2', 'zone3');

创建资源单元

sql
-- 创建资源单元
CREATE RESOURCE UNIT unit1 
  MAX_CPU = 4, 
  MIN_CPU = 4, 
  MEMORY_SIZE = '8G', 
  LOG_DISK_SIZE = '20G',
  MAX_IOPS = 10000, 
  MIN_IOPS = 5000, 
  IOPS_WEIGHT = 100;

查看资源池

sql
-- 查看资源池
SELECT * FROM oceanbase.DBA_OB_RESOURCE_POOLS;

-- 查看资源单元
SELECT * FROM oceanbase.DBA_OB_RESOURCE_UNITS;

租户备份与恢复

租户级备份

sql
-- 备份租户
BACKUP TENANT tenant_mysql TO 'backup_path' BACKUPSET 'backup_set_name';

-- 查看备份集
SELECT * FROM oceanbase.DBA_OB_BACKUP_SETS;

租户级恢复

sql
-- 恢复租户
RESTORE TENANT tenant_mysql FROM 'backup_path' BACKUPSET 'backup_set_name';

-- 恢复到指定时间点
RESTORE TENANT tenant_mysql FROM 'backup_path' BACKUPSET 'backup_set_name' UNTIL TIME '2023-01-01 12:00:00';

租户监控与运维

租户监控指标

指标类别关键指标描述
资源使用CPU使用率、内存使用率、IOPS、存储使用率租户资源使用情况
性能指标QPS、TPS、响应时间、慢查询数租户性能情况
连接状态连接数、活跃连接数、连接成功率租户连接情况
事务状态活跃事务数、死锁数、事务响应时间租户事务情况

监控视图

sql
-- 查看租户性能指标
SELECT * FROM oceanbase.GV$OB_TENANT_PERFORMANCE;

-- 查看租户资源使用情况
SELECT * FROM oceanbase.GV$OB_TENANT_RESOURCE_USAGE;

-- 查看租户连接情况
SELECT * FROM oceanbase.GV$OB_TENANT_CONNECTIONS;

最佳实践

1. 租户规划

  • 合理规划资源:根据业务需求分配资源
  • 考虑扩展性:预留资源以应对业务增长
  • 隔离关键业务:将关键业务部署在独立租户
  • 模式选择:根据业务需求选择MySQL或Oracle模式

2. 资源配置

  • 资源单元设计:根据业务负载设计合适的资源单元
  • 资源池分布:确保资源池在多个可用区分布
  • 动态调整:根据业务负载动态调整资源
  • 监控告警:配置资源使用的监控告警

3. 备份策略

  • 定期备份:制定合理的备份计划
  • 多副本备份:将备份存储在多个位置
  • 测试恢复:定期测试备份的恢复能力
  • 增量备份:结合全量和增量备份

4. 性能优化

  • SQL优化:优化租户内的SQL语句
  • 索引优化:合理设计索引
  • 连接管理:优化应用程序的连接管理
  • 参数调优:根据业务特点调整租户参数

常见问题(FAQ)

Q1: 租户之间的资源是如何隔离的?

A1: OceanBase通过多层隔离机制实现租户间的资源隔离:

  • CPU隔离:通过CPU配额和权重
  • 内存隔离:为每个租户分配独立的内存池
  • 存储隔离:每个租户有独立的表空间
  • IO隔离:通过IOPS配额和权重

Q2: 如何选择租户的资源配置?

A2: 租户资源配置应根据业务需求确定:

  • 评估业务的CPU、内存、存储和IO需求
  • 考虑业务的峰值负载
  • 预留一定的资源余量
  • 建议从小配置开始,根据实际情况动态调整

Q3: 租户支持哪些数据库模式?

A3: OceanBase支持两种数据库模式:

  • MySQL模式:兼容MySQL语法和协议
  • Oracle模式:兼容Oracle语法和协议

Q4: 如何监控租户的资源使用情况?

A4: 可以通过以下方式监控租户资源使用:

  • 使用OCP进行图形化监控
  • 查询系统视图GV$OB_TENANT_RESOURCE_USAGE
  • 配置资源使用的告警规则

Q5: 租户可以跨可用区部署吗?

A5: 可以。OceanBase支持将租户的资源池分布在多个可用区,提高租户的可用性和容灾能力。在创建资源池时,可以通过ZONE_LIST指定多个可用区。