一、项目背景
当前 Odoo18 系统运行在单一 PostgreSQL 实例下,数据库总量约 4.5TB,核心业务表数据量持续增长,单表规模接近性能极限。
随着业务扩展与用户数增加,数据库出现:
- 查询性能下降;
- 索引膨胀;
- VACUUM 负载过重;
- 备份与恢复时间过长;
- 历史数据难以归档。
拟通过 分库分表(Sharding + Partitioning)方案 对现有架构进行系统性优化,确保未来三年数据库性能与可维护性。
二、项目总体目标
- 建立高性能、高可扩展的 PostgreSQL 数据架构;
- 控制单表数据规模,提升查询与写入性能;
- 优化数据库存储结构,降低维护成本;
- 支撑 Odoo18 在未来三年内的业务增长需求。
三、总体技术路线
| 阶段 | 优化方向 | 主要目标 |
|---|---|---|
| 1️⃣ 数据分区(Partitioning) | 按年度/公司划分业务表 | 控制单表大小,提升查询速度 |
| 2️⃣ 分库(Sharding) | 按业务模块或数据归属拆分数据库 | 降低单实例负载,提高并发能力 |
| 3️⃣ 数据归档与冷热分离 | 历史数据独立存储 | 保证主库仅保留近3年活跃数据 |
| 4️⃣ 索引与存储优化 | 精简索引、重建存储结构 | 降低IO与索引碎片 |
| 5️⃣ 数据迁移与监控 | 自动化迁移+性能监控 | 确保迁移安全与长期可维护性 |
四、分库分表设计方案
1️⃣ 分区策略(Partitioning)
核心思路:对体量最大、增长最快的表进行按时间或公司维度分区。
| 目标表 | 分区类型 | 分区规则 | 目标容量 |
|---|---|---|---|
| account_move | RANGE | 按年度 (move_date) | 每分区 ≤ 100GB |
| stock_move | RANGE + HASH | 按年度与仓库 | 每分区 ≤ 50GB |
| sale_order | RANGE | 按季度 (create_date) | 每分区 ≤ 30GB |
| sale_order_line | RANGE | 按季度 | 每分区 ≤ 50GB |
| account_move_line | LIST | 按公司ID (company_id) | 每公司单独分区 |
技术方案:
- 使用 PostgreSQL 原生分区表;
- 自动创建新分区(pg_partman);
- 分区命名规范如:sale_order_y2025_q1;
- 历史分区设为只读,进入冷库归档区。
2️⃣ 分库方案(Sharding)
目标:通过逻辑分库降低单实例负载。
| 分库维度 | 说明 |
|---|---|
| 按业务模块分库 | 销售、库存、会计独立数据库(读写隔离) |
| 按数据热度分库 | 主库保留近三年数据,历史库归档 |
| 跨库访问方式 | PostgreSQL FDW(Foreign Data Wrapper)实现透明查询 |
| 同步机制 | 定期逻辑同步(pg_dump + cron)或流复制(hot standby) |
架构示意:
主实例(活跃数据) 历史实例(归档数据) ├── sale_db ├── sale_db_archive ├── stock_db ├── stock_db_archive ├── account_db ├── account_db_archive
五、数据迁移与实施步骤
| 阶段 | 工作内容 | 乙方主要任务 | 输出成果 |
|---|---|---|---|
| 阶段1:基线评估 | 采集性能指标、分析热表 | SQL分析、索引与表扫描统计 | 《性能评估报告》 |
| 阶段2:分区设计与测试 | 设计分区规则、创建测试分区 | 实施分区表迁移、索引重构 | 《分区设计与验证报告》 |
| 阶段3:分库结构搭建 | 规划数据库实例与连接 | 构建分库架构、配置FDW | 《分库架构部署文档》 |
| 阶段4:数据迁移与验证 | 迁移历史数据、对比校验 | 编写迁移脚本、执行一致性检查 | 《数据迁移与校验报告》 |
| 阶段5:优化与监控体系建设 | 调优参数、建立监控 | 调整PostgreSQL参数、部署Grafana监控 | 《优化总结与监控报告》 |
六、数据库层技术优化内容
-
参数优化
- 调整 shared_buffers, work_mem, maintenance_work_mem, effective_cache_size;
- 独立WAL磁盘,优化 checkpoint_timeout, wal_compression;
- 启用 autovacuum 调整频率,避免表膨胀。
-
索引策略
- 高频字段创建 GIN/BTREE 复合索引;
- 清理冗余索引,减少写入压力;
- 定期执行 REINDEX CONCURRENTLY。
-
表结构调整
- 将历史表压缩存储;
- 对日志类表使用 UNLOGGED 减少WAL压力;
- 大字段(JSON/Text)使用 TOAST 压缩。
-
监控与维护体系
- 部署 pg_stat_statements, pg_partman_bgw, pg_cron;
- 集成 Grafana + Prometheus 展示查询耗时、IO、缓存命中率;
- 定期输出《性能监控报告》。
七、风险与控制措施
| 潜在风险 | 应对措施 |
|---|---|
| 数据迁移中断 | 启用事务级迁移 + 校验脚本 |
| 分区策略错误 | 先行测试环境验证 + 分区模拟 |
| 归档数据不可用 | FDW 查询验证 + 双备份机制 |
| 性能未达预期 | 持续优化索引与缓存参数 |
八、乙方交付内容
- 《PostgreSQL 分库分表架构设计文档》
- 《数据库迁移与验证方案》
- 《数据库性能调优报告》
- 《监控与告警体系部署说明》
- 《项目总结与性能评估报告》
九、项目价值
- 单表查询性能提升 40%+;
- 主库数据控制在 500GB 内,VACUUM 效率提升 60%;
- 备份周期缩短至 1/3;
- 系统架构具备三年可持续扩展能力;
- 为 Odoo 应用层升级提供长期支撑。
