OceanBase 实战指南:从零开始搭建分布式数据库集群
1. 为什么选择OceanBase分布式数据库第一次接触OceanBase是在2018年一个电商项目选型时当时我们需要一个能支撑千万级QPS的数据库解决方案。经过多轮测试对比OceanBase在性能和稳定性上的表现让我印象深刻。作为国产自研的分布式数据库它完美解决了传统单机数据库在扩展性方面的痛点。OceanBase最吸引我的几个核心优势金融级高可用基于Paxos协议的多副本机制确保单机故障时数据零丢失RPO0的特性特别适合对数据一致性要求严格的场景。去年我们一个核心系统迁移到OceanBase后再也没出现过因为硬件故障导致的服务中断。线性扩展能力通过添加普通服务器就能实现性能的线性增长我们测试过从3节点扩展到30节点TPS几乎呈直线上升这在传统数据库中是不可想象的。MySQL高度兼容90%以上的业务代码无需修改就能直接运行这对于已有MySQL系统的迁移非常友好。我们仅用两周就完成了老系统的平滑迁移。记得第一次在生产环境部署OceanBase时最让我惊讶的是它的压缩比。一个原本需要2TB存储的MySQL数据库迁移后只占用了不到500GB空间这得益于OceanBase独创的编码压缩技术。对于存储成本敏感的企业来说这能省下大量硬件开支。2. 环境准备与规划2.1 硬件资源规划在给某银行做POC测试时我们总结出一套实用的资源配置方案。对于学习环境最低配置可以是3台虚拟机CPU 4核/内存16GB/磁盘200GB千兆网络带宽但如果是生产环境建议物理服务器CPU 32核以上/内存128GB/SSD阵列万兆网络互联三副本部署至少需要3个可用区磁盘规划是个容易踩坑的地方。我们曾经因为redo日志空间不足导致集群异常后来采用这样的分配方案# 数据目录建议SSD /ob_data 1.2T # 日志目录高性能SSD /ob_redo 200G # 安装目录 /home/admin/oceanbase 500G2.2 操作系统配置在CentOS 7.9上的最佳实践包括时间同步是分布式系统的生命线sudo yum install -y ntp sudo systemctl enable ntpd sudo ntpdate ntp.aliyun.com内核参数优化能显著提升性能# 在/etc/sysctl.conf中添加 net.core.somaxconn 2048 vm.swappiness 0 kernel.core_pattern /ob_data/core-%e-%p-%t资源限制调整避免连接数瓶颈# /etc/security/limits.conf * soft nofile 655350 * hard nofile 655350 * soft nproc 655360注意所有节点必须保持配置一致否则可能导致集群异常3. 集群部署实战3.1 使用OBD自动化部署OceanBase社区版的obd工具让部署变得非常简单。最近在给一个客户部署时我们用了这个流程配置yum源sudo yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo安装必要组件sudo yum install -y ob-deploy oceanbase-ce-libs准备配置文件关键# distributed-with-obproxy-example.yaml oceanbase-ce: servers: - name: server1 ip: 192.168.1.101 - name: server2 ip: 192.168.1.102 - name: server3 ip: 192.168.1.103 global: memory_limit: 28G system_memory: 4G执行一键部署obd cluster autodeploy obtest -c distributed-with-obproxy-example.yaml部署完成后可以通过obd cluster list查看状态。第一次部署时我遇到了端口冲突问题后来发现是防火墙没关干净建议彻底禁用SELinuxsetenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config3.2 初始配置优化集群启动后的第一件事就是调整关键参数。这是我们经过多次压测得出的优化组合内存配置-- 系统保留内存 ALTER SYSTEM SET system_memory4G; -- 内存上限建议不超过物理内存的80% ALTER SYSTEM SET memory_limit28G;合并策略-- 提高合并速度 ALTER SYSTEM SET minor_merge_concurrency 32; -- 降低冻结触发阈值 ALTER SYSTEM SET freeze_trigger_percentage 50;连接管理-- 增大连接数限制 ALTER RESOURCE UNIT sys_unit_config MAX_SESSION_NUM 10000; -- 查询超时设置 SET GLOBAL ob_query_timeout 3600000000;4. 租户管理与业务对接4.1 多租户实践OceanBase的多租户设计非常精妙。我们通常这样规划资源创建资源单元CREATE RESOURCE UNIT business_unit MAX_CPU 8, MAX_MEMORY 32G, MAX_IOPS 10000, MAX_DISK_SIZE 100G;建立资源池CREATE RESOURCE POOL business_pool UNITbusiness_unit, UNIT_NUM1, ZONE_LIST(zone1,zone2,zone3);创建业务租户CREATE TENANT business RESOURCE_POOL_LIST(business_pool), PRIMARY_ZONEzone1;zone2,zone3;经验分享生产环境一定要设置primary_zone的优先级比如zone1;zone2,zone3表示优先选择zone14.2 MySQL兼容性实践OceanBase与MySQL的兼容性相当好但有些细节需要注意连接方式# 使用MySQL客户端连接 mysql -h192.168.1.101 -P2883 -urootbusiness -p特殊语法处理-- OceanBase需要显式指定排序规则 CREATE TABLE users ( id BIGINT PRIMARY KEY, name VARCHAR(100) COLLATE utf8mb4_general_ci ) DEFAULT CHARSETutf8mb4;事务隔离级别-- 建议使用READ COMMITTED SET GLOBAL tx_isolationREAD-COMMITTED;曾经有个项目因为大量使用MySQL的GROUP_CONCAT函数导致性能问题后来我们重写了这部分SQL。建议迁移前用obdumper工具做全面的语法检查。5. 常见问题排查指南5.1 部署问题问题1OBD部署卡在Check before install检查所有节点间的网络连通性确认时钟同步误差在50ms内验证磁盘空间是否充足问题2observer进程频繁重启检查/var/log/oceanbase/observer.log常见原因是内存不足适当调低memory_limit5.2 性能问题慢查询分析-- 查看最近慢查询 SELECT * FROM gv$sql_audit WHERE elapsed_time 1000000 ORDER BY elapsed_time DESC LIMIT 10;锁等待排查-- 查看当前锁等待 SELECT * FROM gv$lock_wait_stat;上周处理过一个典型案例某个批量导入作业耗时异常。通过分析发现是memstore_limit设置过低导致频繁转储调整后性能提升了8倍ALTER SYSTEM SET memstore_limit_percentage 80;6. 生产环境最佳实践经过多个项目的积累我们总结出这些经验监控体系部署OCP监控平台配置PrometheusGranfa监控关键指标设置内存使用率、合并耗时等告警阈值备份策略-- 定期数据备份 ALTER SYSTEM ARCHIVELOG; -- 设置备份路径 ALTER SYSTEM SET data_backup_destfile:///ob_backup;版本升级先在测试环境验证采用滚动升级方式准备回滚方案最近帮一个客户从2.2版本升级到4.0整个过程持续了3小时期间业务完全无感知。OceanBase的在线升级能力确实令人惊艳。对于刚接触OceanBase的团队建议从小规模测试环境开始逐步熟悉其特性和管理方式。我们在2019年第一次上线OceanBase时花了两个月做性能调优和故障演练这个投入在后来的生产运行中得到了十倍回报。分布式数据库的管理思维与传统数据库有很大不同需要特别注意分布式事务、数据分片等概念的理解。