一、專案背景
目前的 Odoo18 系統運行於單一 PostgreSQL 執行個體上,總資料庫大小約為 4.5TB。核心業務資料表的資料量持續成長,且個別資料表的大小正逼近效能極限。
隨著業務擴展與使用者數量增加,資料庫會面臨:
- 查詢效能下降;
- 索引膨脹;
- VACUUM overload;
- 備份與復原時間過長;
- 歷史資料難以歸檔。
計劃透過分片 + 分區解決方案系統性地最佳化現有架構,以確保未來三年的資料庫效能與可維護性。
II. 整體計畫目標
- 建立高效能、高可擴展性的 PostgreSQL 資料架構;
- 控制單一資料表的資料量,以提升查詢與寫入效能;
- 優化資料庫儲存結構以降低維護成本;
- 支援 Odoo18 未來三年的業務成長需求。
III. 整體技術方法
| 階段 | 最佳化方向 | 主要目標 |
|---|---|---|
| 1️⃣ 資料分割 | 按年度/公司劃分的業務表 | 控制單一資料表大小以提升查詢速度 |
| 2️⃣ 資料庫分片 | 依業務模組或資料擁有權拆分資料庫 | 降低單一執行個體負載並提升並行能力 |
| 3️⃣ 資料歸檔與冷熱分離 | 歷史資料獨立儲存 | 確保主資料庫僅保留過去 3 年的活躍資料 |
| 4️⃣ 索引與儲存最佳化 | 簡化索引並重建儲存結構 | 減少 IO 與索引片段化 |
| 5️⃣ 資料遷移與監控 | 自動化遷移 + 效能監控 | 確保遷移安全與長期可維護性 |
4. 分片與分割設計方案
1️⃣ 分割策略
核心概念:依時間或公司維度對最大且成長最快的資料表進行分割。
| 目標資料表 | 分割區類型 | 分割規則 | 目標容量 |
|---|---|---|---|
| 會計分錄 | 範圍 | 依年份 (move_date) | 每個分割區 ≤ 100GB |
| 庫存移動 | 範圍 + 雜湊 | 依年份與倉庫 | 每個分割區 ≤ 50GB |
| 銷售訂單 | 範圍 | 按季度 (create_date) | 每個分割區 ≤ 30GB |
| 銷售訂單明細 | 範圍 | 按季度 | 每個分割區 ≤ 50GB |
| 會計分錄明細 | 清單 | 依公司 ID (company_id) | 每家公司都有自己獨立的分割區 |
技術解決方案:
- 使用 PostgreSQL 原生分割表;
- 自動建立新的分割區 (pg_partman);
- 分割區命名慣例:sale_order_y2025_q1;
- 歷史分割區會設定為唯讀,並進入冷儲存歸檔區域。
2️⃣ 分片方案
目標:透過邏輯資料庫分片降低單一執行個體負載。
| 分片維度 | 說明 |
|---|---|
| 依業務模組分隔資料庫 | 銷售、庫存與會計獨立資料庫(讀寫隔離) |
| 依資料熱度分片 | 主要資料庫保留過去三年的資料,而歷史資料庫則將其封存。 |
| 跨資料庫存取方法 | PostgreSQL FDW(外部資料包裝器)實作透明查詢 |
| 同步機制 | 定期邏輯同步(pg_dump + cron)或串流複寫(熱待命) |
架構圖:
主要執行個體 (作用中資料) 歷史執行個體 (封存資料) ├── sale_db ├── sale_db_archive ├── stock_db ├── stock_db_archive ├── account_db ├── account_db_archive
5. 資料移轉與實作步驟
| 階段 | 工作職責 | 乙方的主要任務 | 輸出結果 |
|---|---|---|---|
| 階段 1:基線評估 | 收集效能指標,分析熱度圖 | SQL 分析、索引與資料表掃描統計 | 績效評估報告 |
| 第二階段:分割設計與測試 | 設計分割規則,建立測試分割區 | 實作分割資料表移轉與索引重建 | 分區設計與驗證報告 |
| 階段三:資料庫分片結構設定 | 規劃資料庫執行個體與連線 | 建立子資料庫架構,設定 FDW | 分庫架構部署文件 |
| 第 4 階段:資料移轉與驗證 | 遷移歷史資料、比較並驗證 | 撰寫遷移指令碼,執行一致性檢查 | 資料移轉與驗證報告 |
| 第 5 階段:優化與監控系統建置 | 調整參數,建立監控 | 調整 PostgreSQL 參數,部署 Grafana 監控 | 最佳化摘要與監控報告 |
6. 資料庫層技術最佳化內容
-
參數最佳化
- 調整 shared_buffers、work_mem、maintenance_work_mem、effective_cache_size;
- 獨立 WAL 磁碟、最佳化 checkpoint_timeout、wal_compression;
- 啟用 autovacuum 以調整頻率並避免資料表膨脹。
-
指數策略
- 為高頻欄位建立 GIN/BTREE 複合索引;
- 清理多餘的索引以降低寫入壓力;
- 定期執行 REINDEX CONCURRENTLY。
-
資料表結構調整
- 壓縮並儲存歷史資料表;
- 對日誌類型的資料表使用 UNLOGGED,以減少 WAL 壓力;
- 大型欄位(JSON/文字)使用 TOAST 壓縮。
-
監控與維護系統
- 部署 pg_stat_statements、pg_partman_bgw、pg_cron;
- 整合 Grafana + Prometheus 以顯示查詢時間、IO 與快取命中率;
- 定期輸出「效能監控報告」。
7. 風險與控制措施
| 潛在風險 | 應對措施 |
|---|---|
| 資料移轉已中斷 | 啟用交易層級遷移 + 驗證指令碼 |
| 分割策略錯誤 | 測試前環境驗證 + 分割區模擬 |
| 封存資料無法使用 | FDW 查詢驗證 + 雙重備份機制 |
| 表現未達預期 | 持續最佳化索引與快取參數 |
8. 乙方交付的內容
- PostgreSQL 分片架構設計文件
- 資料庫移轉與驗證計畫
- 資料庫效能調校報告
- 監控與警示系統部署指南
- 專案摘要與績效評估報告
9. 專案價值
- 單表查詢效能提升 40%+;
- 主資料庫資料量控制在 500GB 以內,VACUUM 效率提升 60%;
- 備份週期縮短至 1/3;
- 系統架構具備在三年內持續擴充的能力;
- 為 Odoo 應用層升級提供長期支援。
