OceanBase 多租户分布式数据库详解
概述:OceanBase 是一款多租户分布式数据库,其架构层级(集群 → 租户 → 数据库)和连接方式与传统单机数据库(如 MySQL、Oracle)完全不同。本文档系统梳理其核心架构、连接方式、运维管理及原理特性。
环境准备:Docker 快速部署
使用 Docker Compose 一键启动 OceanBase CE 4.3.5 LTS(社区版),适合本地开发和测试:
services:
# =====================
# OceanBase CE 4.3.5 LTS
# =====================
oceanbase:
image: oceanbase/oceanbase-ce:4.3.5-lts
container_name: oceanbase
hostname: obstandalone
restart: unless-stopped
ports:
- "2881:2881"
- "2882:2882"
volumes:
- ./oceanbase:/root/ob # 数据、日志全落盘当前目录
- /etc/localtime:/etc/localtime:ro
environment:
MODE: MINI
OB_SYS_PASSWORD: ${OB_SYS_PASSWORD:-OceanBase123!}
OB_TENANT_PASSWORD: ${OB_TENANT_PASSWORD:-OceanBase123!}
OB_CLUSTER_NAME: obcluster
TZ: Asia/Shanghai
deploy:
resources:
limits:
cpus: '2'
memory: 4G
ulimits:
nofile:
soft: 65536
hard: 65536
healthcheck:
test: ["CMD-SHELL", "obclient -h127.0.0.1 -P2881 -uroot@sys -p${OB_SYS_PASSWORD:-OceanBase123!} -e 'SELECT 1' || exit 1"]
interval: 15s
timeout: 10s
retries: 30
start_period: 120s
networks:
- services-network
logging:
driver: json-file
options:
max-size: "50m"
max-file: "5"
networks:
services-network:
driver: bridge
启动后即可使用 root@sys 登录系统租户,默认密码为 OceanBase123!。
一、核心架构:集群 → 租户 → 数据库
1.1 租户类型(V4.0+)
OceanBase 从 V4.0 版本开始引入三种租户类型,各司其职:
| 租户类型 | 英文名 | 租户 ID | 能否登录 | 说明 |
|---|---|---|---|---|
| 🗂️ 系统租户 | System Tenant (SYS) | 1 | 可以 | 集群默认创建,负责集群管理、租户管理、资源分配、监控告警 |
| 👤 用户租户 | User Tenant (USER) | ≥1002(偶数) | 可以 | 由用户创建,对外提供完整数据库功能(MySQL/Oracle 模式) |
| 📦 Meta 租户 | Meta Tenant (META) | ≥1001(奇数) | 不可以 | 每个用户租户对应一个 Meta 租户,存储该租户的私有配置和位置信息 |
graph TD
subgraph OceanBase集群
direction TB
A[物理资源层<br/>Zone / OBServer节点]
subgraph 租户层
direction LR
B[sys租户<br/>系统管理租户]
C[mysql_tenant<br/>MySQL兼容模式]
D[oracle_tenant<br/>Oracle兼容模式]
E[...更多用户租户]
end
subgraph Meta租户层
direction LR
M1[Meta租户<br/>对应mysql_tenant]
M2[Meta租户<br/>对应oracle_tenant]
end
subgraph 数据库层
direction LR
C1[(db_1)]
C2[(db_2)]
D1[(db_1)]
D2[(db_2)]
end
end
A --> B
A --> C
A --> D
A --> E
C -.-> M1
D -.-> M2
C --> C1
C --> C2
D --> D1
D --> D2
1.2 三层架构详解
| 层级 | 英文名 | 说明 | 类比传统数据库 |
|---|---|---|---|
| 集群(Cluster) | Cluster | 由多台物理机器/容器组成的 OceanBase 实例,提供计算、存储、网络资源池 | 一台物理服务器 |
| 租户(Tenant) | Tenant | 集群内的虚拟数据库实例,拥有独立的资源配额和数据隔离 | 服务器上的独立数据库实例 |
| 数据库(Database/Schema) | Database | 租户内的逻辑库,用于业务数据组织 | 实例里的库 |
1.3 核心特点
- 资源隔离:一个集群可以有 N 个租户,每个租户拥有独立的 CPU、内存、IO 配额,互不干扰
- 多协议兼容:每个租户可以选择 MySQL 兼容模式 或 Oracle 兼容模式
- sys 租户:系统管理租户,负责管理租户生命周期、资源分配、监控告警,不能存储业务数据
- Meta 租户:随用户租户自动创建/销毁,存储租户私有数据(配置项、副本位置等),资源从对应用户租户中扣除
- 业务隔离:所有业务操作必须在业务租户(如
test、mysql_tenant、oracle_tenant)内进行
二、连接方式详解
2.1 连接参数总览
OceanBase 的多租户架构要求连接时必须指定租户名,不同协议模式的连接方式有所区别。
MySQL 模式连接
| 配置项 | 值 | 说明 |
|---|---|---|
| 连接类型 | MySQL |
使用 MySQL 协议 |
| 主机 | 127.0.0.1(或 OBProxy IP) |
直连 OBServer 或走 OBProxy |
| 端口 | 2881(直连)/ 2883(OBProxy) |
默认 MySQL 协议端口 |
| 用户名 | root@test / app_user@mysql_tenant |
必须包含 @租户名 |
| 密码 | 对应租户用户密码 | 各租户用户密码独立 |
| 数据库 | 可选,如 business_db |
连接后默认进入的数据库 |
Oracle 模式连接(企业版)
| 配置项 | 值 | 说明 |
|---|---|---|
| 连接类型 | Oracle |
使用 Oracle 协议 |
| 主机 | 127.0.0.1(或服务器 IP) |
直连或走 OBProxy |
| 端口 | 1521(Oracle 租户默认)/ 2883(OBProxy) |
Oracle 协议默认端口 |
| 服务名/SID | oracle_tenant |
租户名即服务名,用于路由 |
| 用户名 | SYS 或业务用户 |
不需要 @租户名 |
| 角色 | SYSDBA(如用 SYS 登录) |
Oracle 标准角色 |
2.2 连接字符串格式详解
MySQL 模式的连接格式为 用户名@租户名,拆解如下:
app_user @ mysql_tenant
↑ ↑
用户名 租户名
| 组成部分 | 含义 | 类比 MySQL |
|---|---|---|
app_user |
租户 内部 的数据库用户 | 等同于 MySQL user 表中的用户名 |
mysql_tenant |
要连接的 租户名称 | 等同于选择哪个数据库实例 |
为什么需要这种格式?
传统 MySQL 一个端口只对应一个实例:
mysql -h127.0.0.1 -P3306 -uroot -p
# 3306 端口后面就是唯一的数据库实例
OceanBase 一个端口后面挂着 N 个租户(多个虚拟实例),所以必须同时告诉它:
- 你是谁(用户名)
- 你要进哪个门(租户名)
# 错误:不知道你要连哪个租户
obclient -h127.0.0.1 -P2881 -uroot -p
# 正确:以 root 用户连接 sys 租户
obclient -h127.0.0.1 -P2881 -uroot@sys -p
# 正确:以 root 用户连接 test 租户
obclient -h127.0.0.1 -P2881 -uroot@test -p
# 正确:以 app_user 用户连接 mysql_tenant 租户
obclient -h127.0.0.1 -P2881 -uapp_user@mysql_tenant -p
关键理解:
- 用户名只在所属租户内部有效,不同租户可以有同名用户(如两个租户都可以有自己的
root),彼此完全隔离 - 进入租户后,用户的权限体系(能查哪些表、能执行哪些操作)和传统 MySQL 完全一致
2.3 Navicat 等客户端连接示例
| 目标租户 | Navicat 用户名栏填写 | 端口 | 协议 |
|---|---|---|---|
| sys 租户(管理) | root@sys |
2881 | MySQL |
| test 租户 | root@test |
2881 | MySQL |
| mysql_tenant 的业务用户 | app_user@mysql_tenant |
2881 | MySQL |
| oracle_tenant(企业版) | SYS |
1521 | Oracle |
连接格式对比:
| 模式 | 格式 | 示例 | 路由方式 |
|---|---|---|---|
| MySQL 模式 | 用户名@租户名 |
app_user@mysql_tenant |
用户名中的 @租户名 做路由 |
| Oracle 模式 | 用户名 |
SYS |
服务名(即租户名)做路由 |
关键区别总结:
- MySQL 模式:
用户名@租户名做路由,端口 2881 - Oracle 模式:
服务名做路由,用户名保持 Oracle 标准格式,端口 1521
2.4 兼容模式与版本收费关系
| 兼容模式 | 支持版本 | 收费情况 | 说明 |
|---|---|---|---|
| MySQL 模式 | 社区版 + 企业版 | 社区版免费 / 企业版收费 | 兼容 MySQL 5.7 绝大部分功能和语法,兼容 MySQL 8.0 部分 JSON 函数 |
| Oracle 模式 | 仅企业版 | 收费 | 从 V2.x.x 开始支持;支持绝大部分 Oracle 语法和 PL/SQL 功能 |
重要提示:
- 社区版仅提供 MySQL 模式,Oracle 模式需要购买企业版授权
- 同一集群内可以同时存在 MySQL 租户和 Oracle 租户,彼此完全隔离
三、快速验证连接
在配置图形化客户端前,建议先用命令行测试连通性:
# MySQL 租户连接测试
docker exec -it oceanbase obclient -h127.0.0.1 -P2881 -uroot@test -pOceanBase123! -e "SELECT 1"
# Oracle 租户连接测试(企业版)
docker exec -it oceanbase obclient -h127.0.0.1 -P1521 -uSYS@oracle_tenant -pPassword -e "SELECT 1 FROM DUAL"
四、OceanBase 分布式架构原理
4.1 整体架构
graph TB
subgraph 应用层
App1[业务应用]
App2[业务应用]
end
subgraph 接入层
OBProxy1[OBProxy<br/>SQL路由/负载均衡]
OBProxy2[OBProxy<br/>SQL路由/负载均衡]
end
subgraph 存储计算层
direction TB
subgraph Zone1[Zone A - 可用区A]
OBS1[OBServer<br/>Paxos组Leader]
OBS2[OBServer<br/>Paxos组Follower]
end
subgraph Zone2[Zone B - 可用区B]
OBS3[OBServer<br/>Paxos组Follower]
OBS4[OBServer<br/>Paxos组Leader]
end
subgraph Zone3[Zone C - 可用区C]
OBS5[OBServer<br/>Paxos组Follower]
OBS6[OBServer<br/>Paxos组Follower]
end
end
subgraph 管理层
RootService[RootService<br/>集群管理/调度]
end
App1 --> OBProxy1
App2 --> OBProxy2
OBProxy1 --> OBS1
OBProxy1 --> OBS3
OBProxy2 --> OBS4
OBProxy2 --> OBS2
RootService -.-> OBS1
RootService -.-> OBS3
RootService -.-> OBS4
OBS1 -.->|Paxos日志同步| OBS3
OBS3 -.->|Paxos日志同步| OBS5
OBS5 -.->|Paxos日志同步| OBS1
4.2 核心组件说明
| 组件 | 角色 | 功能说明 |
|---|---|---|
| OBServer | 存储计算节点 | 负责数据存储和 SQL 计算,每台机器部署一个 OBServer 进程 |
| OBProxy | 代理/接入层 | SQL 解析、路由转发、连接管理、负载均衡,无状态可水平扩展 |
| RootService | 管理调度中心 | 集群管理、资源调度、副本管理、负载均衡、故障恢复 |
| Zone | 可用区 | 通常对应一个机房或一个机架,实现故障隔离 |
4.3 数据分布与副本机制
graph LR
subgraph 表分区示例
Table[表: orders]
P0[分区0<br/>p0]
P1[分区1<br/>p1]
P2[分区2<br/>p2]
P3[分区3<br/>p3]
end
subgraph ZoneA
A0[分区0<br/>Leader]
A1[分区1<br/>Follower]
A2[分区2<br/>Follower]
A3[分区3<br/>Leader]
end
subgraph ZoneB
B0[分区0<br/>Follower]
B1[分区1<br/>Leader]
B2[分区2<br/>Leader]
B3[分区3<br/>Follower]
end
subgraph ZoneC
C0[分区0<br/>Follower]
C1[分区1<br/>Follower]
C2[分区2<br/>Follower]
C3[分区3<br/>Follower]
end
P0 --> A0
P0 --> B0
P0 --> C0
P1 --> A1
P1 --> B1
P1 --> C1
P2 --> A2
P2 --> B2
P2 --> C2
P3 --> A3
P3 --> B3
P3 --> C3
style A0 stroke-width:2px
style B1 stroke-width:2px
style B2 stroke-width:2px
style A3 stroke-width:2px
核心机制:
- 分区(Partition):表数据按分区键水平拆分,每个分区是一个独立的 Paxos 组
- 多副本:每个分区默认 3 副本,分布在不同 Zone,保证高可用
- Leader 分布:Leader 副本分散在不同 Zone,实现读写负载均衡
- 自动故障切换:Leader 故障时,Follower 自动选举新 Leader(RTO < 30秒)
五、多租户资源管理
5.1 资源隔离模型
graph TB
subgraph 集群总资源
direction TB
CPU[CPU: 100C]
MEM[内存: 512GB]
DISK[磁盘: 10TB]
IO[IO带宽]
end
subgraph 资源池
RP1[资源池 pool_A<br/>Unit: 10C/32GB]
RP2[资源池 pool_B<br/>Unit: 20C/64GB]
end
subgraph 租户
T1[租户 tenant_1<br/>1个Unit]
T2[租户 tenant_2<br/>2个Unit]
T3[租户 tenant_3<br/>1个Unit]
end
CPU --> RP1
CPU --> RP2
MEM --> RP1
MEM --> RP2
RP1 --> T1
RP1 --> T3
RP2 --> T2
5.2 资源管理对象
| 对象 | 说明 | 类比 |
|---|---|---|
| Unit Config | 资源配置模板,定义 CPU、内存、磁盘、IO 规格 | 虚拟机规格模板 |
| Resource Pool | 资源池,关联 Unit Config 和 Zone 分布 | 资源池 |
| Unit | 资源池在单个 Zone 上的具体实例 | 虚拟机实例 |
| Tenant | 绑定资源池,获得实际的计算存储资源 | 租户 = 获得资源的虚拟实例 |
5.3 常用资源管理命令
-- 创建资源配置
CREATE RESOURCE UNIT S1 MAX_CPU 4, MAX_MEMORY '8G', MAX_IOPS 10000;
-- 创建资源池
CREATE RESOURCE POOL pool_1 UNIT='S1', UNIT_NUM=1, ZONE_LIST=('zone1','zone2','zone3');
-- 创建租户
CREATE TENANT IF NOT EXISTS tenant_1
PRIMARY_ZONE='zone1',
RESOURCE_POOL_LIST=('pool_1')
SET ob_tcp_invited_nodes='%', ob_compatibility_mode='mysql';
六、SQL 兼容性与迁移
6.1 版本与兼容模式总览
| 版本 | 收费情况 | 兼容模式 | 适用场景 |
|---|---|---|---|
| 社区版 | 免费开源 | 仅 MySQL 模式 | 学习、开发测试、中小型企业 |
| 企业版 | 商业收费(需购买许可) | MySQL 模式 + Oracle 模式 | 大型企业、金融级生产环境、Oracle 迁移 |
6.2 MySQL 模式兼容性(社区版/企业版)
OceanBase MySQL 模式高度兼容 MySQL 5.7/8.0:
| 特性 | 兼容情况 | 说明 |
|---|---|---|
| SQL 语法 | 高度兼容 | 支持绝大多数 MySQL DML/DDL |
| 数据类型 | 高度兼容 | 支持所有常用 MySQL 数据类型 |
| 存储过程 | 兼容 | 支持 PL 存储过程、函数、触发器 |
| 视图 | 兼容 | 支持普通视图、物化视图 |
| 字符集 | 兼容 | utf8mb4、gbk 等 |
| 事务隔离级别 | 兼容 | 支持 RC、RR |
| 分区表 | 增强 | 兼容 MySQL 分区,且支持更多分区类型 |
6.3 Oracle 模式兼容性(仅企业版)
| 特性 | 兼容情况 | 说明 |
|---|---|---|
| PL/SQL | 高度兼容 | 支持存储过程、包、函数、触发器 |
| 数据类型 | 高度兼容 | NUMBER、VARCHAR2、CLOB、BLOB 等 |
| 系统视图 | 兼容 | DBA_/ALL_/USER_* 系列视图 |
| 序列 | 兼容 | SEQUENCE |
| 同义词 | 兼容 | SYNONYM |
| DBMS 包 | 兼容 | DBMS_OUTPUT、DBMS_SQL 等 |
6.4 社区版 vs 企业版功能对比
| 对比项 | 社区版 | 企业版 |
|---|---|---|
| MySQL 模式 | 支持 | 支持 |
| Oracle 模式 | ❌ 不支持 | ✅ 支持 |
| 高可用仲裁服务 | ❌ 不支持 | ✅ 支持 |
| 高级执行计划管理 | ❌ 不支持 | ✅ 支持 |
| "三地五中心"城市级容灾 | ❌ 不支持 | ✅ 支持 |
| 单集群规模上限 | 有限 | 超过 1500 节点 |
| 专业商业技术支持 | 社区支持 | ✅ 商业技术支持 |
| 原生分布式架构 | ✅ 支持 | ✅ 支持 |
| 多租户架构 | ✅ 支持 | ✅ 支持 |
6.5 迁移工具
graph LR
A[源数据库<br/>MySQL/Oracle] -->|OMS/OCP| B[OceanBase]
subgraph 迁移工具链
OMS[OMS<br/>OceanBase迁移服务]
OCP[OCP<br/>数据同步]
OBLOADER[obloader<br/>离线导入]
OBDUMPER[obdumper<br/>离线导出]
end
A --> OMS
A --> OCP
A --> OBLOADER
OMS --> B
OCP --> B
OBLOADER --> B
B --> OBDUMPER
七、高可用与容灾
7.1 同城三副本
graph TB
subgraph 同城部署
subgraph Zone1[机房A]
L[Leader副本]
end
subgraph Zone2[机房B]
F1[Follower副本]
end
subgraph Zone3[机房C]
F2[Follower副本]
end
end
L <-->|Paxos同步| F1
L <-->|Paxos同步| F2
F1 <-->|Paxos同步| F2
style L stroke-width:2px
- RPO = 0:同步复制,数据零丢失
- RTO < 30秒:自动故障检测和 Leader 切换
- 容忍任意一个 Zone 故障
7.2 两地三中心
graph TB
subgraph 同城双活
subgraph ZoneA[同城机房A]
A1[Leader]
end
subgraph ZoneB[同城机房B]
B1[Follower]
end
end
subgraph 异地容灾
subgraph ZoneC[异地机房C]
C1[Follower<br/>日志异步同步]
end
end
A1 <-->|同步|Paxos| B1
A1 -.->|异步| C1
B1 -.->|异步| C1
style A1 stroke-width:2px
- 同城两中心同步复制(RPO=0)
- 异地中心异步复制(RPO>0,取决于网络延迟)
八、运维监控
8.1 常用系统视图
| 视图名 | 用途 |
|---|---|
oceanbase.__all_zone |
查看 Zone 信息 |
oceanbase.__all_server |
查看 OBServer 节点状态 |
oceanbase.__all_tenant |
查看租户列表 |
oceanbase.__all_resource_pool |
查看资源池 |
oceanbase.__all_unit |
查看 Unit 分布 |
oceanbase.gv$ob_processlist |
查看当前连接 |
oceanbase.gv$sql |
查看 SQL 执行信息 |
8.2 常用运维命令
-- 查看集群状态
SELECT * FROM oceanbase.__all_server;
-- 查看租户列表
SELECT tenant_name, tenant_type, compatibility_mode
FROM oceanbase.__all_tenant;
-- 查看当前连接
SELECT * FROM oceanbase.gv$ob_processlist
WHERE tenant='tenant_1';
-- 查看慢 SQL
SELECT sql_id, elapsed_time, execute_time, sql_text
FROM oceanbase.gv$sql_audit
WHERE tenant_name='tenant_1'
ORDER BY elapsed_time DESC
LIMIT 10;
九、总结速查表
| 问题 | 答案 |
|---|---|
| 集群和租户什么关系? | 集群是物理资源池,租户是虚拟隔离的数据库实例 |
| 一个集群能同时有 MySQL 和 Oracle 租户吗? | 可以,互相隔离,互不干扰 |
| Navicat 用户名怎么写? | MySQL 模式必须 用户@租户,Oracle 模式通过服务名路由 |
| 端口一样吗? | MySQL 用 2881,Oracle 用 1521(或 OBProxy 端口 2883) |
| sys 租户能直接跑业务 SQL 吗? | 不能,sys 只用于管理,业务必须在业务租户内执行 |
| OceanBase 如何保证高可用? | 基于 Paxos 协议的多副本机制,自动故障切换 |
| 数据是如何分布的? | 表按分区键水平拆分,分区多副本分布在不同 Zone |
| 资源如何隔离? | 通过 Unit Config → Resource Pool → Tenant 三级资源模型 |
| 有哪些租户类型? | 系统租户(SYS)、用户租户(USER)、Meta 租户(META) |
| MySQL 模式收费吗? | 社区版免费,企业版收费 |
| Oracle 模式收费吗? | 仅企业版支持,需收费 |
| 社区版和企业版区别? | 社区版仅支持 MySQL 模式,企业版支持 MySQL + Oracle 模式及更多高级功能 |
十、参考资源
- OceanBase 官方文档
- OceanBase GitHub
- OBClient 客户端工具
- OCP(OceanBase Cloud Platform)图形化管理平台

浙公网安备 33010602011771号