我和OceanBase的故事系列:Docker 一键拉起 OceanBase 4 社区版开发环境

张开发
2026/4/6 17:39:19 15 分钟阅读

分享文章

我和OceanBase的故事系列:Docker 一键拉起 OceanBase 4 社区版开发环境
1. 为什么选择Docker部署OceanBase社区版第一次接触OceanBase是在一个技术分享会上当时听到演讲者提到这个数据库的性能如何强悍但需要几十GB内存才能跑起来我差点当场放弃。后来发现社区版通过Docker部署居然只需要10GB内存这才让我重拾信心。说实话这种部署方式对开发者太友好了——不用操心复杂的依赖关系不用手动配置各种参数一条命令就能把完整的开发环境跑起来。传统部署OceanBase有多麻烦我有个同事曾经尝试在本地虚拟机安装光是准备环境就花了三天时间最后因为内存不足还是失败了。而Docker部署完全避开了这些坑它把OceanBase和所有依赖都打包在一个镜像里就像把整个数据库装进了一个集装箱随取随用。特别适合我们这些需要快速验证功能又不想折腾环境的开发者。现在最新的OceanBase 4社区版在Docker上的体验更好了。镜像大小控制在500MB以内启动后占用的资源也更合理。我实测在16GB内存的笔记本上就能流畅运行这对于个人开发者来说简直是福音。而且社区版包含了企业版90%以上的功能学习、开发、测试完全够用。2. 五分钟快速搭建开发环境2.1 准备工作在开始之前确保你的机器已经安装了Docker Engine。我推荐使用Docker Desktop特别是Windows和Mac用户它能省去很多麻烦。内存方面建议至少分配8GB给DockerOceanBase才能跑得顺畅。这是我的硬件配置供参考CPU4核i5-8250U内存16GB给Docker分配了10GB磁盘SSD剩余空间50GB2.2 拉取官方镜像打开终端执行这条命令获取最新社区版镜像docker pull oceanbase/oceanbase-ce:latest第一次拉取可能会有点慢因为镜像大小约500MB。我遇到过网络问题导致下载中断的情况这时候可以试试配置国内镜像加速# 阿里云镜像加速需要替换成自己的加速地址 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://yourid.mirror.aliyuncs.com] } EOF sudo systemctl daemon-reload sudo systemctl restart docker2.3 启动容器这条命令会启动一个OceanBase实例docker run -tid --name ob4 -p 2881:2881 -p 2883:2883 --memory 10G oceanbase/oceanbase-ce关键参数说明-p 2881:2881映射MySQL协议端口-p 2883:2883映射RPC端口--memory 10G这是重点OceanBase对内存很敏感建议不低于8G启动后可以用这个命令检查状态docker ps -a --filter nameob4如果看到STATUS是Up就说明启动成功了。我第一次用时没注意内存参数结果容器一直重启后来才发现日志里报内存不足的错误。3. 初始配置与连接3.1 进入容器环境执行这个命令进入容器内部docker exec -it ob4 bash你会看到一个标准的Linux终端所有OceanBase组件都已经安装好了。这里有个小技巧如果经常需要进入容器可以在本地bashrc里加个别名echo alias obdocker exec -it ob4 bash ~/.bashrc source ~/.bashrc以后直接输入ob就能进入容器了。3.2 初始化OceanBase集群在容器内执行obd cluster list如果看到已经有名为obcluster的集群在运行说明自动初始化成功了。如果没有可以手动初始化obd cluster deploy obcluster -c ./min-local-example.yaml obd cluster start obcluster初始化过程大概需要1-2分钟取决于你的磁盘速度。我遇到过初始化失败的情况大多是内存不足导致的这时候需要检查Docker的内存分配。3.3 连接数据库使用内置客户端工具连接obclient -h127.0.0.1 -P2881 -uroot -Doceanbase -A成功连接后会看到OceanBase的命令行提示符。这里有个注意事项社区版默认root密码为空生产环境一定要记得修改密码。第一次使用时我差点因为这个习惯性输入了密码结果反复报错后来才发现原来根本不需要密码。4. 实战操作与性能测试4.1 基础SQL操作先来个简单的建表测试CREATE TABLE test_table ( id INT PRIMARY KEY, name VARCHAR(50), create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 插入10万条测试数据 DELIMITER // BEGIN DECLARE i INT DEFAULT 0; WHILE i 100000 DO INSERT INTO test_table VALUES(i, CONCAT(name_,i), NOW()); SET i i 1; END WHILE; END // DELIMITER ;在我的笔记本上插入10万条数据大约耗时8秒性能相当不错。OceanBase的兼容性很好常规的MySQL语法都能支持。4.2 事务测试OceanBase的分布式事务能力是强项我们来测试下-- 创建账户表 CREATE TABLE accounts ( id INT PRIMARY KEY, name VARCHAR(50), balance DECIMAL(10,2) ); -- 初始化数据 INSERT INTO accounts VALUES(1, 张三, 1000.00); INSERT INTO accounts VALUES(2, 李四, 2000.00); -- 转账事务 START TRANSACTION; UPDATE accounts SET balance balance - 100 WHERE id 1; UPDATE accounts SET balance balance 100 WHERE id 2; COMMIT;OceanBase默认的隔离级别是读已提交READ COMMITTED可以通过参数调整。事务测试时我发现一个有趣的现象即使不显式开启事务单条DML语句也会自动包装成事务执行。4.3 性能监控OceanBase自带完善的监控系统在容器内可以这样查看# 查看资源使用情况 obd cluster display obcluster # 查看详细监控指标 curl http://localhost:8088/metrics/ob监控数据对性能调优特别有用。我曾经通过监控发现一个SQL查询没有走索引优化后性能提升了20倍。5. 常见问题排查5.1 内存不足问题这是最常见的问题症状包括容器频繁重启执行SQL报Memory limit exceeded错误obd cluster list显示集群状态异常解决方法给Docker分配更多内存至少10G调整OceanBase内存参数# 修改config.yaml中的memory_limit vim /root/.obd/cluster/obcluster/config.yaml obd cluster reload obcluster5.2 端口冲突如果2881端口被占用启动时会报错。可以改用其他端口docker run -tid --name ob4 -p 32881:2881 --memory 10G oceanbase/oceanbase-ce连接时记得指定新端口obclient -h127.0.0.1 -P32881 -uroot -Doceanbase -A5.3 数据持久化默认情况下容器停止后数据会丢失。要实现数据持久化需要挂载卷docker run -tid --name ob4 -v /path/to/data:/root/ob --memory 10G oceanbase/oceanbase-ce我曾经因为没挂载卷辛苦创建的测试数据全丢了这个教训一定要记住。6. 开发技巧与优化建议6.1 使用OBClient的技巧OceanBase自带的obclient有些实用功能-- 查看执行计划 EXPLAIN SELECT * FROM test_table WHERE id 100; -- 查看表结构 DESC test_table; -- 查看会话信息 SHOW PROCESSLIST;我特别喜欢它的执行计划展示比MySQL的EXPLAIN更直观。6.2 性能优化建议合理设计分区表对于大表分区能显著提升查询性能CREATE TABLE big_table ( id INT, create_time DATETIME ) PARTITION BY RANGE(TO_DAYS(create_time)) ( PARTITION p202301 VALUES LESS THAN (TO_DAYS(2023-02-01)), PARTITION p202302 VALUES LESS THAN (TO_DAYS(2023-03-01)) );利用OceanBase的并行查询-- 设置并行度 SET _FORCE_PARALLEL_DOP 4; SELECT /* PARALLEL(4) */ * FROM big_table WHERE create_time 2023-01-01;定期收集统计信息ANALYZE TABLE test_table;6.3 备份与恢复虽然开发环境数据不重要但养成备份习惯总是好的# 在容器内执行 obd cluster stop obcluster cd /root/ob tar -czvf /tmp/ob_backup.tar.gz data/ docker cp ob4:/tmp/ob_backup.tar.gz .恢复时反向操作即可。我每周五下班前都会备份一次已经救过我两次了。7. 进阶玩法自定义部署7.1 多节点集群部署虽然单机版已经能满足开发需求但OceanBase真正的威力在于分布式部署。我们可以用Docker Compose启动多节点集群version: 3 services: obnode1: image: oceanbase/oceanbase-ce mem_limit: 8g command: [ bash, -c, obd cluster start obcluster --nodesobnode1,obnode2,obnode3 ] networks: - obnet obnode2: image: oceanbase/oceanbase-ce mem_limit: 8g networks: - obnet obnode3: image: oceanbase/oceanbase-ce mem_limit: 8g networks: - obnet networks: obnet:这个配置需要根据实际情况调整特别是内存分配和节点数量。7.2 自定义配置文件OceanBase的配置非常灵活可以修改config.yaml来调整各种参数oceanbase-ce: global: memory_limit: 8G system_memory: 2G datafile_size: 20G log_disk_size: 10G修改后需要重新加载配置obd cluster edit-config obcluster obd cluster reload obcluster7.3 插件开发环境OceanBase支持自定义存储过程、函数和插件。在Docker环境中开发插件特别方便# 安装开发工具 yum install -y gcc-c make cmake # 编译示例插件 git clone https://github.com/oceanbase/oceanbase.git cd oceanbase/example_plugin mkdir build cd build cmake .. make编译好的插件可以直接加载到运行的OceanBase实例中测试。8. 实际开发中的经验分享在最近的一个项目中我用Docker部署的OceanBase作为开发数据库遇到几个值得分享的问题时区问题容器默认使用UTC时间导致应用显示的时间不对。解决方法是在启动容器时指定时区docker run -tid -e TZAsia/Shanghai --name ob4 --memory 10G oceanbase/oceanbase-ce字符集设置中文乱码是常见问题建议建库时显式指定字符集CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;连接池配置OceanBase对连接数有限制应用连接池不宜设置过大。我遇到过连接数耗尽的情况后来调整为# 应用连接池配置 spring.datasource.hikari.maximum-pool-size20批量插入优化OceanBase的批量插入性能极佳但要注意事务大小。实测10万条数据单次提交比分批提交慢3倍左右最佳批次大小在5000-10000条之间。索引选择OceanBase的优化器有时会选择非最优索引可以通过hint强制指定SELECT /* INDEX(test_table idx_name) */ * FROM test_table WHERE name LIKE 张%;这些经验都是踩过坑才总结出来的希望能帮你少走弯路。Docker部署的OceanBase虽然资源有限但已经能满足大部分开发测试需求最关键的是能快速重建环境这对需要频繁尝试新功能的开发阶段特别重要。

更多文章