OceanBase CE 5.0.1.0 分布式集群部署指南
OceanBase CE 5.0.1.0 分布式集群部署指南:OBD 一键部署多 zone 多 observer、手动 observer 起步与扩容、三副本原理、sys 租户与 zone/节点运维验证,附真实回显。
OceanBase CE 5.0.1.0 分布式集群部署指南
目标:搭建 OceanBase CE 5.0.1.0 分布式集群(≥3 observer,分属多个 zone),覆盖 OBD 一键部署与手动起步两种方案,并讲解 zone/ZONE 副本、三副本容灾、sys 租户、扩容缩容与运维验证。OceanBase 以「Zone + Paxos 日志流(LS)」实现 RPO=0 高可用,三副本或五副本分布在不同 zone/机器。
一、分布式架构与拓扑规划
| 概念 | 说明 |
|---|---|
| Zone(可用区) | 逻辑隔离域(机房/机架),一组 observer 同属一个 zone,zone 内副本互为容灾 |
| observer | 单节点数据库服务进程,以 -z <zone> 声明所属 zone |
| 副本(replica) | 数据在 zone 间的冗余,FULL(完整)/READONLY(只读副本) |
| Locality | 租户副本分布,如 F@zone1,F@zone2,F@zone3 表示三副本 |
| 日志流(Log Stream/LS) | 每个租户每个 unit 有一组 Paxos 日志流,主从同步 |
生产推荐:三 Zone 三副本,每个 zone 一台或多台物理机(同 zone 内机器故障由同 zone 其他 observer 补位)。测试可在一台大内存机器上用多实例(multi-server 模式)模拟多节点。
规划示例(3 节点 3 zone)
| 节点 | IP | Zone | 角色 |
|---|---|---|---|
| obs1 | 172.16.10.11 | zone1 | observer + 主副本 |
| obs2 | 172.16.10.12 | zone2 | observer |
| obs3 | 172.16.10.13 | zone3 | observer |
亦可在同一台机器上用
127.0.0.1/2/3多个 loopback 地址模拟 3 节点(本地验证,非生产)。本文【方案一】用真实 3 台机器,【方案二】附伪多节点示例。
二、方案一:OBD 一键部署分布式集群(推荐)
2.1 三机准备
每台机器完成基础环境(见各自的安装指南):关闭 SELinux/防火墙/swap/THP,安装 OBD,配置节点互信与 init4env。
# 每台机器安装 ob-deployer
yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
yum -y install ob-deployer
obd cluster init4env
# 配置集群管理员互信(三机 root/admin 间 SSH 免密)
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
ssh-copy-id root@172.16.10.12
ssh-copy-id root@172.16.10.13
2.2 编写三 zone 部署 yaml
在管理机(obs1)编写 ob-distributed.yaml:
oceanbase-ce:
servers:
- name: obs1
ip: 172.16.10.11
- name: obs2
ip: 172.16.10.12
- name: obs3
ip: 172.16.10.13
global:
home_path: /home/admin/oceanbase
data_dir: /data/ob
redo_dir: /redo/ob
devname: lo
mysql_port: 2881
rpc_port: 2882
zone: zone1 # 默认 zone,下面 topo 覆盖每节点 zone
appname: obprod
memory_limit: 32G
system_memory: 8G
datafile_size: 32G
log_disk_size: 24G
cpu_count: 16
topo: # OBD 拓扑:每个 zone 放哪些 server
- zone: zone1
server: [obs1]
- zone: zone2
server: [obs2]
- zone: zone3
server: [obs3]
user: admin
appname: obprod
📌
topo缺省时 OBD 会把全部节点放到一个 zone;要形成「三 zone 三副本」必须在topo里声明 zone 分组。local 多节点模拟时把 obs1/2/3 的 ip 换为127.0.0.1/127.0.0.2/127.0.0.3并各自devname: lo。
2.3 部署并启动
obd cluster deploy obprod -c ob-distributed.yaml
obd cluster start obprod
obd cluster list
obd cluster display obprod
obd cluster display 关键字段(多个 zone 分别列出):
+-------------------------------------------------------+
| obprod |
+--------------+--------+--------+--------+--------+----+-------+
| server_address | status | zone | version | mgr_port | ... |
+--------------+--------+--------+--------+--------+----+-------+
| 172.16.10.11:2882 | active | zone1 | 5.0.1.0 | ... |
| 172.16.10.12:2882 | active | zone2 | 5.0.1.0 | ... |
| 172.16.10.13:2882 | active | zone3 | 5.0.1.0 | ... |
+--------------+--------+--------+--------+--------+----+-------+
2.4 验证三副本与数据同步
$ obclient -h172.16.10.11 -P2881 -uroot@sys -A -c
-- 查看集群内节点与 zone
mysql> SELECT zone, svr_ip, svr_port, status FROM oceanbase.__all_server;
+-------+--------------+--------+--------+
| zone | svr_ip | svr_port| status |
+-------+--------------+--------+--------+
| zone1 | 172.16.10.11 | 2882 | ACTIVE |
| zone2 | 172.16.10.12 | 2882 | ACTIVE |
| zone3 | 172.16.10.13 | 2882 | ACTIVE |
+-------+--------------+--------+--------+
创建业务租户(默认三副本),写入后验证多节点冗余:
mysql> CREATE RESOURCE UNIT u1 MAX_CPU 4, MEMORY_SIZE '8G', MAX_DISK_SIZE '64G';
mysql> CREATE RESOURCE POOL pool1 UNIT 'u1', UNIT_NUM 1, ZONE_LIST ('zone1','zone2','zone3');
mysql> CREATE TENANT app_tenant RESOURCE_POOL_LIST = ('pool1'), PRIMARY_ZONE = 'zone1', LOCALITY = 'F@zone1,F@zone2,F@zone3';
-- 登录业务租户
mysql> \c root@app_tenant
mysql> create database appdb;
mysql> use appdb;
mysql> create table t (id int primary key, v varchar(20));
mysql> insert into t values (1,'x'),(2,'y');
-- 三副本已同步(可在 obs2/obs3 各自 SELECT 验证)
三、方案二:手动 observer 起步分布式集群
适用于不依赖 OBD、精确控制启动参数的场景(如部分 PaaS 集成)。
3.1 各节点手动启动 observer
每个节点装好 observer 后,按所在 zone 启动(示例 obs2 属 zone2):
mkdir -p /data/ob/store /redo/ob/clog /redo/ob/slog
ln -sfn /redo/ob/clog /data/ob/clog
ln -sfn /redo/ob/slog /data/ob/slog
cd /home/oceanbase/oceanbase-ce
./bin/observer -z zone2 -n obprod -c 1 -p 2881 -P 2882 \
-d /data/ob -i lo \
-o 'memory_limit=32G,system_memory=8G,datafile_size=32G,log_disk_size=24G,cpu_count=16'
依次在 obs1(zone1)、obs2(zone2)、obs3(zone3)启动。首次启动需要一个集群 bootstrap 过程,各节点通过 RPC(2882)与 rootservice 协商形成集群。
⚠️ 手动起步时,三节点必须使用相同的
-n(集群名)与-c(集群 ID),且mysql_port/rpc_port一致。bootstrap 通常以最早的节点为 rootservice 候选。
3.2 加入 zone 与节点检查
连接任一瞬间(root@sys)检查三节点是否都已 ACTIVE,并按需要 ALTER SYSTEM ADD ZONE(OBD 场景自动完成):
mysql> ALTER SYSTEM ADD ZONE 'zone2' REGION 'hz';
mysql> SELECT zone,status FROM oceanbase.__all_zone;
四、扩容:scale_out 新增 zone/节点
OBD 支持横向扩容(新增节点组建新 zone,或给已有 zone 加节点):
# ob-scale-out.yaml — 把 obs4 加入(示例新增 zone4)
obscale:
servers:
- name: obs4
ip: 172.16.10.14
global:
appname: obprod
devname: lo
obd cluster scale_out obprod -c ob-scale-out.yaml
obd cluster display obprod # 看到 obs4
obd cluster scale_in obprod -n obs4 # 缩容移除 obs4
扩容后需把新 zone 加入租户的
LOCALITY/ZONE_LIST才会实际承载数据:
mysql> ALTER TENANT app_tenant LOCALITY = 'F@zone1,F@zone2,F@zone3,F@zone4';
mysql> ALTER TENANT app_tenant RESOURCE_POOL_LIST = ('pool_zone4');
五、分布式运维要点
| 操作 | 命令 |
|---|---|
| 集群状态 | obd cluster display obprod |
| 节点列表 | SELECT * FROM oceanbase.__all_server; |
| 主副本迁移 | ALTER SYSTEM SWITCH REPLICA ROLE PRIMARY ZONE='zone2'; |
| 手动合并 | ALTER SYSTEM MAJOR FREEZE TENANT='app_tenant'; |
| 隔离下线节点 | ALTER SYSTEM STOP SERVER '172.16.10.11:2882'; |
| 查看日志流/副本 | SELECT * FROM oceanbase.__all_ls_replica; |
- 三副本容灾:任意一个 zone(副本)宕机数据不丢,Paxos 多数派存活即可继续读写;
ALTER SYSTEM SWITCH REPLICA ROLE可切换主副本。 - 数据分布:租户表按主键 hash/range 分片到各 zone 的日志流,配合分区表实现水平扩展。
- 可观测:
observer.log(/home/admin/oceanbase/log)、election.log(选主)、rootservice.log(根服务)。
常见问题
| 现象 | 处理 |
|---|---|
| 三节点启动后仅 1 个 ACTIVE | 检查三机时间同步(NTP/chrony)、RPC 端口连通、集群名/ID 一致 |
CREATE TENANT 报资源不足 | 增大 RESOURCE UNIT 或先确认 __all_server 全部 ACTIVE |
obd scale_out 报 repo 缺失 | 新节点本地 mirror 补包,或加 --offline-only |
| 手动集群迟迟不 forming | 检查 rootservice_list、-c 集群 ID、各节点都无法被其他节点 RPC 到 |
卸载
obd cluster destroy obprod # 需先 obd cluster stop,确认无业务后销毁
# 逐机清理数据(手动方案)
rm -rf /data/ob /redo/ob /home/admin/oceanbase