Skip to content

OceanBase 资源池创建与管理

资源池基本概念

资源池是 OceanBase 中用于管理和分配资源的基本单位,由多个资源单元组成。资源池将资源分配给租户,实现资源的隔离和管理。

1. 资源单元

资源单元定义了一组资源规格,包括 CPU、内存、IOPS 等资源的上下限。一个资源池由多个相同规格的资源单元组成。

2. 资源池

资源池是资源单元的集合,将资源分配给特定的租户。每个资源池可以包含一个或多个资源单元,分布在一个或多个区域(Zone)中。

资源单元创建

1. 创建资源单元

sql
-- 创建基础资源单元
CREATE RESOURCE UNIT basic_unit 
  MAX_CPU 4, 
  MIN_CPU 2, 
  MEMORY_SIZE '8G', 
  MAX_IOPS 5000, 
  MIN_IOPS 2500, 
  IOPS_WEIGHT 1, 
  LOG_DISK_SIZE '20G';

-- 创建 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;

2. 资源单元参数说明

参数名描述示例值
MAX_CPU资源单元的最大 CPU 核数16
MIN_CPU资源单元的最小 CPU 核数8
MEMORY_SIZE资源单元的内存大小'32G'
MAX_IOPS资源单元的最大 IOPS10000
MIN_IOPS资源单元的最小 IOPS5000
IOPS_WEIGHTIOPS 权重,用于计算 IO 资源分配比例1
LOG_DISK_SIZE日志磁盘大小'20G'

3. 修改资源单元

sql
-- 修改资源单元规格
ALTER RESOURCE UNIT basic_unit 
  MAX_CPU 8, 
  MIN_CPU 4, 
  MEMORY_SIZE '16G', 
  MAX_IOPS 10000, 
  MIN_IOPS 5000;

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

资源池创建

1. 创建资源池

sql
-- 创建基础资源池
CREATE RESOURCE POOL basic_pool 
  UNIT 'basic_unit', 
  UNIT_NUM 3, 
  ZONE_LIST ('zone1', 'zone2', 'zone3');

-- 创建单区域资源池
CREATE RESOURCE POOL zone1_pool 
  UNIT 'cpu_unit', 
  UNIT_NUM 5, 
  ZONE_LIST ('zone1');

-- 创建多区域资源池
CREATE RESOURCE POOL multi_zone_pool 
  UNIT 'memory_unit', 
  UNIT_NUM 2, 
  ZONE_LIST ('zone1', 'zone2', 'zone3');

-- 创建指定副本分布的资源池
CREATE RESOURCE POOL replica_pool 
  UNIT 'iops_unit', 
  UNIT_NUM 3, 
  ZONE_LIST ('zone1', 'zone2', 'zone3'), 
  REPLICA_DISTRIBUTION = '1:1:1';

2. 资源池参数说明

参数名描述示例值
UNIT资源单元名称'basic_unit'
UNIT_NUM每个区域的资源单元数量3
ZONE_LIST资源池分布的区域列表('zone1', 'zone2', 'zone3')
REPLICA_DISTRIBUTION副本分布比例'1:1:1'

3. 查看资源池信息

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

-- 查看资源池详细信息
SELECT * FROM oceanbase.DBA_OB_RESOURCE_POOL_DETAILS;

-- 查看资源池与租户的关联关系
SELECT * FROM oceanbase.DBA_OB_TENANT_RESOURCE_POOLS;

资源池调整

1. 调整资源池大小

sql
-- 增加资源池中的资源单元数量
ALTER RESOURCE POOL basic_pool UNIT_NUM = 5;

-- 减少资源池中的资源单元数量
ALTER RESOURCE POOL basic_pool UNIT_NUM = 2;

-- 修改资源池使用的资源单元
ALTER RESOURCE POOL basic_pool UNIT = 'cpu_unit';

-- 同时修改资源单元和数量
ALTER RESOURCE POOL basic_pool UNIT = 'memory_unit', UNIT_NUM = 4;

2. 调整资源池分布

sql
-- 向资源池添加区域
ALTER RESOURCE POOL basic_pool ADD ZONE ('zone4');

-- 从资源池移除区域
ALTER RESOURCE POOL basic_pool REMOVE ZONE ('zone4');

-- 修改资源池的区域列表
ALTER RESOURCE POOL basic_pool ZONE_LIST = ('zone1', 'zone2', 'zone3', 'zone4');

3. 调整资源池的副本分布

sql
-- 修改资源池的副本分布
ALTER RESOURCE POOL replica_pool REPLICA_DISTRIBUTION = '2:2:2';

资源池与租户关联

1. 创建租户时关联资源池

