OceanBase国产数据库实战:分布式架构部署与MySQL兼容模式配置

OceanBase是蚂蚁集团自主研发的分布式关系型数据库,在金融级核心交易场景中经历了双十一验证。作为国产数据库的重点产品,OceanBase支持MySQL和Oracle双兼容模式,提供Paxos多副本强一致、透明水平扩展、多租户资源隔离等企业级能力。在信创国产化替代的背景下,掌握OceanBase的部署架构和MySQL兼容模式配置,是数据库运维和架构选型的重要技能。

OceanBase架构组件与部署模式

OceanBase集群由三类核心组件构成:

OBServer:数据节点,运行在每台物理机或虚拟机上,负责数据存储和SQL执行。每个OBServer包含若干Zone,每个Zone内运行一个observer进程。

OBProxy:代理层,接收客户端连接,将SQL路由到正确的OBServer。OBProxy无状态,可水平扩展,生产环境至少部署两个实例做高可用。

OBD(OceanBase Deployer):集群部署管理工具,支持一键安装、配置变更、集群扩缩容。

典型的三机房五副本部署拓扑:3个Zone分布在3个机房,每个Zone包含2个OBServer节点,共6台服务器。Paxos协议要求多数派写入成功(5副本中3个),任意单机房故障不影响数据一致性。

OBD单集群部署实操

使用OBD进行集群部署是最快捷的方式。以下以三节点集群为例:

# 安装OBD
yum install -y oceanbase-ob-deployer

# 生成配置文件
obd cluster deploy obcluster -c obcluster.yaml

核心配置文件obcluster.yaml:

oceanbase-ce:
  servers:
    - name: server1
      ip: 10.0.1.11
    - name: server2
      ip: 10.0.1.12
    - name: server3
      ip: 10.0.1.13
  global:
    devname: eth0
    cluster_id: 1
    root_password: "Str0ngP@ssw0rd"
    obagent_password: "Ob@gent2026"
    # 数据磁盘和日志磁盘分离
    datafile_disk_percentage: 60
    log_disk_percentage: 30
    # CPU和内存限制
    memory_limit: 16G
    system_memory: 4G
    cpu_count: 8
    # MySQL兼容模式(默认)
    mysql_port: 2881
    rpc_port: 2882
    # Paxos副本数
    server_num: 3
    # 事务日志级别
    trx_log_mode: WRITE_ON_COMMIT

部署和启动集群:

# 部署集群(安装软件包,初始化目录)
obd cluster deploy obcluster -c obcluster.yaml

# 启动集群
obd cluster start obcluster

# 查看集群状态
obd cluster display obcluster

# 验证集群可用性
obclient -h10.0.1.11 -P2881 -uroot -p"Str0ngP@ssw0rd" -A

MySQL兼容模式配置与验证

OceanBase的MySQL兼容模式兼容MySQL 5.7/8.0协议,支持大部分MySQL SQL语法、函数和连接协议。使用obclient(OceanBase增强版MySQL客户端)或标准MySQL客户端连接。

创建兼容MySQL的租户和数据库:

-- 连接到sys租户(管理租户)
-- obclient -h10.0.1.11 -P2881 -uroot@sys -p"Str0ngP@ssw0rd"

-- 创建资源单元(Unit),定义资源规格
CREATE RESOURCE UNIT unit_s1 
    MAX_CPU 2, 
    MIN_CPU 1, 
    MEMORY_SIZE '2G',
    MAX_IOPS 10000,
    MIN_IOPS 5000,
    LOG_DISK_SIZE '4G';

-- 创建资源池
CREATE RESOURCE POOL pool_app 
    UNIT = 'unit_s1', 
    UNIT_NUM = 1, 
    ZONE_LIST = ('zone1','zone2','zone3');

-- 创建MySQL兼容模式租户
-- mysql兼容模式通过设置租户参数实现
CREATE TENANT app_tenant 
    RESOURCE_POOL_LIST = ('pool_app'),
    SET ob_compatibility_mode = 'mysql';

-- 切换到业务租户
-- obclient -h10.0.1.11 -P2881 -uroot@app_tenant -p"AppP@ss2026"

-- 创建数据库和表
CREATE DATABASE orders_db DEFAULT CHARACTER SET utf8mb4;
USE orders_db;

