基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
体验水平扩展与弹性伸缩
更新时间:2026-10-27 15:56:46
弹性伸缩是 OceanBase 从小规模体验环境演进到更大业务容量的关键能力。随着业务的发展或衰退,以及业务在不同时段的峰值差异,数据库需要提供弹性的服务能力。OceanBase 数据库通过租户扩缩容功能支持业务的弹性服务能力:扩容可以提升计算能力和存储容量,既可以通过提高单节点的服务能力达成,也可以通过增加服务节点达成;缩容是扩容的反操作。所有调整均在线生效,对业务透明。
本文将引导您完成以下体验:
- 理解扩缩容体系:掌握租户垂直扩缩容(调整资源规格)、租户水平扩缩容(调整 Unit Number)与集群扩容(新增节点)三个层面的扩展能力。
- 体验租户垂直扩容:在线调大租户的资源规格,观察资源变化的即时生效。
- 对比扩容前后的业务容量:对同一租户在扩容前后执行相同参数的压测,观察 QPS 与延迟的变化。
- 掌握扩缩容验证方法:通过系统视图确认资源规格、Unit 分布与任务执行状态。
说明
本文基于 OceanBase 数据库 V5.0.1(社区版)撰写,文中相关命令和功能说明均以 V5.0.1 版本为准。本文以 部署 OceanBase 中使用 All in One 安装包部署的单节点环境为例。单节点集群可以完整体验租户垂直扩缩容(调整资源规格)及其对业务容量的影响;租户水平扩缩容(调整 Unit Number)和集群扩容(新增节点)需要多节点集群,本文将说明其操作方法与预期行为。
前提条件
在开始本文操作前,确保满足以下条件:
| 项目 | 描述 |
|---|---|
| OceanBase 数据库 | 已使用 All in One 安装包完成部署并成功启动(部署名为 demo),参见 部署 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 数据库提供了两种途径来实现租户的扩缩容,加上集群层面的节点扩展,共同构成完整的弹性伸缩体系:
| 扩缩容层面 | 实现方式 | 关键语句 | 适用场景 |
|---|---|---|---|
| 租户垂直扩缩容 | 调大或调小资源规格(Unit Config),提升单节点的服务能力 | ALTER RESOURCE UNIT |
单节点资源有富余,希望提升单个节点的算力与内存 |
| 租户水平扩缩容 | 增加 Unit Number,增加服务节点数量 | ALTER RESOURCE TENANT ... UNIT_NUM |
单节点规格已达上限,通过增加节点提升租户总服务能力 |
| 集群扩容 | 向集群中新增 OBServer 节点 | ALTER SYSTEM ADD SERVER |
集群整体资源不足,扩展存储空间与计算能力 |
其中,租户垂直扩缩容又包括两种方法:
- 修改资源配置:直接调整资源配置的 CPU 或 Memory 等值,影响所有使用该规格的资源单元。
- 切换资源配置:为资源池切换到另一套资源配置(
ALTER RESOURCE POOL pool1 UNIT='uc2';),适用于多个租户共用同一资源规格、只希望调整其中一个租户的场景。
说明
资源规格的调整是在线立即生效的:OceanBase 数据库通过内核的虚拟化技术,在变更配置后租户的 CPU 和内存资源可以立即生效,无需数据迁移或切换,对业务无感知。详细信息请参见 租户扩缩容介绍 和 通过调整资源规格实现租户扩缩容。
体验租户垂直扩容
本节创建一个小规格租户 scale_tenant(1C2G),执行一轮点查压测作为基线,然后在线将其规格扩容为 2C4G,再次执行相同参数的压测,对比扩容前后业务容量的变化。
操作步骤
使用 root 用户登录集群的 sys 租户(密码为部署时随机生成的密码,获取方式见上文前提条件),创建体验租户:
obclient [oceanbase]> CREATE RESOURCE UNIT scale_unit MAX_CPU=1, MIN_CPU=1, MEMORY_SIZE='2G'; obclient [oceanbase]> CREATE RESOURCE POOL scale_pool UNIT='scale_unit', UNIT_NUM=1, ZONE_LIST=('zone1'); obclient [oceanbase]> CREATE TENANT IF NOT EXISTS scale_tenant CHARSET='utf8mb4', PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('scale_pool') SET ob_tcp_invited_nodes='%';CREATE TENANT为同步操作,命令执行约 10 秒后返回,期间请耐心等待。执行扩容前的基线压测。使用点查脚本对
scale_tenant发起压测,记录结果中的 QPS 和 95% 延迟:obd test sysbench demo --tenant=scale_tenant --script-name=oltp_point_select.lua --table-size=100000 --threads=16 --rand-type=uniform点查是典型的 CPU 密集型负载。如果集群 CPU 资源紧张,1C 的 CPU 配额将成为吞吐瓶颈;如果集群 CPU 资源富余,租户实际可使用的 CPU 可能超过其配额,两轮压测的 QPS 差异可能不明显(详见下文结果解读)。
查看当前资源规格,确认扩容前的基线:
obclient [oceanbase]> SELECT UNIT_CONFIG_ID, NAME, MAX_CPU, MIN_CPU, MEMORY_SIZE, LOG_DISK_SIZE FROM oceanbase.DBA_OB_UNIT_CONFIGS WHERE NAME='scale_unit';返回结果示例如下(
UNIT_CONFIG_ID由系统分配,因环境而异):+----------------+------------+---------+---------+-------------+---------------+ | UNIT_CONFIG_ID | NAME | MAX_CPU | MIN_CPU | MEMORY_SIZE | LOG_DISK_SIZE | +----------------+------------+---------+---------+-------------+---------------+ | 1009 | scale_unit | 1 | 1 | 2147483648 | 6442450944 | +----------------+------------+---------+---------+-------------+---------------+ 1 row in set查询结果显示,
scale_unit资源单元的 CPU、内存分别为 1C、2G,日志盘空间为 6G(默认等于 3 倍内存大小)。在线将租户规格扩容为 2C4G:
obclient [oceanbase]> ALTER RESOURCE UNIT scale_unit MAX_CPU=2, MIN_CPU=2, MEMORY_SIZE='4G'; Query OK, 0 rows affected语句秒级返回即表示扩容完成,租户的 CPU 和内存资源立即生效,无需数据迁移或切换,压测或业务运行中的会话不受影响(本文实测在压测进行中执行本语句与后文缩容语句,压测均正常完成、零错误)。
ALTER语句仅调整显式指定的选项,LOG_DISK_SIZE保持不变,如需同时调整日志盘规格,可在语句中一并指定。确认资源规格已变更:
obclient [oceanbase]> SELECT UNIT_CONFIG_ID, NAME, MAX_CPU, MIN_CPU, MEMORY_SIZE, LOG_DISK_SIZE FROM oceanbase.DBA_OB_UNIT_CONFIGS WHERE NAME='scale_unit';返回结果中
MAX_CPU和MIN_CPU已变为2,MEMORY_SIZE已变为4294967296(即 4G):+----------------+------------+---------+---------+-------------+---------------+ | UNIT_CONFIG_ID | NAME | MAX_CPU | MIN_CPU | MEMORY_SIZE | LOG_DISK_SIZE | +----------------+------------+---------+---------+-------------+---------------+ | 1009 | scale_unit | 2 | 2 | 4294967296 | 6442450944 | +----------------+------------+---------+---------+-------------+---------------+ 1 row in set还可以通过
GV$OB_UNITS视图查看资源单元在节点上的实际生效值:obclient [oceanbase]> SELECT TENANT_ID, SVR_IP, ZONE, MAX_CPU, MIN_CPU, MEMORY_SIZE/1024/1024/1024 AS MEMORY_SIZE_G FROM oceanbase.GV$OB_UNITS WHERE TENANT_ID=(SELECT TENANT_ID FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME='scale_tenant');+-----------+--------------+-------+---------+---------+----------------+ | TENANT_ID | SVR_IP | ZONE | MAX_CPU | MIN_CPU | MEMORY_SIZE_G | +-----------+--------------+-------+---------+---------+----------------+ | 1020 | 127.0.0.1 | zone1 | 2 | 2 | 3.000000000000 | +-----------+--------------+-------+---------+---------+----------------+ 1 row in set
说明
示例中的 TENANT_ID 与 SVR_IP 以实际环境查询结果为准。GV$OB_UNITS 中的 MEMORY_SIZE 显示的是扣除系统预留后该 Unit 实际可用的内存额度(4G 配置对应约 3G),与 DBA_OB_UNIT_CONFIGS 中的配置值不同属正常现象。资源单元在节点上的规格刷新为异步完成,通常在 40 秒内生效。
再次执行相同参数的压测,与基线结果对比:
obd test sysbench demo --tenant=scale_tenant --script-name=oltp_point_select.lua --table-size=100000 --threads=16 --rand-type=uniform对比两轮测试结果,重点确认:
- 两轮压测均正常结束且无错误:说明扩容后租户可正常承载业务流量,规格调整对业务无感知;
- QPS 差异可能不明显:
MAX_CPU是资源上限而非保证值。集群 CPU 资源富余时,租户实际可使用的 CPU 可能超过其配额,扩容前后测出的 QPS 相近属正常现象;规格提升的收益主要体现在集群资源紧张、租户间存在 CPU 争抢时; - 95% 延迟同量级小幅波动:CPU 富余时请求排队时间本就很短,扩容前后均在亚毫秒级。
结果解读
| 观察项 | 预期现象 | 说明 |
|---|---|---|
| 资源规格 | CPU 1C→2C、内存 2G→4G,视图即时可见 | 规格调整在线生效,无需迁移 |
| 两轮 QPS 对比 | 差异可能不明显 | MAX_CPU 是资源上限而非保证值。CPU 富余时租户实际可用 CPU 可能超过配额,QPS 相近属正常;规格提升的收益主要体现在资源紧张、租户争抢 CPU 时 |
| 95% 延迟 | 同量级小幅波动 | CPU 富余时排队时间本就很短,均在亚毫秒级 |
| 业务连续性 | 扩容期间业务读写正常 | 内核虚拟化技术保证变更对业务透明,实测压测中执行变更零错误、零重连 |
注意
- 调大资源规格时,调整后的资源总量需满足:
Sum(min_cpu) <= CPU_CAPACITY、Sum(max_cpu) <= CPU_CAPACITY * resource_hard_limit、Sum(memory_size) <= MEM_CAPACITY、Sum(log_disk_size) <= LOG_DISK_CAPACITY,否则系统报错提示扩容失败。其中resource_hard_limit默认值为100,表示不允许超卖。如集群中已有其他租户且资源不足,可先调小或删除不再使用的租户释放资源。 obd test sysbench每次执行都会重新生成并加载测试数据,两轮测试请使用完全相同的参数,聚焦稳态压测阶段的 QPS 与延迟对比。- 本文示例规格较小,测试结果主要用于验证扩缩容机制及其对业务容量的影响,不代表 OceanBase 数据库的生产级性能。官方性能测试报告可参见 OceanBase Sysbench 性能测试报告,该报告为 OceanBase 数据库 V4.2.1 版本的测试结果。
体验租户缩容
缩容是扩容的反操作,可将资源规格调回原值以释放资源:
obclient [oceanbase]> ALTER RESOURCE UNIT scale_unit MAX_CPU=1, MIN_CPU=1, MEMORY_SIZE='2G';
语句同样秒级返回。本文实测在压测进行中将规格从 2C4G 调回 1C2G,变更瞬间完成,压测全程零错误、零重连,业务无感知。
调小资源规格时需注意对 MEMORY_SIZE 的限制:为租户提供服务的每台物理机,需要满足资源配置的 MEMORY_SIZE 大于等于租户在该物理机上当前的实际使用内存(MEM_USED)。如果调整时 MEMORY_SIZE 的值小于 MEM_USED,则本次调整会失败,需要进行一轮转储释放内存后再重新尝试。因此进行租户缩容前,建议先手动触发一轮转储。
说明
手动触发转储的相关操作请参见 手动触发转储;调小资源规格的详细限制请参见 通过调整资源规格实现租户扩缩容。
体验租户水平扩缩容
当单节点的资源规格已达上限时,可以通过增加 Unit Number 来增加服务节点,提升租户的总服务能力。租户总服务能力近似为:单 Unit 规格 × Unit Number。
从 V4.0.0 版本开始,OceanBase 数据库要求租户内每个 Zone 的 Unit 个数必须保持一致。为了统一管理各个 Zone 的 Unit,系统引入了 Unit Group 机制:不同 Zone 之间相同编号(UNIT_GROUP_ID)的 Unit 属于同一个 Unit Group。调大或调小 Unit Number 本质上是以 Unit Group 为单位创建和删除 Unit。
说明
由于单台物理机上最多能放置同一个资源池下的一个 Unit,单节点单 Zone 集群的 Unit Number 只能为 1,无法体验本节操作。以下方法适用于多节点集群(如 3 节点集群,每个 Zone 各一个 OBServer 节点)。
操作方法(多节点集群)
以将租户 mysql001 的 Unit Number 从 1 调整为 2 为例:
查看租户当前的 Unit Number:
obclient [oceanbase]> SELECT TENANT_ID, TENANT_NAME, UNIT_NUM FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME='mysql001';返回结果中
UNIT_NUM的值为1表示租户的 Unit Number 数为1。将 Unit Number 调整为 2:
obclient [oceanbase]> ALTER RESOURCE TENANT mysql001 UNIT_NUM = 2;语句执行后,系统会在每个 Zone 上新增一个 Unit,与原有 Unit 组成新的 Unit Group,并将数据通过负载均衡分布到新的 Unit 上。
查看任务的执行状态:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE='ALTER_RESOURCE_TENANT_UNIT_NUM' AND TENANT_ID=1006;返回结果中对应记录的
JOB_STATUS为SUCCESS时,表示调整成功。可通过START_TIME(任务发起时间)、SQL_TEXT(任务对应的 SQL 语句)和EXTRA_INFO(变更前后的 Unit Number 数)字段定位本次变更记录,示例中的TENANT_ID、UNIT_GROUP_ID取值以实际环境查询结果为准。查看租户的 Unit 分布,确认每个 Zone 的 Unit 个数已变为 2:
obclient [oceanbase]> SELECT UNIT_ID, ZONE, SVR_IP, UNIT_GROUP_ID, STATUS FROM oceanbase.DBA_OB_UNITS WHERE TENANT_ID=1006;
调小 Unit Number 同样使用 ALTER RESOURCE TENANT 语句,系统会随机指定一个 Unit Group,将该 Unit Group 上的数据重新分布到其他 Unit Group 上后再删除该 Unit Group;也可以通过 DELETE UNIT_GROUP 指定要删除的 Unit Group:
-- 随机删除一个 Unit Group,将 Unit Number 调整为 1
obclient [oceanbase]> ALTER RESOURCE TENANT mysql001 UNIT_NUM = 1;
-- 指定删除 UNIT_GROUP_ID 为 1006 的 Unit Group
obclient [oceanbase]> ALTER RESOURCE TENANT mysql001 UNIT_NUM = 1 DELETE UNIT_GROUP =(1006);
说明
- 扩缩容过程中的数据均衡由租户级配置项
enable_rebalance和enable_transfer共同控制,两者默认值均为true,设置后无需重启 OBServer 节点、立即生效。取值均为true时,系统会在扩缩容操作中自动调整分区分布,实现负载均衡。 - Unit Number 变更后,租户的服务能力随 Unit 数量线性扩展,同时日志流分布在更多节点上,单节点负载相应降低。
集群扩容
当集群整体的存储空间或计算能力不足时,可以向集群中添加 OBServer 节点。以在 zone1 中添加一个节点为例,在 sys 租户中执行:
obclient [oceanbase]> ALTER SYSTEM ADD SERVER 'server_ip:port_num' ZONE 'zone1';
其中 server_ip 为待添加节点的 IP 地址,port_num 为节点的 RPC 端口号(默认为 2882)。新节点添加完成后,Root Service 会自动将现有数据逐步均衡到新节点上,实现存储空间与计算能力的水平扩展,整个扩容过程对业务透明。
对于使用 OBD 管理的集群,还可以使用 obd cluster scale_out 命令完成扩容:创建仅包含新节点信息的配置文件并执行该命令,OBD 会自动完成新节点的部署与注册。
说明
扩缩容验证方法汇总
无论采用哪种扩缩容方式,都可以通过以下系统视图验证变更结果:
| 验证目标 | 视图 / 方法 | 说明 |
|---|---|---|
| 资源规格是否已变更 | oceanbase.DBA_OB_UNIT_CONFIGS |
查看资源配置的 MAX_CPU、MIN_CPU、MEMORY_SIZE、LOG_DISK_SIZE 等值 |
| Unit 分布与实际使用量 | oceanbase.GV$OB_UNITS |
查看各租户资源单元所在节点、规格及 LOG_DISK_IN_USE、DATA_DISK_IN_USE 等实际使用量 |
| 节点资源容量与已分配量 | oceanbase.GV$OB_SERVERS |
对比 CPU_CAPACITY/CPU_ASSIGNED、MEM_CAPACITY/MEM_ASSIGNED、LOG_DISK_CAPACITY/LOG_DISK_ASSIGNED,确认扩容后节点资源分配情况 |
| 租户 Unit Number | oceanbase.DBA_OB_TENANTS |
查看租户的 UNIT_NUM 字段 |
| Unit Number 变更任务状态 | oceanbase.DBA_OB_TENANT_JOBS |
查看 JOB_TYPE 为 ALTER_RESOURCE_TENANT_UNIT_NUM 的任务,JOB_STATUS 为 SUCCESS 表示执行成功 |
| 业务容量是否提升 | obd test sysbench |
扩容前后执行相同参数的压测,对比 QPS 与延迟 |
下一步
完成本文的水平扩展与弹性伸缩体验后,您可以继续以下探索之旅:
- 体验并行导入与高压缩:使用并行导入能力完成大批量入库,并对比压缩前后的存储占用,参见 体验并行导入与高压缩。
- 体验数据保护与恢复:通过闪回查询体验误操作的数据恢复能力,参见 体验数据保护与恢复。
- 深入多租户与资源隔离:了解多租户架构下的资源管理与隔离机制,参见 体验多租户与资源隔离。
相关文档
- 租户扩缩容的两种途径介绍请参见 租户扩缩容介绍。
- 通过调整资源规格实现租户扩缩容的完整操作请参见 通过调整资源规格实现租户扩缩容。
- 通过调整 Unit Number 实现租户扩缩容的完整操作请参见 通过调整 Unit Number 实现租户扩缩容。
- 资源配置(Unit Config)与资源池(Resource Pool)的概念说明请参见 租户的资源管理。
- 手动向集群添加节点的方法请参见 添加节点。
- 使用 OBD 为集群扩容(
obd cluster scale_out)的操作请参见 扩容与组件变更。 - 视图的详细字段说明请参见 GV$OB_UNITS、GV$OB_SERVERS 和 DBA_OB_TENANT_JOBS。
- OBD 测试命令的详细参数请参见 测试命令组。