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 租户:随用户租户自动创建/销毁,存储租户私有数据(配置项、副本位置等),资源从对应用户租户中扣除
  • 业务隔离:所有业务操作必须在业务租户(如 testmysql_tenantoracle_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 个租户(多个虚拟实例),所以必须同时告诉它:

  1. 你是谁(用户名)
  2. 你要进哪个门(租户名)
# 错误:不知道你要连哪个租户
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 模式及更多高级功能

十、参考资源

posted @ 2026-06-01 11:03  RK5123153  阅读(22)  评论(0)    收藏  举报