CREATE TABLE order_info (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    order_no VARCHAR(32) NOT NULL UNIQUE,
    user_id BIGINT NOT NULL,
    amount DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    status TINYINT NOT NULL DEFAULT 0 COMMENT '0-待付款 1-已付款 2-已发货 3-已完成',
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_user (user_id),
    INDEX idx_status_created (status, created_at)
) PARTITION BY HASH(user_id) PARTITIONS 16;

OceanBase在MySQL兼容模式下支持分区表语法。上面的HASH分区将数据均匀分布到16个分区,每个分区自动分布在不同的OBServer上,实现透明的水平扩展。查询时如果WHERE条件包含分区键(user_id),OceanBase只扫描对应分区,避免全表扫描。

数据迁移与MySQL迁移适配

从MySQL迁移到OceanBase,主要使用OceanBase Migration Service(OMS)或DataX进行数据同步。以下通过DataX配置全量数据迁移:

{
  "job": {
    "setting": {
      "speed": {
        "channel": 8,
        "byte": 1048576
      },
      "errorLimit": {
        "record": 0,
        "percentage": 0.0
      }
    },
    "content": [{
      "reader": {
        "name": "mysqlreader",
        "parameter": {
          "username": "mysql_user",
          "password": "mysql_pass",
          "column": ["id","order_no","user_id","amount","status","created_at","updated_at"],
          "splitPk": "id",
          "connection": [{
            "table": ["order_info"],
            "jdbcUrl": ["jdbc:mysql://10.0.1.20:3306/orders_db"]
          }]
        }
      },
      "writer": {
        "name": "obwriter",
        "parameter": {
          "username": "root@app_tenant",
          "password": "AppP@ss2026",
          "column": ["id","order_no","user_id","amount","status","created_at","updated_at"],
          "batchSize": 1000,
          "connection": [{
            "table": ["order_info"],
            "jdbcUrl": ["jdbc:oceanbase://10.0.1.11:2881/orders_db?useUnicode=true&characterEncoding=utf8"]
          }]
        }
      }
    }]
  }
}

迁移过程中的常见兼容性问题:

自增列行为差异:OceanBase的自增列与MySQL存在实现差异。OceanBase默认使用基于租户的全局自增序列,而非MySQL的表级自增。如果业务依赖自增ID连续性,需要评估替代方案:

-- 方案1:使用ORDER全局唯一ID生成器
CREATE TABLE sequence_order (
    seq_name VARCHAR(64) PRIMARY KEY,
    seq_value BIGINT DEFAULT 1
);

-- 方案2:使用UUID或雪花算法(应用层生成)
ALTER TABLE order_info MODIFY COLUMN id BIGINT;
-- 应用层生成ID写入

存储引擎行为:OceanBase使用LSM-Tree存储引擎,与MySQL的B+Tree存储存在行为差异。OceanBase的合并(Compaction)机制可能导致查询性能在合并前后波动。可通过调整合并时间窗口规避业务高峰:

-- 设置每日合并时间到凌晨
ALTER SYSTEM SET major_freeze_duty_time = '02:00';

-- 手动触发合并
ALTER SYSTEM MAJOR FREEZE;

-- 查看合并进度
SELECT * FROM oceanbase.CDB_OB_MAJOR_COMPACTION;

运维监控与性能调优

OceanBase内置GV$视图提供丰富的运行时监控指标:

-- 查看慢SQL(执行超过1秒)
SELECT sql_id, query_sql, elapsed_time, executions 
FROM oceanbase.gv$ob_sql_audit 
WHERE elapsed_time > 1000000
ORDER BY elapsed_time DESC 
LIMIT 20;

-- 查看租户资源使用情况
SELECT tenant_id, tenant_name, 
       cpu_count_max, memory_size_max,
       unit_count, active_unit_count
FROM oceanbase.dba_ob_unit_config;

-- 查看分区分布
SELECT table_name, partition_name, zone, svr_ip, role, row_count
FROM oceanbase.gv$ob_partitions
WHERE table_name = 'order_info'
LIMIT 50;

-- 查看集群健康状态
SELECT zone, svr_ip, status, start_service_time, stop_time
FROM oceanbase.dba_ob_servers;

OceanBase通过SQL Audit自动记录所有执行的SQL,包括执行计划、耗时、等待事件。这是定位慢查询的主要入口。对于热点分区(某分区数据量远超其他),可以通过修改分区策略或增加分区数重新均衡数据分布。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/oceanbase-guo-chan-shu-ju-ku-shi-zhan-fen-bu-shi-jia-gou-bu/

(0)
小编小编
上一篇 6小时前
下一篇 6小时前

相关推荐