OceanBase 学习笔记(一):从在 Docker 里跑起来开始
我们生产环境用的是 K8s + OceanBase 这套,说起来有点惭愧,分布式数据库我之前基本没正经碰过——脑子里还停留在”单机 MySQL / Oracle 那个实例”的模型。组里要上 OB,我总不能一直当个只会 SELECT 的旁观者,所以最近开始啃。正好手头有台 Windows 11 的机器,Docker Desktop 也现成,我就照着官方快速开始,先在本地把社区版跑起来,边跑边记。
这是学习笔记第一篇,不是权威教程。里面有些是我”以为是这样、后来才发现不是”的弯路,写下来给自己备忘,也顺便给同样是新手的你参考。有说错的地方欢迎拍砖。
1. 先搞清楚 OB 到底是个啥
最开始我把它当成”换皮的 MySQL 集群”,后来才意识到完全不是一回事。
OceanBase 是原生分布式数据库,不是”单机数据库加个中间件”那种拼出来的。它的几个基本特征是:
- 采用 Shared-Nothing 架构:每台服务器都是对等的,没有特殊的硬件要求,数据靠多副本冗余保证高可用。
- 每台服务器上跑一个叫做 observer 的单进程,既是存储也是计算,数据文件和 Redo 日志都存在本地磁盘上。
- 兼容 MySQL 和 Oracle 两种协议。所以你既可以用 MySQL 的客户端 / 驱动连它,也能用 OB 自带的
obclient。 - 存储引擎底层是 LSM-Tree(MemTable + SSTable 的分层结构),和传统的 B+ 树那一套不一样——这一点后面会体会到它带来的好处(压缩率、写入性能)。
一句话先记住:它是把”分布式”做进了内核里,而不是外包给中间件。
下面这张图先建立一个整体印象——集群由多个 Zone 组成,每个 Zone 里是对等的 OBServer,同一份数据在多个 Zone 各有副本:

