1. 部署前的环境评估与版本选型
1.1 社区版与商业版的边界要先搞清楚
很多人一上来就直接下载安装包,结果装到一半才发现功能不对、架构不匹配,浪费大量时间。这里先花两分钟把社区版和商业版的关系捋清楚。
OceanBase社区版是开源版本,支持MySQL协议,具备分布式事务、多副本一致性、水平扩展这些核心能力,单机或者多机都能跑。商业版则在性能优化、运维工具链、高级压缩、专有云集成等方面有更多增强。如果你是要做业务系统验证、技术预研、中小规模生产环境,社区版完全够用;但如果是金融级核心业务,建议直接走商业版渠道拿技术支持。
版本选择上,我自己主用4.x系列,相对3.x在部署方式上更友好,尤其是OBD(OceanBase Deployer)这套部署工具的成熟度,让整个流程从“手工改一堆配置文件”变成了“写一个yaml、跑一条命令”。如果你拿到的教程还是教你在每个节点上手动执行一堆脚本,那基本是旧版本时代的东西,建议直接切到4.x。
1.2 硬件配置怎么给才不浪费
部署前先算算你的机器能不能扛得住。社区版本身不是一个“轻量级玩具”,它是分布式数据库,即使单机部署,对资源也有明确要求。
最低配置建议是2核8GB内存、50GB磁盘,但这仅仅够“能启动”级别,跑跑测试SQL勉强可以。想要比较流畅地跑TPC-C测试、模拟真实业务负载,建议4核16GB起步。生产环境三节点集群,每个节点8核32GB比较稳妥,磁盘用SSD,数据目录和日志目录分开挂载。
操作系统的选择上,社区版对Linux系的兼容性最好,CentOS 7/8、Alibaba Cloud Linux、麒麟等都可以,内核版本建议3.10以上。我自己实测过CentOS 7.9和Alibaba Cloud Linux 3这两个环境,都很顺利。需要注意,Oracle Linux如果开了UEK内核,某些依赖包会有兼容问题,能避开就避开。
还有一个容易忽略的点:部署前确认glibc版本。OceanBase 4.x对glibc的要求是2.17以上,CentOS 7默认就是这个版本,但如果你用的是精简版系统,可能被裁剪过,部署时会出现莫名其妙的段错误。检查方法很简单,执行ldd --version看一下即可。
1.3 部署工具链:为什么选择OBD而不是手工步骤
社区版提供了两套部署路径:一种是完全手工方式,下载rpm包、逐台安装、手工改配置文件、脚本启动,这个过程繁琐且容易出错;另一种就是OBD一键部署,它是官方提供的自动化部署工具,把环境检查、依赖安装、配置文件生成、服务启动、集群初始化全部串起来。
我强烈推荐用OBD,原因是它不光能装,还能管。你用OBD部署的集群,后续可以通过obd cluster start、obd cluster stop来启停,通过obd cluster status来查状态,比手工维护systemd服务省心太多。而且OBD有内置的检查项,比如磁盘空间不够、端口占用、时区不对,它都会在部署前警告,把很多坑挡在了前面。
2. 单机环境快速部署:先让数据库跑起来
2.1 下载安装包与配置本地源
部署单机环境前,先把安装包准备好。我建议直接配置在线源,不推荐下载一堆rpm手工装。以CentOS为例,你需要在目标机器上创建OceanBase的yum仓库文件。
vi /etc/yum.repos.d/oceanbase.repo写入以下内容:
[oceanbase] name=OceanBase baseurl=https://mirrors.oceanbase.com/OceanBase/rpm/7/x86_64/ gpgcheck=0 enabled=1这里提一个细节:/rpm/7/代表CentOS 7/RHEL 7系列,如果你用的是Alibaba Cloud Linux 3或CentOS 8,要改成/rpm/8/,否则yum解析会报「找不到包」。这个目录结构不少人在初次部署时栽过跟头。
配置好后,执行:
yum install -y oceanbase-ce obdoceanbase-ce是数据库服务端,obd是部署工具。安装完成后,执行obd --version确认工具就绪。
2.2 编写单机部署配置
OBD用的配置文件格式是YAML。单机部署的配置比较简单,核心是定义一个集群名、指定一台机器的IP、分配组件版本和资源路径。
obd cluster autodeploy quick-demo -c oceanbase-ce --version 4.2.1这条命令会自动生成配置并部署一个单机实例,适合快速尝鲜。但如果你对目录结构有特殊要求,还是建议自己写配置文件。下面是一个我常用的单机配置模板:
oceanbase-ce: servers: - name: ob1 ip: 192.168.1.100 global: home_path: /data/oceanbase data_dir: /data/oceanbase/data redo_dir: /data/oceanbase/redo devname: eth0 mysql_port: 2881 rpc_port: 2882 root_password: "YourStrongPassword@2024" ob1: mysql_port: 2881 rpc_port: 2882home_path是OceanBase的安装目录,data_dir是数据文件目录,redo_dir是redo日志目录。强烈建议把redo目录放到单独的磁盘或者至少独立分区上,这直接影响写入性能。
devname参数指定网卡名称,OBD需要通过它检测IP。如果你的机器有多个网卡,务必写准确,不然后续observer无法正常通信。
配置写好后,执行部署命令:
obd cluster deploy quick-demo -c quick-demo.yamlOBD会先做环境检查,然后下载依赖,初始化目录,安装组件,最后启动服务。整个过程视网络速度而定,一般五到十分钟能完成。
2.3 连接数据库做首次验证
部署完成后,OBD会自动初始化系统租户(sys租户)并设置root密码。你可以在部署机的命令行直接用mysql客户端连接:
mysql -h192.168.1.100 -P2881 -uroot -p但有个小坑:CentOS 7默认不带mysql客户端,需要先安装:
yum install -y mysql如果连不上,先看2881端口是否监听:
ss -lntp | grep 2881从实际经验看,最常见的连不上原因就两个:一是防火墙没放行2881,二是配置里mysql_port写错。单机部署的容器化版本还要检查Docker映射,物理机部署基本不涉及。
连上后执行一条SQL验证基本功能:
show databases;然后建一个测试库和表,随便插入几条数据,看看响应是否正常。这一步能过滤掉90%的“部署假成功”问题。
3. 生产环境三节点集群部署实践
3.1 集群拓扑规划与Zone设计
单机跑通之后,如果你要部署三节点集群,最核心的步骤是做好Zone规划。OceanBase的数据可靠性依赖多副本机制,一个Zone是一组逻辑上的节点集合,每个Zone内可以有一个或多个observer。
三节点生产环境最经典的布局就是三个Zone各放一个节点:
| 节点 | IP | Zone | 角色 |
|---|---|---|---|
| 节点A | 192.168.1.101 | zone1 | observer |
| 节点B | 192.168.1.102 | zone2 | observer |
| 节点C | 192.168.1.103 | zone3 | observer |
这样的布局下,你可以在线容忍任意一个节点故障,因为多数派副本仍然存活。官方推荐的同步事务语义也需要多数派,至少三副本就是生产级的最低门槛。
规划时还要注意磁盘容量。数据目录空间建议按业务数据量的1.5倍预留,redo日志目录单独留200GB以上。很多生产事故不是机器挂了,而是数据目录写满导致observer异常退出。
3.2 集群配置文件参数详解
三节点集群的配置和单机相比,主要在servers列表、rootserver位置、参数设置上有所升级。下面是我在模拟项目X中实际使用过的配置模板:
oceanbase-ce: servers: - name: ob1 ip: 192.168.1.101 - name: ob2 ip: 192.168.1.102 - name: ob3 ip: 192.168.1.103 global: home_path: /data/oceanbase data_dir: /data/oceanbase/data redo_dir: /data/oceanbase/redo devname: eth0 mysql_port: 2881 rpc_port: 2882 root_password: "YourStrongPassword@2024" # 集群级参数 cluster_id: 1001 memory_limit: 16G system_memory: 3G stack_size: 512K cpu_count: 8 ob1: zone: zone1 ob2: zone: zone2 ob3: zone: zone3这里重点说一下几个参数:
memory_limit是observer进程能从OS申请的总内存上限,建议设为物理内存的80%左右。system_memory是留给系统租户的内存,不要小于2G,否则系统内部任务容易触发OOM。cpu_count如果机器超过16核,建议显式设置,因为observer默认会用满所有核,反而容易造成CPU调度争抢。
cluster_id建议设置一个业务相关的唯一ID,后续做数据迁移或者多集群管理时会省很多麻烦。
配置文件里还需要额外指定rootserver的位置。OBD在4.x版本已经可以自动选举,但为了部署的可预期性,我习惯手动把第一个节点指定为初始rootserver:
servers: - name: ob1 ip: 192.168.1.101 role: ROOTSERVICE3.3 执行三节点部署三步曲
配置文件就绪后,部署流程跟单机差不多:
obd cluster deploy ob-cluster -c ob-cluster.yaml obd cluster start ob-cluster obd cluster status ob-cluster但三节点部署有一个额外强制步骤:初始化Paxos组。实际上OBD在deploy阶段会调用obd cluster init,把三个observer成员关系建立起来。如果你漏掉了这一步,哪怕三个节点进程都在,集群也无法对外提供分布式服务。
初始化过程会有类似这样的输出:
obd cluster init ob-cluster --init-only执行完成后再查状态,应该看到类似active的标识。
我用一个比喻来解释这个过程:deploy相当于把三台服务器的“数据库引擎”安装好并点火,init是让三个人互相确认“我们属于同一个团队,谁是领导、谁做备份”,没有init,引擎再多也是一盘散沙。
3.4 租户创建与业务接入前的检查
集群起来后,默认只有sys租户。业务要使用OceanBase,需要创建业务租户。这一步很多人会漏,因为单机部署时sys租户就能建表测试,但生产环境不推荐业务直接使用系统租户。
创建业务租户的SQL示例:
CREATE RESOURCE UNIT u_small_config MAX_CPU = 2, MIN_CPU = 1, MAX_MEMORY = '6G', MIN_MEMORY = '4G', MAX_IOPS = 1024, MIN_IOPS = 1024, LOG_DISK_SIZE = '8G'; CREATE RESOURCE POOL pool_small UNIT = u_small_config, UNIT_NUM = 1, ZONE_LIST = ('zone1','zone2','zone3'); CREATE TENANT business_tenant RESOURCE_POOL_LIST = ('pool_small'), PRIMARY_ZONE = 'zone1;zone2,zone3', DEFAULT_TABLEGROUP = NULL, CHARACTER_SET = 'utf8mb4';PRIMARY_ZONE的定义会影响强一致读的流量优先调度到哪个Zone。上面写法表示优先用zone1,如果zone1故障,再使用zone2和zone3。UNIT_NUM = 1表示每个Zone放一个资源单元,三副本数据落盘就是3份。
创建完成后,用一下命令确认租户可见:
SHOW TENANTS;然后就可以通过业务租户的链接来连接了:mysql -h192.168.1.101 -P2881 -ubusiness_user@business_tenant -p。如果你把用户名写成裸的business_user,会连不上,这里奥妙在于用户名@租户名的结构,初次用的人最容易在这里卡住。
4. 部署后的健康检查与基础运维
4.1 集群状态与分区副本校验
部署完成不代表万事大吉。至少要跑一遍系统性的健康检查,才能确认集群真的处于“可用且高可用”状态。
先用OBD查集群进程状态:
obd cluster status ob-cluster正常输出会有每个节点的observer进程状态和uptime。然后登录sys租户,查看集群的全局视图:
SELECT * FROM oceanbase.DBA_OB_ZONES; SELECT * FROM oceanbase.DBA_OB_SERVERS;重点关注STATUS是否为ACTIVE,以及START_SERVICE_TIME是否已经初始化。如果ZONE显示INACTIVE,说明该Zone内的observer没有正常启动或者心跳丢失,需要进一步查observer日志。
分区副本的校验也很必要,尤其在你创建了业务租户并导入测试数据后:
SELECT COUNT(*) FROM oceanbase.DBA_OB_TABLEGROUPS;这个命令能确认表的副本分发情况。副本不是均匀分布也不代表有问题,OceanBase的负载均衡会自动迁移,但如果你初始化后立刻检查发现大量副本还在某个Zone里,可以等一会儿再看,或者手动触发均衡任务。
4.2 配置文件与日志体系速查
OceanBase的日志主要分两个部分:observer.log是核心运行日志,记录SQL执行、事务提交、合并等关键事件;election.log是选举相关日志,多副本环境下排查主备切换问题时特别有用。
日志位置默认在home_path/log/,我常用的排查命令组合:
# 查看observer最近的错误日志 grep -i error /data/oceanbase/log/observer.log | tail -n 50 # 查看选举相关日志 tail -n 200 /data/oceanbase/log/election.logOBD本身的日志在~/.obd/log/下,如果obd cluster deploy中途失败,先看这个目录里的obd.log。
这里有一件非常重要的经验:不要随意删日志文件。OceanBase的日志系统不是简单的追加文件,它内部有log归档和索引机制,直接删物理日志文件会导致observer无法启动,出现data gap错误。真要清理,应该用系统自带的任务或设置日志滚动策略。
4.3 备份策略与恢复演练
任何数据库部署完,备份是第一优先级。OceanBase社区版的备份恢复有两种方式:逻辑备份和物理备份。物理备份在社区版里能力有限,我更推荐逻辑备份工具obd内置的obclient配合SQL导出。
最简单的逻辑备份方式:
obd cluster tenant backup ob-cluster -t business_tenant -p /backup/tenant_20240101.dump这条命令会把业务租户的数据做逻辑导出。恢复的时候:
obd cluster tenant restore ob-cluster -t business_tenant -p /backup/tenant_20240101.dump注意,恢复目标租户必须已经存在,且不能有同名表,否则会报错。所以我在实际操作中的习惯是恢复前先建一个临时租户,导入完成确认数据无误后再切换。
另外,备份文件一定要放到独立的存储位置,不要放在observer的数据盘上。曾经见过有人把备份放到/data/oceanbase/backup,结果那个目录和数据目录同盘,磁盘一满,整个数据库一起挂掉,这属于典型的“备份把自己备份没了”。
5. 部署过程中的高频问题与排查实录
5.1 依赖缺失与Python版本兼容问题
OBD本身是用Python写的,对Python版本比较敏感。CentOS 7默认的Python 2.7可以用,但如果你用CentOS 8,系统默认Python 3.6,部分OBD版本会对某些模块不兼容,报出类似ModuleNotFoundError的信息。
我遇到过一次:在新装CentOS 8.5的系统上执行obd cluster deploy,报错找不到setuptools。解决方法是:
yum install -y python3-setuptools还有一次是缺少mysqlclient库,会在集群初始化写初始化密码时报错。解决方法是安装:
yum install -y mysql-devel gcc如果依赖问题反复出现,建议直接查看OBD日志中具体是哪个Python模块导入失败,然后针对性地安装对应包,不要盲目装一堆。
5.2 端口占用与防火墙拦截
OceanBase默认使用2881(MySQL协议端口)和2882(内部RPC端口),三节点部署下,每台机器这两个端口都要互通。
如果你在同一台机器上跑多个observer实例,还会用到2883等端口。端口冲突的最典型报错是Bind failed: Address already in use,排查用ss -lntp | grep 288看哪个进程占了。
防火墙关闭或放行的问题,在部署前就应该处理完。我一般直接确认生产环境使用的节点都已经配置成相应放行:
firewall-cmd --permanent --add-port=2881/tcp firewall-cmd --permanent --add-port=2882/tcp firewall-cmd --reload集群内部节点通信如果被安全组或防火墙挡了,最直观的现象是observer启动后ZONE状态一直是INACTIVE,或者Paxos选举超时。这类问题排查链路长,一定要在动手部署前把网络打通验证做掉。
5.3 内存配置过大导致OOM
内存参数memory_limit如果设置得比物理内存还大,observer会在负载上来后频繁触发OOM。这个问题在低配机器上尤其常见,比如4G内存的机器,memory_limit写成了刚好4G,还有操作系统本身占用,结果OOM killer直接杀掉observer进程。
我习惯的经验公式是:
- 物理内存8G以下,
memory_limit控制在物理内存的60% - 物理内存16G,
memory_limit设置到物理内存的75% - 物理内存32G以上,
memory_limit设置到物理内存的80%,同时预留足够空间给OS page cache
如果出现OOM,登录机器执行dmesg | grep -i oom能看到kernel kill进程的记录。解决方式是调低memory_limit,然后重启observer。但注意,直接obd cluster restart会把整个集群重启,生产环境要先确认维护窗口。
5.4 磁盘空间计算失误
OceanBase的data目录增长非常快,尤其是开启合并后,临时文件可能占掉和实际数据差不多的空间。redo日志目录则要支持持续的写入,如果redo所在磁盘写满,observer会直接进入stopped状态。
我踩过一次坑:本机测试环境给了数据盘200GB,以为够用,结果执行了一个大事务导入,加上合并和日志归档,一天之内磁盘就满了,然后集群状态全面飘红。后来我把redo目录挂载到另一块独立的NVMe盘上,问题才彻底解决,因为这个盘即使写满,也不会阻塞数据盘的合并。
给新人的建议:无论什么环境,先执行df -h看看各目录的挂载情况,确保data_dir和redo_dir不在同一个分区。如果机器只有一块盘,至少在不同目录上预估足够余量,并把自动清理日志的定时任务提前配好。
5.5 时区不一致引发的诡异问题
如果你有多台服务器,一台是CST,一台是UTC,部署完成后查询时间戳可能差8小时。这个问题不会导致启动失败,但会导致监控告警、日志时间线错乱。
给集群统一时区很简单,修改每台机器:
timedatectl set-timezone Asia/Shanghai同时,在OceanBase的配置文件中加上ob_timezone参数统一设定数据库会话时区。这一步在单机部署感受不明显,但在多节点生产环境是必须做的。
写在后面的一些体会
从我反复部署社区版OceanBase的经验看,这套系统的部署本身并不难,真正考验人的是各种前置规划的细节。硬件评估、网络放行、目录挂载、参数预留,这些看起来琐碎的工作,决定了后续运行期你是在安稳地写业务,还是在半夜起来救火。
我个人最想强调的是,把部署脚本和配置文件纳入版本管理。很多团队的数据库环境是“一人部署完,其他人黑盒使用”,一旦要扩容、迁移、重建环境,就只能靠记忆猜配置,这是最危险的状态。我自己的习惯是为每个集群环境单独建一个目录,配置、检查脚本、备份策略说明都放进去,任何人拿到就能复现一套新环境。
社区版OceanBase在4.x之后越来越成熟,部署的复杂度已经大幅下降,但生产环境终究不是跑个demo,多留一分谨慎,少踩一个坑,这大概就是运维人最真实的日常。