sql
-- 创建租户时关联多个资源池
CREATE TENANT mysql_tenant
  RESOURCE_POOL_LIST = ('basic_pool', 'zone1_pool')
  PRIMARY_ZONE = 'zone1,zone2,zone3'
  LOCALITY = 'F@zone1,F@zone2,F@zone3'
  TENANT_MODE = 'MYSQL';

2. 向现有租户添加资源池

sql
-- 向现有租户添加资源池
ALTER TENANT mysql_tenant ADD RESOURCE POOL_LIST = ('multi_zone_pool');

-- 从现有租户移除资源池
ALTER TENANT mysql_tenant REMOVE RESOURCE POOL_LIST = ('zone1_pool');

-- 修改租户的资源池列表
ALTER TENANT mysql_tenant RESOURCE_POOL_LIST = ('basic_pool', 'multi_zone_pool');

资源池删除

1. 删除资源池

sql
-- 删除未关联租户的资源池
DROP RESOURCE POOL unused_pool;

-- 强制删除资源池(谨慎使用)
DROP RESOURCE POOL used_pool FORCE;

2. 删除资源单元

sql
-- 删除未被资源池使用的资源单元
DROP RESOURCE UNIT unused_unit;

-- 查看资源单元的使用情况
SELECT * FROM oceanbase.DBA_OB_RESOURCE_UNIT_USAGE;

资源池管理最佳实践

1. 资源规划

  • 根据业务需求规划资源:根据业务负载和增长预期,合理规划资源规格和数量
  • 考虑峰值负载:资源规格应能满足业务峰值负载需求
  • 预留扩展空间:资源池应预留足够的扩展空间,以应对业务增长
  • 资源隔离:不同业务类型的租户应使用独立的资源池,实现资源隔离

2. 资源单元设计

  • 标准化资源单元:创建标准化的资源单元,便于管理和调整
  • 分层设计:根据业务重要性和负载特点,设计不同层级的资源单元
  • 合理设置资源上下限
    • MAX_CPU 和 MIN_CPU 差距不宜过大,建议为 2:1
    • MEMORY_SIZE 根据业务需求和数据量设置
    • IOPS 配置应与存储性能匹配

3. 资源池设计

  • 多区域分布:生产环境建议将资源池分布在多个区域,提高可用性
  • 合理设置资源单元数量:每个区域的资源单元数量应根据节点数量和负载情况确定
  • 考虑副本分布:根据数据安全要求,合理设置副本分布比例
  • 资源池与租户匹配:根据租户的业务类型和负载特点,匹配合适的资源池

4. 资源调整

  • 定期评估资源使用情况:定期检查资源使用情况,及时调整资源配置
  • 避免频繁调整:资源调整会影响租户性能,应避免频繁调整
  • 分批调整:对于大规格资源调整,建议分批进行,减少影响
  • 调整前备份:重要业务调整前,建议备份数据,确保数据安全

5. 监控与告警

  • 监控资源使用情况:设置资源使用告警,及时发现资源瓶颈
  • 监控资源池状态:监控资源池的分布和使用情况
  • 设置合理的告警阈值
    • CPU 使用率:建议 80% 告警
    • 内存使用率:建议 85% 告警
    • IOPS 使用率:建议 90% 告警

资源池管理示例

1. 完整的资源池创建流程

sql
-- 1. 创建资源单元
CREATE RESOURCE UNIT app_unit 
  MAX_CPU 8, 
  MIN_CPU 4, 
  MEMORY_SIZE '16G', 
  MAX_IOPS 10000, 
  MIN_IOPS 5000;

-- 2. 创建资源池
CREATE RESOURCE POOL app_pool 
  UNIT 'app_unit', 
  UNIT_NUM 3, 
  ZONE_LIST ('zone1', 'zone2', 'zone3');

-- 3. 创建租户并关联资源池
CREATE TENANT app_tenant
  RESOURCE_POOL_LIST = ('app_pool')
  PRIMARY_ZONE = 'zone1,zone2,zone3'
  LOCALITY = 'F@zone1,F@zone2,F@zone3'
  TENANT_MODE = 'MYSQL';

-- 4. 调整资源池大小
ALTER RESOURCE POOL app_pool UNIT_NUM = 5;

-- 5. 查看资源使用情况
SELECT * FROM oceanbase.GV$OB_TENANT_STAT WHERE tenant_name = 'app_tenant';

2. 资源池扩展示例

sql
-- 1. 创建新的资源单元
CREATE RESOURCE UNIT app_unit_large 
  MAX_CPU 16, 
  MIN_CPU 8, 
  MEMORY_SIZE '32G', 
  MAX_IOPS 20000, 
  MIN_IOPS 10000;