多 Zone、多副本、observer 单进程,RootService 寄生在某台 OBServer 上。
2. 几个一开始绕晕我的概念
看文档时,下面这几个词反复出现,我是逐个查、才理顺的。
Zone(可用区)
一个逻辑概念,表示”集群里一组硬件可用性相似的节点”。如果整个集群在一个机房里,一个 Zone 可以对应一个机架、一台交换机;如果跨机房,一个 Zone 就对应一个数据中心。关键规则是:一个 Zone 内部,一份数据只有一个副本;不同 Zone 之间才存同一份数据的多个副本——副本之间靠共识协议保持一致。所以 Zone 的数量直接决定了你能容忍几个机房挂掉。
OBServer
就是每台服务器上那个 observer 进程,数据库的运行实例。没别的花活,一个节点一个。
RootService(总控服务)
这是我之前没想到的点。集群里有个”总控”,它跑在某台 OBServer 上,负责资源管理、容灾、负载均衡、schema 管理这些活。我以为会有一个独立的管理节点,其实没有——它就是寄生在某台 observer 上的服务,那台机器挂了,别的 observer 会把它选出来(也是基于 Paxos 选主)。
日志流(Log Stream)+ Paxos
这是 OB 一致性的核心。每个分区(Tablet)的 Redo 日志汇成一条”日志流”,日志流在多个 Zone 之间有多副本,其中一个是主副本(Leader),只有主副本能接受写入。一次写入要等多数派副本都落盘了才算提交成功。主副本靠”租约(Lease)”防止脑裂——租约过期没续上,就重新选主。
这里我纠结了挺久:为什么不直接用主从复制?后来理解到,Paxos 的多数派提交意味着”挂掉少数节点服务不受影响”,这才是分布式数据库敢谈高可用的底气。
多租户(Tenant)
OB 是多租户的:一个集群能同时跑多个租户,每个租户对使用者来说就是一个独立的数据库实例,租户之间 CPU、内存、IO 都是隔离的。而且租户还能选兼容模式(MySQL 或 Oracle)。这个模型和传统”一个实例一个库”差别很大,一开始我老是搞混”集群、租户、数据库”这三层关系。
Tablet
存储的最小粒度,一张表(或分区表的一个分区)对应一个 Tablet。它是数据分布、均衡、复制的基本单位。
3. 动手:在 Docker Desktop 里把它跑起来
理论看晕了,还是得上手。我在 Windows 11 的 Docker Desktop 里跑官方社区版镜像,用的 MINI_MODE(小规格单机体验模式)把资源占用压到最低。官方文档给的前提是机器至少 2 核 8GB 以上可用资源;开了 mini 模式后 observer 实际占的会低不少(社区里的普遍说法是 2~4G 就能跑起来),所以普通开发机也吃得下。
拉起来很简单,一行命令:
docker run --name obstandalone -e MINI_MODE='true' -p 2881:2881 -p 2882:2882 -d oceanbase/oceanbase-ce
几个点说明一下,免得你像我一样卡住:
2881是 SQL 端口(走 MySQL 协议),2882是内部 RPC 端口,两个都映射出来。MINI_MODE='true'是给本地体验用的,生产环境别这么玩。- 镜像是
oceanbase/oceanbase-ce,社区版,免费。
跑起来之后别急着连——observer 第一次启动要初始化,得等几分钟。盯日志看到 boot success! 再动手:
docker logs -f obstandalone
连上去有两种方式。一种是直接进容器用自带的 obclient:
docker exec -it obstandalone obclient -h127.0.0.1 -P2881 -uroot@sys -A
因为端口映射出来了,你也可以在自己 Windows 上用任意 MySQL 客户端连 127.0.0.1:2881,用户 root@sys,初始没密码。
进去先看看集群里有哪些租户:
SHOW TENANTS;
-- 想看更详细的信息可以查这张系统视图
SELECT TENANT_NAME, TENANT_TYPE, STATUS FROM oceanbase.DBA_OB_TENANTS;
默认会有一个 sys 租户,它是系统租户,管集群的。真正要放业务数据,得再建一个用户租户(选 MySQL 或 Oracle 兼容模式)。这一块建租户还涉及资源池、Unit 这些,我还没完全搞透,先不展开,后面单独写一篇。
4. 第一印象 & 踩的坑
跑通之后,记几个新手容易懵的地方:
- 启动是真的慢,两三分钟是常态,日志不动别以为挂了,等
boot success!。 - 吃内存。哪怕 MINI_MODE,资源给少了 observer 会起不来或者反复重启。本地体验机至少留 8G 给它。
- 端口要分清:应用连
2881(MySQL 协议),2882是内部用的,别连错。 - 默认连的是 sys 租户,root 还没密码。但它不是给你放业务数据的,正经用法是建独立的业务租户。
- 最大的认知冲击:这里没有”单机”这个概念。哪怕你就在 Docker 里跑了一个节点,它也是”一个节点的集群”,底层逻辑全是分布式的。我之前习惯的”这台库挂了就挂了”,在 OB 里得换成”一个 Zone 挂了,Paxos 多数派还在,服务照常”。
5. 小结 & 下一步
- OceanBase 是原生分布式数据库,Shared-Nothing,单进程 observer,兼容 MySQL / Oracle,存储基于 LSM-Tree。
- 理解它的关键,是把 Zone / OBServer / RootService / 日志流(Paxos) / 多租户 / Tablet 这几个概念嚼碎——尤其是多租户和 Paxos 多数派,这是它和单机库最不一样的地方。
- 本地用 Docker + MINI_MODE 能很快体验起来,命令就那么一两行,但启动慢、吃内存这两点要心里有数。
对我们生产那套 K8s + OB 来说,把 Zone、租户、Paxos 这些理顺了,后面真上去运维才不会两眼一抹黑。下一篇我打算真建一个 MySQL 租户,塞点数据进去,试试分布式查询,再看看 OBProxy 是怎么做 SQL 路由的。
参考:





