基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
体验多租户与资源隔离
更新时间:2026-10-27 15:56:46
多租户是 OceanBase 数据库区别于传统单实例数据库的核心能力。OceanBase 采用单集群多租户架构,在集群层面实现了实例资源的池化,每一个租户即一个实例(类比 MySQL Instance),租户与租户之间数据、权限、资源完全隔离,每个租户拥有独立的用户体系及专属的 CPU、内存等资源。通过多租户机制,一个集群可以同时承载多个业务,在保证可用性和性能的前提下高效利用资源,并做到按需弹性扩缩容。
本文将引导您完成以下体验:
- 理解多租户架构:掌握资源配置(Unit Config)、资源池(Resource Pool)、资源单元(Unit)与租户(Tenant)的基本关系。
- 创建不同业务租户:为不同业务创建相互隔离的租户,并配置不同的 CPU、内存、存储等资源规格。
- 验证租户间隔离性:在不同租户中执行查询,观察数据与权限的边界。
- 在线调整资源规格:体验租户资源的在线扩缩容,变更过程对业务无感知。
- 压测观察租户性能:在业务租户中执行标准压测,验证租户可正常承载业务流量,并理解资源配额的隔离逻辑。
说明
本文基于 OceanBase 数据库 V5.0.1(社区版)撰写,文中相关命令和功能说明均以 V5.0.1 版本为准。本文以 部署 OceanBase 中使用 All in One 安装包部署的单节点环境为例。本文聚焦租户间的资源隔离,即通过资源规格划分各租户可用的资源上限;如需体验同一租户内不同负载之间的资源隔离(资源组),请参见 体验 HTAP 混合负载场景。
前提条件
在开始本文操作前,确保满足以下条件:
| 项目 | 描述 |
|---|---|
| OceanBase 数据库 | 已完成部署并成功启动,参见 部署 OceanBase。 |
| 机器资源 | 建议不低于 4 核 CPU、16 GB 内存。机器资源越多,可为租户分配的规格越大。 |
| sys 租户访问 | 可使用 root 用户登录集群的 sys 租户执行管理操作。sys 租户 root 用户的密码为部署时随机生成的密码,可在部署输出或 obd cluster display demo 命令的输出中查看。 |
| obclient | 已安装 obclient 并可正常连接 OceanBase 数据库。使用 All in One 安装包部署时已自动安装。 |
| ob-sysbench(可选) | 如需体验压测观察租户性能,需已按 体验高并发 OLTP 场景 安装 ob-sysbench。 |
多租户架构简介
OceanBase 数据库通过租户实现资源隔离,让每个数据库服务的实例不感知其他实例的存在,并通过权限控制确保租户数据的安全性。租户是一个逻辑概念,既是各类数据库对象的容器,又是资源(CPU、Memory、IO 等)的容器,在一定程度上相当于传统数据库的"实例"概念。
OceanBase 使用以下三个概念对各租户的可用资源进行管理:
| 概念 | 说明 |
|---|---|
| 资源配置(Unit Config) | 描述资源单元可用的 CPU、内存、存储空间和 IOPS 等规格的配置信息。修改资源配置可动态调整资源单元的规格。 |
| 资源单元(Unit) | 租户使用 CPU、内存的最小逻辑单元,也是集群扩展和负载均衡的基本单位。一个 Unit 必须放置在资源足够容纳它的物理机上,且单台物理机上最多能放置同一个资源池下的一个 Unit。 |
| 资源池(Resource Pool) | 由若干个资源单元组成,通过给资源池指定资源配置,可确定资源池下各资源单元的物理资源。一个资源池仅能属于一个租户,一个租户可拥有一个或多个资源池。 |
由于分布式的架构,一个 OceanBase 租户可以在资源规格、资源池、副本类型、副本分布几个维度灵活定义,因此创建租户时需要按照 资源配置 → 资源池 → 租户 的顺序进行创建和定义:
资源配置(Unit Config)──> 资源池(Resource Pool)──> 租户(Tenant)
定义规格 组合资源单元 分配给业务
说明
资源配置指定的是对应资源单元能够提供的服务能力,而不是资源单元的实时负载。详细信息请参见 租户的资源管理。
创建不同业务租户
以下示例模拟一个集群同时承载两个业务的场景:为业务 A 创建规格较小的租户 tenant1,为业务 B 创建规格较大的租户 tenant2,两者共享集群资源但相互隔离。
操作步骤
使用 root 用户登录集群的 sys 租户(密码为部署时随机生成的密码,获取方式见上文前提条件):
obclient -h127.0.0.1 -uroot@sys -P2881 -p -A oceanbase创建两个资源配置。以下示例分别创建 1C2G 和 2C4G 的资源单元规格,您可根据机器实际配置调整:
obclient [oceanbase]> CREATE RESOURCE UNIT unit1 MAX_CPU=1, MIN_CPU=1, MEMORY_SIZE='2G'; obclient [oceanbase]> CREATE RESOURCE UNIT unit2 MAX_CPU=2, MIN_CPU=2, MEMORY_SIZE='4G';命令中的关键参数说明:
参数 说明 MAX_CPU资源单元能够提供的 CPU 上限。必选参数。 MIN_CPU资源单元能够提供的 CPU 下限,默认等于 MAX_CPU。MEMORY_SIZE资源单元能够提供的内存规格。必选参数。 LOG_DISK_SIZE日志盘空间,默认等于 3 倍内存大小,最小为 2G。 MAX_IOPS/MIN_IOPS资源单元可提供的 IOPS 上下限,最小值均为 1024,未指定时默认为 INT64_MAX。创建资源池并关联资源配置。单节点集群的
ZONE_LIST为('zone1'):obclient [oceanbase]> CREATE RESOURCE POOL pool1 UNIT='unit1', UNIT_NUM=1, ZONE_LIST=('zone1'); obclient [oceanbase]> CREATE RESOURCE POOL pool2 UNIT='unit2', UNIT_NUM=1, ZONE_LIST=('zone1');命令中的关键参数说明:
参数 说明 UNIT为资源池指定的资源配置,资源池下的每个资源单元均使用该规格。 UNIT_NUM资源池在 ZONE_LIST内每个 Zone 上创建的资源单元个数。ZONE_LIST资源池的使用范围,指定在哪些 Zone 上创建资源单元。 分别创建租户
tenant1和tenant2,并关联对应的资源池:obclient [oceanbase]> CREATE TENANT IF NOT EXISTS tenant1 CHARSET='utf8mb4', PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('pool1') SET ob_tcp_invited_nodes='%'; obclient [oceanbase]> CREATE TENANT IF NOT EXISTS tenant2 CHARSET='utf8mb4', PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('pool2') SET ob_tcp_invited_nodes='%';命令中的关键参数说明:
参数 说明 CHARSET租户的字符集,本例设置为 utf8mb4。PRIMARY_ZONE租户的 Leader 副本优先分布的 Zone。 RESOURCE_POOL_LIST租户关联的资源池列表。 ob_tcp_invited_nodes租户访问白名单, '%'表示任意 IP 均可访问,后期可修改。确认租户创建成功:
obclient [oceanbase]> SELECT TENANT_ID, TENANT_NAME, TENANT_TYPE, STATUS, TENANT_ROLE FROM DBA_OB_TENANTS WHERE TENANT_TYPE = 'USER';返回结果示例如下,
tenant1和tenant2的STATUS均为NORMAL,表示租户创建成功:+-----------+-------------+-------------+--------+-------------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | STATUS | TENANT_ROLE | +-----------+-------------+-------------+--------+-------------+ | 1 | sys | SYS | NORMAL | PRIMARY | | 1002 | tenant1 | USER | NORMAL | PRIMARY | | 1004 | tenant2 | USER | NORMAL | PRIMARY | +-----------+-------------+-------------+--------+-------------+ 3 rows in set其中
TENANT_ID等编号由系统自动分配,因环境而异。每个用户租户创建时,系统还会自动创建一个META$开头的内部租户(TENANT_TYPE为META),用于管理租户元数据,使用SELECT * FROM DBA_OB_TENANTS;查询全量信息时可见,无需关注。使用 root 用户登录
tenant1,新创建的租户 root 用户默认密码为空,提示输入密码时直接回车即可:obclient -h127.0.0.1 -uroot@tenant1 -P2881 -p -A test登录后执行
SHOW DATABASES;,可以看到新租户拥有独立的数据库列表:+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | oceanbase | | test | +--------------------+ 4 rows in set与
sys租户类似,tenant1内也有information_schema、mysql、oceanbase三个系统库,用于存放数据库的系统信息和元数据,请勿在其中存储业务数据。
注意
- 创建资源池需要保证有足够的资源剩余。如果资源不足,可将已有租户的资源规格调小(参见本文在线调整租户资源规格),或删除不再使用的租户释放资源。删除租户使用
DROP TENANT语句,且租户下的数据库和表会同时被删除,详细信息请参见 DROP TENANT。 - 系统在创建租户时会默认为 Meta 租户预留资源,各项资源从用户租户的资源中扣除,因此租户实际可用资源会略小于配置值,通过视图查询到的实际生效额度低于
MEMORY_SIZE配置值属正常现象。 - 本文示例针对单节点集群,只能创建单副本租户。如果您的集群有 3 个节点,
ZONE_LIST的值应为('zone1','zone2','zone3'),PRIMARY_ZONE可设置为'zone1;zone2;zone3'。
体验租户间隔离
多租户架构下,租户与租户之间的数据、权限完全隔离:OceanBase 不允许跨租户的数据访问,每个租户拥有独立的用户体系。本节通过两组操作直观验证隔离性。
数据隔离
在
tenant1中创建一张测试表并插入数据:obclient -h127.0.0.1 -uroot@tenant1 -P2881 -p -A testobclient [test]> CREATE TABLE business_a_order (id INT PRIMARY KEY, item VARCHAR(50), amount DECIMAL(10,2)); Query OK, 0 rows affected obclient [test]> INSERT INTO business_a_order VALUES (1, 'keyboard', 149.00); Query OK, 1 row affected obclient [test]> SHOW TABLES; +------------------+ | Tables_in_test | +------------------+ | business_a_order | +------------------+ 1 row in set使用 root 用户登录
tenant2,查看test库中的表:obclient -h127.0.0.1 -uroot@tenant2 -P2881 -p -A testobclient [test]> SHOW TABLES; Empty settenant2中看不到tenant1创建的任何表。两个租户拥有各自独立的test库,数据完全隔离。
权限隔离
每个租户拥有独立的用户体系,一个租户中创建的用户无法登录另一个租户。
在
tenant1中创建业务用户:obclient [test]> CREATE USER app_user IDENTIFIED BY '******'; Query OK, 0 rows affected尝试使用
app_user连接tenant2(提示输入密码时输入app_user的密码):obclient -h127.0.0.1 -uapp_user@tenant2 -P2881 -p -A test Enter password: ERROR 1045 (42000): Access denied for user 'app_user'@'xxx.xxx.xxx.xxx' (using password: NO)连接失败并报
ERROR 1045 Access denied,这是因为app_user只存在于tenant1的用户体系中,tenant2无法识别该用户。报错末尾的using password: NO表示该用户在tenant2中不存在,并非提示您未输入密码。同理,tenant1的 root 用户与tenant2的 root 用户也是两个完全独立的账号。
说明
在数据安全方面,OceanBase 数据库不允许跨租户的数据访问,以确保用户的数据资产没有被其他租户窃取的风险;在资源使用方面,OceanBase 表现为租户"独占"其资源配额。详细信息请参见 多租户架构概述。
在线调整租户资源规格
OceanBase 数据库可以灵活地对租户的 CPU、内存资源进行调整,并且在线生效、对业务透明。修改租户所占用的 CPU、内存大小,仅需调整租户所对应的资源配置,不需要对资源池或租户进行调整。
操作步骤
在 sys 租户中查看当前资源配置:
obclient [oceanbase]> SELECT UNIT_CONFIG_ID, NAME, MAX_CPU, MIN_CPU, MEMORY_SIZE, LOG_DISK_SIZE FROM oceanbase.DBA_OB_UNIT_CONFIGS WHERE NAME IN ('unit1', 'unit2');返回结果示例如下:
+----------------+-------+---------+---------+-------------+---------------+ | UNIT_CONFIG_ID | NAME | MAX_CPU | MIN_CPU | MEMORY_SIZE | LOG_DISK_SIZE | +----------------+-------+---------+---------+-------------+---------------+ | 1006 | unit1 | 1 | 1 | 2147483648 | 6442450944 | | 1007 | unit2 | 2 | 2 | 4294967296 | 12884901888 | +----------------+-------+---------+---------+-------------+---------------+ 2 rows in set查询结果显示,
unit1资源单元的 CPU、内存分别为 1C、2G,日志盘空间为 6G(默认等于 3 倍内存大小)。UNIT_CONFIG_ID为系统自动分配的编号,因环境而异;MEMORY_SIZE、LOG_DISK_SIZE的单位为字节,可按 1G = 1073741824 字节换算。将
unit1的规格在线调整为 2C、4G,模拟业务 A 的资源扩容:obclient [oceanbase]> ALTER RESOURCE UNIT unit1 MAX_CPU=2, MIN_CPU=2, MEMORY_SIZE='4G'; Query OK, 0 rows affected再次查询资源配置,确认调整已生效(重复步骤 1 中的查询语句即可):
obclient [oceanbase]> SELECT UNIT_CONFIG_ID, NAME, MAX_CPU, MIN_CPU, MEMORY_SIZE, LOG_DISK_SIZE FROM oceanbase.DBA_OB_UNIT_CONFIGS WHERE NAME IN ('unit1', 'unit2');返回结果中
unit1的MAX_CPU和MIN_CPU已变为2,MEMORY_SIZE已变为4294967296(即 4G)。LOG_DISK_SIZE保持不变,ALTER语句仅调整显式指定的选项,如需同时调整日志盘规格,可在语句中一并指定LOG_DISK_SIZE:+----------------+-------+---------+---------+-------------+---------------+ | UNIT_CONFIG_ID | NAME | MAX_CPU | MIN_CPU | MEMORY_SIZE | LOG_DISK_SIZE | +----------------+-------+---------+---------+-------------+---------------+ | 1006 | unit1 | 2 | 2 | 4294967296 | 6442450944 | | 1007 | unit2 | 2 | 2 | 4294967296 | 12884901888 | +----------------+-------+---------+---------+-------------+---------------+ 2 rows in set通过
GV$OB_UNITS视图查看资源单元在节点上的分布及实际生效情况:obclient [oceanbase]> SELECT SVR_IP, UNIT_ID, TENANT_ID, ZONE, MAX_CPU, MIN_CPU, MEMORY_SIZE, STATUS FROM oceanbase.GV$OB_UNITS;返回结果示例如下(
10.10.10.1为示例 IP,实际显示为您的本机 IP;UNIT_ID、TENANT_ID因环境而异,可与前文“确认租户创建成功”步骤中查询到的TENANT_ID对应):+------------+---------+-----------+-------+---------+---------+-------------+--------+ | SVR_IP | UNIT_ID | TENANT_ID | ZONE | MAX_CPU | MIN_CPU | MEMORY_SIZE | STATUS | +------------+---------+-----------+-------+---------+---------+-------------+--------+ | 10.10.10.1 | 1 | 1 | zone1 | 2 | 2 | 1073741824 | NORMAL | | 10.10.10.1 | 1002 | 1001 | zone1 | NULL | NULL | 1073741824 | NORMAL | | 10.10.10.1 | 1002 | 1002 | zone1 | 2 | 2 | 3221225472 | NORMAL | | 10.10.10.1 | 1003 | 1003 | zone1 | NULL | NULL | 1073741824 | NORMAL | | 10.10.10.1 | 1003 | 1004 | zone1 | 2 | 2 | 3221225472 | NORMAL | +------------+---------+-----------+-------+---------+---------+-------------+--------+ 5 rows in set返回结果中,每个资源单元对应一行记录:
TENANT_ID为1的行是sys租户的资源单元;MAX_CPU为NULL的行是内部 Meta 租户的资源记录;其余两行分别是tenant1和tenant2的资源单元,STATUS为NORMAL表示资源单元状态正常。视图中的MEMORY_SIZE为扣除系统预留后的实际生效额度,会小于配置值(例如 4G 规格显示为 3221225472,约 3G)。
说明
ALTER RESOURCE UNIT语句执行成功后,DBA_OB_UNIT_CONFIGS中的配置值会立即更新;资源单元实际生效的过程在后台异步完成,通常在数十秒内完成。若通过GV$OB_UNITS视图查询到的仍是旧值,请稍候重试。- 资源调整在线完成,无需数据迁移或重启,对业务无感知。
- 除调大规格外,也支持使用相同方法调小规格,实现租户资源的缩容。调整时请确保目标规格满足业务负载需要。
- 通过查看
DBA_OB_UNITS视图,还可以获取资源单元、资源池、租户在集群里的对应关系及 CPU、内存信息。
资源变更方式对比
除直接修改资源配置外,OceanBase 还支持通过切换资源配置、调整 UNIT_NUM、变更 ZONE_LIST 等方式进行租户资源变更,分别适用于不同的扩缩容场景(后两种适用于多 Zone、多节点集群,单节点环境无法演示):
| 变更方式 | 语句 | 适用场景 |
|---|---|---|
| 修改资源配置 | ALTER RESOURCE UNIT unit1 MAX_CPU=2; |
直接调整规格,在线生效 |
| 切换资源配置 | ALTER RESOURCE POOL pool1 UNIT='unit3'; |
资源池整体切换到另一套规格 |
| 调整 UNIT_NUM | ALTER RESOURCE POOL pool1 UNIT_NUM=2; |
增减每个 Zone 内的资源单元数量,增大时需保证目标 Zone 内有可用节点,减小时需配合 DELETE UNIT 指定要删除的资源单元 |
| 变更 ZONE_LIST | ALTER RESOURCE POOL pool1 ZONE_LIST=('zone1','zone2'); |
扩大或缩小 Zone 维度的使用范围 |
压测观察租户性能
完成前两节的操作后,tenant1(1C2G)和 tenant2(2C4G)两个业务租户已就绪。本节使用 sysbench 对租户执行标准点查压测,验证新租户可正常承载业务流量,并结合结果理解 OceanBase 的资源隔离逻辑。
操作步骤
对小规格租户
tenant1发起点查压测(如已按上一节将unit1调整为 2C4G,可先执行ALTER RESOURCE UNIT unit1 MAX_CPU=1, MIN_CPU=1, MEMORY_SIZE='2G';调回):obd test sysbench demo --tenant=tenant1 --script-name=oltp_point_select.lua --table-size=100000 --threads=16 --rand-type=uniform首次执行时,
obd会自动完成测试数据生成、数据加载和压测执行,结束后输出 QPS、延迟等统计结果,记录其中的 QPS 和 95% 延迟。对大规格租户
tenant2(2C4G)执行完全相同参数的压测:obd test sysbench demo --tenant=tenant2 --script-name=oltp_point_select.lua --table-size=100000 --threads=16 --rand-type=uniform对比两轮测试结果,重点确认:
- 两轮压测均正常结束并输出统计结果,说明两个租户均可独立承载业务流量;
- 压测数据在各租户中独立生成,
tenant1的压测不会在tenant2中留下数据。
结果解读
两轮压测的 QPS 数值因机器规格、数据量、并发参数不同而差异较大,无需关注绝对值,重点观察以下现象:
| 观察项 | 预期现象 | 说明 |
|---|---|---|
| 压测执行 | 两轮压测均正常结束,无报错 | 新租户可正常承载业务流量 |
| 两轮 QPS 对比 | 差异可能不明显 | MAX_CPU 是资源上限而非保证值。集群 CPU 资源富余时,租户实际可使用的 CPU 可能超过其配额,此时不同规格的租户测出的 QPS 相差不大属正常现象 |
| 多租户同时负载 | 压测 tenant2 时 tenant1 中的查询响应时间基本不变 |
资源配额的隔离效果主要体现在多个租户同时争抢资源时:高规格租户获得更多算力,低规格租户的业务不受挤占 |
说明
obd test sysbench会自动完成测试数据生成、数据加载和压测执行,压测数据在各租户中独立生成,互不影响。命令参数的详细说明请参见 体验高并发 OLTP 场景。- 本文示例规格较小,测试结果主要用于验证租户可用性与资源隔离机制,不代表 OceanBase 数据库的生产级性能。官方性能测试报告可参见 OceanBase Sysbench 性能测试报告(V4.2.1 版本测试数据)。
- 如需观察租户间的资源隔离效果,可在压测一个租户的同时在另一个租户中执行点查,观察其响应时间(显示在查询结果后,如
1 row in set (0.00 sec))是否保持稳定。
下一步
完成本文的多租户与资源隔离体验后,您可以继续以下探索之旅:
- 体验高可用与故障切换:了解 OceanBase 的副本、Zone、Leader/Follower 等核心概念,观察副本与 Leader 分布,体验故障场景下的服务连续性,参见 体验高可用与故障切换。
- 体验水平扩展与弹性伸缩:探索计算、存储和租户资源层面的扩展能力,观察扩容前后的资源变化与业务容量影响,参见 体验水平扩展与弹性伸缩。
- 体验租户内资源隔离:在同一租户内通过资源组隔离 TP 与 AP 负载,参见 体验 HTAP 混合负载场景。