【问题描述】OceanBase的多租户隔离机制是如何实现的?
OceanBase 的多租户隔离机制是其核心架构特性之一,从内核层面实现了类似"数据库内虚拟机"的资源管理。下面从架构层次、资源隔离维度和细粒度控制三个方面来详细说明。
核心架构:三层资源模型
OceanBase 通过 资源配置(Unit Config)→ 资源池(Resource Pool)→ 租户(Tenant) 三层模型来管理资源:
- 资源单元(Unit):资源分配的最小颗粒,相当于一个 Docker 容器。每个 Unit 规定了 CPU、内存、磁盘 IO(IOPS)和日志盘的具体规格。每个 Unit 在 OBServer 进程内拥有独立的 Cgroup(用于 CPU 隔离)和独立的内存块,实现物理级别的隔离。
- 资源池(Resource Pool):一组 Unit 的集合,一个资源池只能属于一个租户。资源池可以分布在多个节点上,但每个节点上只能部署一个属于该租户的 Unit。
- 租户(Tenant):业务使用的最高单位。每个租户拥有独立的系统表、Schema 和用户权限,租户之间互不感知,如同独立的数据库实例。每个租户还可以选择 MySQL 或 Oracle 兼容模式。
资源隔离的三个维度
CPU 隔离
OceanBase 利用 Linux 内核的 Cgroup 机制实现 CPU 资源的硬隔离。每个租户的 Unit 对应独立的 Cgroup 目录,工作线程和后台线程按分区识别后归入对应的 Cgroup,网络线程则共享。这样某个租户的 CPU 密集型查询不会抢占其他租户的 CPU 资源。
CPU 资源通过 MIN_CPU 和 MAX_CPU 两个参数控制:
-
MIN_CPU:保障的最低 CPU 核心数(硬保障) -
MAX_CPU:允许使用的 CPU 核心数上限
内存隔离
每个租户的 Unit 拥有独立的内存块,内存资源不支持共享,必须严格隔离。 这意味着租户 A 的内存溢出(OOM)不会导致租户 B 受影响。内存规格通过 MEMORY_SIZE 参数指定。
IOPS 隔离
OceanBase 对磁盘 IO 也实现了隔离,通过 MAX_IOPS、MIN_IOPS 和 IOPS_WEIGHT 三个参数控制:
-
MAX_IOPS/MIN_IOPS:IOPS 的上限和下限(最小值为 1024) -
IOPS_WEIGHT:IOPS 的权重,用于资源竞争时的分配比例
如果用户未显式指定 IOPS 参数,系统会按 1 个 CPU Core 对应 1 万 IOPS 自动计算默认值。
细粒度资源隔离(租户内部)
除了租户间的隔离,OceanBase 还支持同一租户内部不同工作负载的资源隔离,通过**资源组(Resource Group)+ 资源管理计划(Resource Management Plan)**实现,分为三个层级:
- 用户级隔离:将不同用户映射到不同资源组,用户执行的所有 SQL 只能使用其所属资源组的资源。适合将 OLTP 用户和报表用户分开。
- 后台任务级隔离:将后台任务类型(如 compaction、HA 迁移、备份、DDL 等 8 种任务类型)映射到不同资源组,防止合并或迁移任务占用过多资源影响业务。
- SQL 语句级隔离:最细粒度的控制,可以将处理不同业务逻辑的 SQL 绑定到不同资源组,避免大查询阻塞小事务。
与 Oracle PDB 的关键区别
| 对比项 | OceanBase 多租户 | Oracle PDB |
|---|---|---|
| 架构 | 原生分布式 Shared-Nothing | 单机架构 |
| CPU 隔离 | Cgroup 硬隔离 | 隔离不够彻底 |
| IO 隔离 | IOPS 配额管理 | 无原生 IOPS 隔离 |
| 弹性伸缩 | 秒级动态调整 Unit 规格 | 需重启或复杂操作 |
| 跨节点迁移 | Unit 可自动迁移,数据不断流 | 不支持 |
创建租户的典型流程
-- 1. 创建资源配置
CREATE RESOURCE UNIT u1 MAX_CPU 6, MIN_CPU 2, MEMORY_SIZE '16G';
-- 2. 创建资源池
CREATE RESOURCE POOL rp1 UNIT 'u1', UNIT_NUM 1, ZONE_LIST ('zone1', 'zone2', 'zone3');
-- 3. 创建租户
CREATE TENANT tenant1 RESOURCE_POOL_LIST = ('rp1') SET ob_tcp_invited_nodes = '%';
总结来说,OceanBase 的多租户隔离是在数据库内核层面实现的,不依赖 Docker 或虚拟机等外部技术,通过 Cgroup 实现 CPU 隔离、独立内存块实现内存隔离、IOPS 配额实现 IO 隔离,再加上租户内部的资源组机制,形成了一套从粗到细的完整资源隔离体系。
扒扒源码才会懂。
依靠 UnitConfig - 资源池 - Tenant 三层模型,借助资源单元 + 内核 Cgroup,完成 CPU、内存、IO 的租户强隔离。
签到…