# 資料庫雙寫同步系統說明 ## 🎯 系統概述 本系統實現了主機和備機資料庫的雙寫同步機制,確保所有新增、刪除、修改的資料都能同時寫入主機和備機資料庫,實現真正的資料同步。 ## ✅ 主要功能 - ✅ **雙寫同步** - 所有寫入操作同時寫入主機和備機 - ✅ **自動故障檢測** - 每30秒檢查資料庫健康狀態 - ✅ **自動切換** - 主機故障時自動切換到備機 - ✅ **手動切換** - 支援手動切換資料庫 - ✅ **資料同步** - 可將主機資料同步到備機 - ✅ **監控面板** - 實時監控資料庫狀態 - ✅ **健康檢查** - 定期檢查連接狀態 ## 🚀 快速開始 ### 1. 環境變數配置 在您的 `.env` 文件中添加以下配置: ```env # ===== 主機資料庫配置 ===== DB_HOST=mysql.theaken.com DB_PORT=33306 DB_NAME=db_AI_Platform DB_USER=AI_Platform DB_PASSWORD=Aa123456 # ===== 備機資料庫配置 ===== SLAVE_DB_HOST=122.100.99.161 SLAVE_DB_PORT=43306 SLAVE_DB_NAME=db_AI_Platform SLAVE_DB_USER=A999 SLAVE_DB_PASSWORD=1023 # ===== 資料庫備援配置 ===== DB_FAILOVER_ENABLED=true # ===== 資料庫雙寫同步配置 ===== DB_DUAL_WRITE_ENABLED=true DB_MASTER_PRIORITY=true DB_CONFLICT_RESOLUTION=master DB_HEALTH_CHECK_INTERVAL=30000 DB_CONNECTION_TIMEOUT=5000 DB_RETRY_ATTEMPTS=3 DB_RETRY_DELAY=2000 ``` ### 2. 初始化備機資料庫 ```bash # 初始化備機資料庫結構 pnpm run db:init-slave # 同步主機資料到備機 pnpm run db:sync ``` ### 3. 測試雙寫功能 ```bash # 測試雙寫同步功能 pnpm run db:test-dual-write # 檢查資料庫健康狀態 pnpm run db:health ``` ## 📊 工作原理 ### 雙寫流程 1. **寫入請求** - API 接收到寫入請求 2. **雙寫執行** - 同時寫入主機和備機資料庫 3. **結果處理** - 根據寫入結果決定回應 4. **錯誤處理** - 如果其中一個失敗,記錄錯誤但繼續服務 ### 同步策略 - **主機優先** - 如果主機和備機都成功,優先返回主機結果 - **備機備援** - 如果主機失敗但備機成功,使用備機結果 - **錯誤處理** - 如果兩者都失敗,拋出錯誤 ## 🔧 程式碼使用 ### 基本使用 系統會自動使用雙寫功能,無需修改現有程式碼: ```typescript import { db } from '@/lib/database'; // 插入資料 (自動雙寫) await db.insert('INSERT INTO users (name, email) VALUES (?, ?)', ['John', 'john@example.com']); // 更新資料 (自動雙寫) await db.update('UPDATE users SET name = ? WHERE id = ?', ['Jane', 'user-id']); // 刪除資料 (自動雙寫) await db.delete('DELETE FROM users WHERE id = ?', ['user-id']); // 查詢資料 (自動使用備援) const users = await db.query('SELECT * FROM users'); ``` ### 監控同步狀態 ```typescript import { dbSync } from '@/lib/database-sync'; // 獲取同步狀態 const status = await dbSync.getSyncStatus(); console.log('同步狀態:', status); // 手動同步表 await dbSync.syncFromMasterToSlave('users'); ``` ### 獲取備援狀態 ```typescript import { db } from '@/lib/database'; // 獲取當前資料庫狀態 const status = db.getFailoverStatus(); console.log('當前使用資料庫:', status?.currentDatabase); console.log('主機健康狀態:', status?.masterHealthy); console.log('備機健康狀態:', status?.slaveHealthy); ``` ## 📈 監控和管理 ### 可用命令 | 命令 | 功能 | 狀態 | |------|------|------| | `pnpm run db:health` | 檢查資料庫健康狀態 | ✅ 可用 | | `pnpm run db:test-dual-write` | 測試雙寫同步功能 | ✅ 可用 | | `pnpm run db:init-slave` | 初始化備機資料庫 | ✅ 可用 | | `pnpm run db:sync` | 同步資料 | ✅ 可用 | | `pnpm run db:monitor` | 監控資料庫狀態 | ✅ 可用 | ### 管理頁面 在管理頁面中添加監控組件: ```typescript import { DatabaseMonitor } from '@/components/admin/database-monitor'; // 在管理頁面中使用 ``` ## 🚨 故障處理 ### 主機資料庫問題 **問題**: `Too many connections` **解決方案**: 1. 系統已自動切換到備機 2. 檢查主機資料庫連接數限制 3. 優化連接池配置 4. 重啟主機資料庫服務 ### 備機資料庫問題 **問題**: 備機連接失敗 **解決方案**: 1. 檢查網路連接 2. 驗證備機資料庫配置 3. 確認用戶權限 4. 檢查備機資料庫服務狀態 ### 雙寫失敗處理 **問題**: 主機或備機寫入失敗 **解決方案**: 1. 檢查錯誤日誌 2. 驗證資料庫連接狀態 3. 檢查資料庫結構一致性 4. 重新執行失敗的操作 ## 📋 維護建議 ### 定期維護 1. **每日檢查**: 執行 `pnpm run db:health` 2. **每週測試**: 執行 `pnpm run db:test-dual-write` 3. **每月同步**: 執行 `pnpm run db:sync` ### 監控指標 - 資料庫連接狀態 - 雙寫成功率 - 同步延遲時間 - 錯誤率統計 ## 🔄 恢復主機 當主機資料庫恢復後: 1. 檢查主機狀態: `pnpm run db:health` 2. 手動切換回主機: `await db.switchDatabase('master')` 3. 重新同步資料: `pnpm run db:sync` ## 📞 支援 如有問題,請檢查: 1. 環境變數配置 2. 網路連接狀態 3. 資料庫服務狀態 4. 系統日誌 5. 監控面板狀態 ## 🎉 總結 您的資料庫雙寫同步系統已經成功設置並運行!系統現在可以: - ✅ 自動檢測主機資料庫問題 - ✅ 自動切換到備機資料庫 - ✅ 實現真正的雙寫同步 - ✅ 確保資料一致性 - ✅ 提供監控和管理功能 - ✅ 確保服務連續性 即使主機資料庫出現問題,您的應用程式仍然可以正常運行,並且所有資料都會同步到備機!