Skip to content

OceanBase 租户创建与管理

租户创建准备

1. 资源规划

在创建租户前,需要进行资源规划,包括:

  • CPU 资源:根据业务负载需求分配 CPU 核数
  • 内存资源:根据数据量和查询复杂度分配内存大小
  • 存储资源:规划租户数据存储位置和容量
  • 网络资源:配置租户网络隔离和访问控制

2. 资源单元创建

创建租户前需要先创建资源单元,定义租户可以使用的资源规格:

sql
-- 创建 CPU 资源单元
CREATE RESOURCE UNIT cpu_unit MAX_CPU 16, MIN_CPU 8, MEMORY_SIZE '32G', MAX_IOPS 10000, MIN_IOPS 5000;

-- 创建内存优化型资源单元
CREATE RESOURCE UNIT memory_unit MAX_CPU 8, MIN_CPU 4, MEMORY_SIZE '64G', MAX_IOPS 20000, MIN_IOPS 10000;

-- 创建 IO 优化型资源单元
CREATE RESOURCE UNIT iops_unit MAX_CPU 12, MIN_CPU 6, MEMORY_SIZE '48G', MAX_IOPS 50000, MIN_IOPS 25000;

3. 资源池创建

创建资源池,将资源单元分配给特定的租户:

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

租户创建流程

1. 创建租户

使用 CREATE TENANT 命令创建租户:

sql
-- 创建 MySQL 租户
CREATE TENANT mysql_tenant
  RESOURCE_POOL_LIST = ('tenant_pool'),
  PRIMARY_ZONE = 'zone1,zone2,zone3',
  LOCALITY = 'F@zone1,F@zone2,F@zone3',
  COMMENT 'MySQL compatible tenant';

-- 创建 Oracle 租户
CREATE TENANT oracle_tenant
  RESOURCE_POOL_LIST = ('tenant_pool'),
  PRIMARY_ZONE = 'zone1,zone2,zone3',
  LOCALITY = 'F@zone1,F@zone2,F@zone3',
  COMMENT 'Oracle compatible tenant',
  TENANT_MODE = 'ORACLE';

2. 配置租户参数

创建租户后,需要配置租户级参数:

sql
-- 切换到租户上下文
ALTER SYSTEM CHANGE TENANT mysql_tenant;

-- 配置租户参数
ALTER SYSTEM SET max_connections = 10000;
ALTER SYSTEM SET open_files_limit = 65535;
ALTER SYSTEM SET sort_buffer_size = '16M';
ALTER SYSTEM SET join_buffer_size = '16M';

3. 创建租户用户

创建租户内部用户并授权:

sql
-- 创建管理员用户
CREATE USER admin IDENTIFIED BY 'password123';

-- 授予管理员权限
GRANT ALL PRIVILEGES ON *.* TO admin WITH GRANT OPTION;

-- 创建普通用户
CREATE USER app_user IDENTIFIED BY 'app_password123';

-- 授予应用用户权限
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO app_user;

租户管理操作

1. 查看租户信息

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

-- 查看租户详细信息
SELECT * FROM oceanbase.DBA_OB_TENANT_STATUS WHERE tenant_name = 'mysql_tenant';

-- 查看租户资源分配
SELECT * FROM oceanbase.DBA_OB_RESOURCE_POOLS WHERE tenant_name = 'mysql_tenant';

2. 修改租户资源

sql
-- 增加租户资源单元
ALTER TENANT mysql_tenant RESOURCE_POOL_LIST = ('tenant_pool', 'additional_pool');

-- 修改租户资源池
ALTER RESOURCE POOL tenant_pool UNIT_NUM = 5;

-- 切换租户主区域
ALTER TENANT mysql_tenant PRIMARY_ZONE = 'zone2,zone3,zone1';

3. 租户状态管理

sql
-- 暂停租户
ALTER TENANT mysql_tenant SUSPEND;

-- 恢复租户
ALTER TENANT mysql_tenant RESUME;

-- 锁定租户
ALTER TENANT mysql_tenant LOCK;

-- 解锁租户
ALTER TENANT mysql_tenant UNLOCK;

4. 删除租户

sql
-- 删除租户(谨慎操作)
DROP TENANT mysql_tenant FORCE;

租户权限管理

1. 角色管理

