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/