-- 2. 创建新的资源池
CREATE RESOURCE POOL app_pool_large 
  UNIT 'app_unit_large', 
  UNIT_NUM 3, 
  ZONE_LIST ('zone1', 'zone2', 'zone3');

-- 3. 向现有租户添加新资源池
ALTER TENANT app_tenant ADD RESOURCE POOL_LIST = ('app_pool_large');

-- 4. 移除旧资源池(可选)
ALTER TENANT app_tenant REMOVE RESOURCE POOL_LIST = ('app_pool');

3. 资源池迁移示例

sql
-- 1. 创建目标资源池
CREATE RESOURCE POOL target_pool 
  UNIT 'app_unit', 
  UNIT_NUM 3, 
  ZONE_LIST ('zone2', 'zone3', 'zone4');

-- 2. 向租户添加目标资源池
ALTER TENANT app_tenant ADD RESOURCE POOL_LIST = ('target_pool');

-- 3. 等待资源迁移完成
SELECT * FROM oceanbase.GV$OB_TENANT_RESOURCE_MIGRATION;

-- 4. 移除原资源池
ALTER TENANT app_tenant REMOVE RESOURCE POOL_LIST = ('app_pool');

常见问题处理

1. 资源池创建失败

故障现象:创建资源池时失败,提示资源不足或配置错误

排查步骤

sql
-- 查看区域资源使用情况
SELECT * FROM oceanbase.GV$OB_ZONE_RESOURCE_STAT;

-- 查看节点资源使用情况
SELECT * FROM oceanbase.GV$OB_SERVER_RESOURCE_STAT;

-- 检查资源单元配置
SELECT * FROM oceanbase.DBA_OB_RESOURCE_UNITS WHERE name = 'resource_unit_name';

解决方案

  • 检查区域资源是否充足
  • 调整资源单元规格,减少资源需求
  • 增加区域中的节点数量
  • 检查资源池配置参数是否正确

2. 资源调整失败

故障现象:调整资源池时失败,提示租户正在使用或配置错误

排查步骤

sql
-- 查看资源池关联的租户
SELECT * FROM oceanbase.DBA_OB_TENANT_RESOURCE_POOLS WHERE resource_pool_name = 'pool_name';

-- 查看租户状态
SELECT * FROM oceanbase.DBA_OB_TENANTS WHERE tenant_name = 'tenant_name';

解决方案

  • 确认租户状态正常
  • 检查资源池是否被租户使用
  • 对于正在使用的资源池,考虑使用在线调整
  • 检查调整参数是否正确

3. 资源使用不均衡

故障现象:资源池中的资源使用不均衡,部分资源单元使用率高,部分使用率低

排查步骤

sql
-- 查看资源单元使用情况
SELECT * FROM oceanbase.GV$OB_RESOURCE_UNIT_STAT;

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

解决方案

  • 调整资源池中的资源单元数量
  • 重新分布资源单元
  • 考虑使用资源池迁移
  • 优化租户的资源使用

常见问题(FAQ)

Q1: 如何确定资源单元的规格?

A1: 确定资源单元规格的方法:

  • 根据业务负载特点,评估 CPU、内存、IOPS 需求
  • 参考类似业务的资源配置
  • 进行压力测试,确定最佳配置
  • 预留 20-30% 的资源余量

Q2: 每个资源池应该包含多少个资源单元?

A2: 资源单元数量建议:

  • 每个区域的资源单元数量应根据节点数量确定
  • 建议每个节点至少包含 1 个资源单元
  • 生产环境建议每个区域至少包含 2-3 个资源单元
  • 根据业务负载增长预期,预留扩展空间

Q3: 如何实现资源的动态调整?

A3: 实现资源动态调整的方法:

  • 使用 ALTER RESOURCE POOL 命令调整资源单元数量
  • 使用 ALTER RESOURCE UNIT 命令调整资源单元规格
  • 对于大规格调整,建议使用资源池迁移方式
  • 结合监控系统,实现自动资源调整

Q4: 资源池和租户的关系是什么?

A4: 资源池和租户的关系:

  • 一个资源池可以分配给一个或多个租户
  • 一个租户可以使用一个或多个资源池
  • 资源池将资源隔离,不同租户的资源相互独立
  • 租户的资源使用受资源池配置的限制

Q5: 如何监控资源池的使用情况?

A5: 监控资源池使用情况的方法:

  • 使用内置视图 GV$OB_RESOURCE_UNIT_STAT 查看资源单元使用情况
  • 使用 GV$OB_TENANT_STAT 查看租户资源使用情况
  • 使用 GV$OB_ZONE_RESOURCE_STAT 查看区域资源使用情况
  • 配置第三方监控工具,如 Prometheus + Grafana
  • 设置资源使用告警,及时发现资源瓶颈