sql
-- 创建角色
CREATE ROLE read_only_role;
CREATE ROLE write_role;

-- 授予角色权限
GRANT SELECT ON *.* TO read_only_role;
GRANT INSERT, UPDATE, DELETE ON *.* TO write_role;

-- 授予角色给用户
GRANT read_only_role TO app_user;
GRANT write_role TO admin_user;

2. 权限回收

sql
-- 回收用户权限
REVOKE DELETE ON app_db.* FROM app_user;

-- 回收角色权限
REVOKE SELECT ON *.* FROM read_only_role;

3. 权限审计

sql
-- 查看用户权限
SHOW GRANTS FOR app_user;

-- 查看角色权限
SHOW GRANTS FOR read_only_role;

租户监控与维护

1. 租户状态监控

sql
-- 查看租户 CPU 使用情况
SELECT * FROM oceanbase.GV$OB_TENANT_STAT WHERE tenant_name = 'mysql_tenant' AND stat_id = 'cpu_total';

-- 查看租户内存使用情况
SELECT * FROM oceanbase.GV$OB_TENANT_MEMORY WHERE tenant_name = 'mysql_tenant';

-- 查看租户 IO 情况
SELECT * FROM oceanbase.GV$OB_TENANT_IO WHERE tenant_name = 'mysql_tenant';

2. 租户日志管理

sql
-- 查看租户错误日志
SELECT * FROM oceanbase.GV$OB_ERROR_LOG WHERE tenant_name = 'mysql_tenant' ORDER BY log_time DESC;

-- 查看租户慢查询日志
SELECT * FROM oceanbase.GV$OB_SLOW_QUERY WHERE tenant_name = 'mysql_tenant' ORDER BY query_time DESC;

3. 租户备份恢复

sql
-- 创建租户级备份
BACKUP TENANT mysql_tenant TO 'backup_location' WITH SNAPSHOT;

-- 恢复租户
RESTORE TENANT mysql_tenant FROM 'backup_location' WITH SNAPSHOT 'snapshot_id';

租户创建最佳实践

1. 资源配置最佳实践

  • 按业务类型选择合适的资源单元类型
  • 根据业务增长预留 30-50% 的资源余量
  • 对于读写分离场景,为只读租户分配独立资源池
  • 定期调整资源配置,根据业务负载变化进行优化

2. 租户隔离最佳实践

  • 不同业务线使用独立租户,实现完全隔离
  • 生产环境和测试环境使用不同租户
  • 敏感业务使用独立租户,并配置严格的访问控制

3. 权限管理最佳实践

  • 遵循最小权限原则,只授予必要的权限
  • 使用角色管理权限,便于权限回收和调整
  • 定期审计用户权限,移除不必要的权限
  • 配置强密码策略,定期更换密码

4. 监控与告警最佳实践

  • 为每个租户配置独立的监控指标
  • 设置合理的告警阈值,及时发现异常
  • 定期分析租户性能数据,优化资源配置
  • 建立租户级别的故障处理流程

常见问题(FAQ)

Q1: 创建租户失败的常见原因有哪些?

A1: 创建租户失败的常见原因包括:

  • 资源池资源不足
  • 区域配置错误
  • 权限不足
  • 参数配置不合理
  • 集群状态不稳定

Q2: 如何选择合适的资源单元类型?

A2: 资源单元类型选择建议:

  • CPU 密集型业务:选择 CPU 优化型资源单元
  • 内存密集型业务:选择内存优化型资源单元
  • IO 密集型业务:选择 IO 优化型资源单元
  • 混合负载:选择均衡型资源单元

Q3: 如何调整租户资源?

A3: 调整租户资源的方法:

  • 增加资源池中的资源单元数量
  • 扩大资源单元的规格
  • 为租户添加新的资源池
  • 调整资源池的区域分布

Q4: 如何实现租户级别的备份恢复?

A4: 租户级备份恢复步骤:

  1. 配置备份策略
  2. 执行租户级备份
  3. 验证备份完整性
  4. 在需要时执行租户恢复

Q5: 如何监控租户的性能?

A5: 监控租户性能的方法:

  • 使用 OceanBase 内置视图监控租户指标
  • 配置第三方监控工具(如 Prometheus + Grafana)
  • 设置性能告警阈值
  • 定期分析性能报告